下面的函数接受一个单词并检查该单词是否在公共变量数组中维护的单词列表中。调用sub将字符串数组的元素传递给此函数
Function IsNormalCap(Mywrds As String) As Boolean
If Right(Mywrds, 1) = "." Then Mywrds = Left(Mywrds, Len(Mywrds) - 1)
i = 0
Do While i < UBound(CapsType) + 1
If (Mywrds <> CapsType(i)) Then
i = i + 1
Else
Exit Do
End If
Loop
If i = UBound(CapsType) + 1 Then
IsNormalCap = False
Else
IsNormalCap = True
End If
End Function
来自调用子代码的相关行:
Dim buff() As String
....
If (Not (IsNormalCap(buff(i + 1)))) Then
....code.....
End if
问题:
buff(i + 1)似乎作为ByRef传递,因为buff(i + 1)的值在调用函数后发生了变化。最后包含句点的单词将返回到sub,而句点不会结束。为什么会这样?需要一些清晰度,因为有几个这样的函数传递这样的参数,我似乎不知道何时传递ByRef的值,当意图将它作为ByVal传递时(反之亦然)。提前致谢。如果我足够清楚,请告诉我。
答案 0 :(得分:3)
在函数声明中,指定为ByRef
或ByVal
的参数默认为ByRef
从VBA帮助中提取
ByVal可选。表示参数是按值传递的 ByRef可选。指示参数是通过引用传递的.ByRef是Visual Basic中的默认值。
因此,如果您总是想要ByVal
,请指定
Function IsNormalCap(ByVal Mywrds As String) As Boolean
另一方面,如果您有时需要ByRef
而其他时间ByVal
,则可以通过附上参数来覆盖 ByRef
在函数调用中在()
例如,如果函数定义为
Function IsNormalCap(ByRef Mywrds As String) As Boolean
或
Function IsNormalCap(Mywrds As String) As Boolean
然后
If Not IsNormalCap((buff(i + 1))) Then
将按值buff(i + 1)
传递
注意,我已从代码中删除了一些冗余的()
以帮助明确。