在函数返回到调用sub后,传递给函数的参数值会发生变化

时间:2014-04-27 04:44:16

标签: excel-vba vba excel

下面的函数接受一个单词并检查该单词是否在公共变量数组中维护的单词列表中。调用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传递时(反之亦然)。提前致谢。如果我足够清楚,请告诉我。

1 个答案:

答案 0 :(得分:3)

在函数声明中,指定为ByRefByVal的参数默认为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)传递

注意,我已从代码中删除了一些冗余的()以帮助明确。