簡體   English   中英

VBA多參數函數調用語法錯誤

[英]VBA multi-parameter function call Syntax Error

我正在嘗試在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多年來已經相同--JavaScriptPerl也有各自的問題就像每一種編程語言一樣

當括號分隔參數列表時 ,VBE會在調用函數之后立即放置左括號:

foo = MsgBox("test")
           ^^^

當括號被解釋為第一個參數的一部分(即帶括號的表達式 )時,VBE在調用的過程和其參數列表之間放置一個空格:

MsgBox ("test")
     ^^^

此代碼無法編譯:

MsgBox ("test", vbInformation)
     ^^^

因為整個帶括號的表達式是第一個參數 ,並且沒有辦法("test", vbInformation)可以被評估為值 - 這是一個語法錯誤,就像在OP中一樣。

如果表達式可以作為值計算,則該值將按ByVal傳遞, 而不管調用過程的簽名是否將該參數指定為ByRef - 請參閱5.3.1.11過程調用參數處理運行時語義

  • 如果參數沒有映射到它的參數,參數是ByVal, 或者參數是ByRef,並且映射的參數的表達式被分類為值 ,函數,屬性或未綁定成員,則在過程中使用過程范圍定義局部變量使用相同的名稱值和聲明的類型作為參數[...]調用

正如其他人總結的那樣,解決方案是在進行過程調用時刪除括號:

MsgBox "test", vbInformation

...或者始終如一地使用過時的顯式調用語法

Call MsgBox("test", vbInformation)

只有在進行函數調用時 (即將返回值捕獲到局部變量中時)才需要括號:

Dim result As vbMsgBoxResult
result = MsgBox("test", vbInformation Or vbOkCancel)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM