VBA多参数函数调用语法错误

| 我正在尝试在Excel VBA(2007)中调用一个函数,并且在调用中收到语法错误。我有一个称为ImportSets的数据结构数组,其中包含工作表和字符串,并且正在尝试将该数组中的项目成员传递给一个名为Import的函数。 调用代码如下所示:
For n = 1 To 7  
    Debug.Print (\"Destsheet: \" & ImportSets(n).DestSheet.name)  
    Debug.Print (\"Sourcesheet: \" & ImportSets(n).SourceSheet.name)  
    Debug.Print (\"Sourcecolumn: \" & ImportSets(n).SourceColumn)  
    Import(CostAnalysisWorksheet.Sheets(\"Reimbursements\"), ImportSets(n).DestSheet, ImportSets(n).SourceSheet, ImportSets(n).SourceColumn)  
Next n  
所有Debug.Print语句均返回有意义且正确的字符串,并检查是否存在\“ Reimbursements \”返回true。方法调用在一行上。这是ImportSet对象代码:
Public Type ImportSet
    DestSheet As Worksheet
    SourceSheet As Worksheet
    SourceColumn As String
    ...other code...
End Type
函数主体如下所示:
Function Import(ByRef ReimbursementSheet As Worksheet, ByRef DestSheet As Worksheet, ByRef ImportSheet As Worksheet, ByRef ImportSheetPriceColumn As String) As String  
    ....code here .....  
End Function
我在函数调用(在第一个代码段中)上出现了红色突出显示的语法错误。我可能想念一些愚蠢的东西。它是什么?     
已邀请:
我没有在Excel 2007中使用VBA,但较旧的版本仅在将返回值分配给变量时才允许在函数调用参数前后加上方括号。尝试这个:
Import CostAnalysisWorksheet.Sheets(\"Reimbursements\"), ImportSets(n).DestSheet, ImportSets(n).SourceSheet, ImportSets(n).SourceColumn
    
重要的一点是您希望函数如何返回值以及传递的变量ByVal还是ByRef。 ByRef允许函数更改变量ByVal意味着函数无法更改变量。 这两个示例在本质上是做相同的事情,但要注意操作变量ByRef并从函数返回变量时的微妙之处。
Sub test()
Dim lngX As Long, lngY As Long, Product As Long

   lngY = 10
   lngX = 5
   Product = multiply(lngX, lngY)
   MsgBox (Product)
End Sub

Function multiply(ByVal lngX As Long, ByVal lngY As Long) As Long
   multiply = lngY * lngX
End Function
或传递变量ByRef并使用该函数进行操作
Sub test()
Dim lngX As Long, lngY As Long, Product As Long

   lngY = 10
   lngX = 5
   Product = 0
   multiply lngX, lngY, Product
   MsgBox (Product)

End Sub

Function multiply(ByVal lngX As Long, ByVal lngY As Long, ByRef Product As Long)
  Product = lngY * lngX
End Function
这个例子很简单,但是通常需要将对象,数组等传递给函数来处理ByRef,而不是提供答案ByVal     
该问答被用作重复的目标,但是没有一个答案能说明整个故事。 首先,此行为与Excel版本或主机应用程序无关:它只是标准的VBA语法,并且规则在20多年来一直是相同的-JavaScript和Perl各自具有同样,每一种编程语言也一样。 当括号定界参数列表时,VBE会在调用的函数之后紧跟着左括号:
foo = MsgBox(\"test\")
           ^^^
当括号被解释为第一个参数(即带括号的表达式)的一部分时,VBE在调用的过程及其参数列表之间放置一个空格:
MsgBox (\"test\")
     ^^^
该代码无法编译:
MsgBox (\"test\", vbInformation)
     ^^^
因为整个括号表达式是第一个参数,所以无法将ѭ9视为一个值-这是语法错误,例如在OP中。 如果可以将表达式评估为值,则无论值是由值(ѭ10passed)传递的,无论被调用过程的签名将该参数指定为
ByRef
-参见5.3.1.11过程调用参数处理,运行时语义:      如果参数没有映射到其参数,参数是ByVal或参数是ByRef且映射的参数的表达式被分类为值,函数,属性或未绑定成员,则在过程范围内使用过程范围定义局部变量以与参数[...]相同的名称值和声明的类型调用    正如其他人总结的那样,解决方案是在进行过程调用时删除括号:
MsgBox \"test\", vbInformation
...或始终使用过时的显式调用语法:
Call MsgBox(\"test\", vbInformation)
仅在进行函数调用时(即,将返回值捕获到局部变量中时)才需要括号:
Dim result As vbMsgBoxResult
result = MsgBox(\"test\", vbInformation Or vbOkCancel)
    

要回复问题请先登录注册