String VBA访问参数传递值

String VBA访问参数传递值,string,ms-access,vba,String,Ms Access,Vba,访问2013 我正在调用一个公式来修改字符串,它正在更改父子元素中的值 例如: Debug.Print Str 'Hello World my name is bob BOBexists = InStringChceck(Str,"bob") Debug.Print Str 'HELLO WORLD MY NAME IS BOB Debug.Print BOBexists 'TRUE 我以前在Excel VBA中使用过这个函数InStringCheck(这只是一个例子,我所有的字符串工具现在都

访问2013

我正在调用一个公式来修改字符串,它正在更改父子元素中的值

例如:

Debug.Print Str 'Hello World my name is bob
BOBexists = InStringChceck(Str,"bob")
Debug.Print Str 'HELLO WORLD MY NAME IS BOB
Debug.Print BOBexists 'TRUE
我以前在Excel VBA中使用过这个函数InStringCheck(这只是一个例子,我所有的字符串工具现在都在做同样的事情,我不知道为什么)


在我的几个函数中,我操作输入变量,以获得解决方案,但我不希望这些操作在函数之外持续,除非我将它们传递回备份—有些操作是如何传递的,但它们不是作为公共变量来处理的

VBA参数是通过引用隐式传递的(
ByRef
)。这意味着您传递的是对值的引用,而不是值本身:在过程中对该值进行变异将导致该变异值对调用代码可见

这通常用作从函数/过程返回多个值的技巧:

Public Sub DoSomething(ByVal inValue1 As Integer, ByRef outResult1 As Integer, ...)
您有两个选择:

  • 按值传递参数(
    ByVal
  • 引入局部变量并对其进行变异,而不是对参数进行变异(请明确地传递参数
    ByRef

如果项目中隐式传递了大量参数
ByRef
,则在任何地方修复这些参数都很容易变得单调乏味。使用该工具,您可以轻松找到所有出现的参数,在其中导航,并应用适当的修复:

免责声明:我大量参与了Rubberduck项目


基于@Sorcer的答案,VBA有默认的子/函数参数“按引用”传递(即:如果未指定,则假定为“ByRef”关键字),因此如果您不希望它们的“内部”修改在外部继续存在,则必须在参数列表中显式地在它们之前键入“ByVal”关键字

但是,您可以选择使用
StrComp()
,避免此类修改同时发生:


这也可能导致您避免使用
InStringCheck()
,而是在代码中直接使用
StrComp()

在InStringCheck的参数声明中使用ByVal关键字(ByVal短语作为字符串,ByVal术语作为字符串),如果instr(1,短语,术语),您可以更改
然后InStringCheck=True,否则InStringCheck=False
to
InStringCheck=InStr(1,短语,术语)
。永远不要基于布尔条件返回
True
False
。根据定义,它已经是
True
False
。只需返回布尔条件本身。您不必询问它并返回另一个布尔值。另一方面注意:除非您在调用或中指定
vbBinaryCompare
e> 选项Compare,
InStr()
不区分大小写。因此不需要
UCase
。相关:
Public Sub DoSomething(ByVal inValue1 As Integer, ByRef outResult1 As Integer, ...)
Function InStringCheck(Phrase as string, Term as string) as Boolean
    InStringCheck = StrComp(Phrase, Term, vbTextCompare) = 0
End Function