访问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
在我的几个函数中,我操纵输入变量,以得到一个解决方案,但我不希望这些操作在函数之外持续存在,除非我将它们重新传递 - 有些如何被传递,但他们 没有被视为公共变量
答案 0 :(得分:4)
VBA参数通过引用(ByRef
)隐式传递。这意味着您将引用传递给值,而不是值本身:在过程中改变该值将导致调用的值对调用代码可见。
这通常用作从函数/过程返回多个值的技巧:
Public Sub DoSomething(ByVal inValue1 As Integer, ByRef outResult1 As Integer, ...)
您有两种选择:
ByVal
)ByRef
)如果在项目中隐式传递ByRef
的参数很多,那么在任何地方修复它们都会很容易变得乏味。使用Rubberduck,您可以轻松找到所有匹配项,在那里导航并应用适当的修补程序:
免责声明:我参与了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()