VBA访问参数传递值

时间:2016-06-30 15:24:39

标签: string vba ms-access 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(它只是一个例子,我的所有字符串工具现在都在做同样的事情,我不知道为什么)

Function InStringCheck(Phrase as string, Term as string) as Boolean
    Phrase = UCase(Phrase)
    Term = UCase(Term)
    if instr(1, Phrase, Term) then InStringCheck = True else InStringCheck = False
end function

在我的几个函数中,我操纵输入变量,以得到一个解决方案,但我不希望这些操作在函数之外持续存在,除非我将它们重新传递 - 有些如何被传递,但他们 没有被视为公共变量

2 个答案:

答案 0 :(得分:4)

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

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

Public Sub DoSomething(ByVal inValue1 As Integer, ByRef outResult1 As Integer, ...)

您有两种选择:

  • 按值(ByVal
  • 传递参​​数
  • 引入局部变量并改变它们而不是改变参数(并且,明确地传递参数ByRef

如果在项目中隐式传递ByRef的参数很多,那么在任何地方修复它们都会很容易变得乏味。使用Rubberduck,您可以轻松找到所有匹配项,在那里导航并应用适当的修补程序:

Rubberduck inspection results

  

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

答案 1 :(得分:2)

在@ Sorcer的答案上建立一点,VBA默认的子/函数参数通过“引用”传递(即:如果没有指定则假定为“ByRef”关键字),这样如果你不希望他们的“内部”修改在外面存在他们必须在参数列表中显式地键入“ByVal”关键字。

但您可以选择使用StrComp()来避免此类修改:

Function InStringCheck(Phrase as string, Term as string) as Boolean
    InStringCheck = StrComp(Phrase, Term, vbTextCompare) = 0
End Function

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