2012-12-13 50 views
2

我想讓我的VBA子程序運行一個函數來創建一個數組,然後將該數組傳遞給另一個進一步處理這些函數的函數數組項目。我做了一個非常簡單並且功能與我的實際代碼完全一樣的例子。它如下:如何讓VBA子程序調用一個函數將子程序中的數組傳遞給另一個函數

Sub SubRoutine() 
ProcessArray CreateArray 
End Sub 
Function ProcessArray(Arr() As Variant) As Variant 
End Function 
Function CreateArray() As Variant 
Dim Array1(1 To 4) As Variant 
CreateArray = Array1 
End Function 

這只是兩個函數和調用這兩個函數的子例程。編譯器拒絕編譯我的代碼,並解釋給我說:

編譯錯誤:

類型不匹配:數組或用戶定義類型預期

對此我只能說,一切都是相同的數據類型和傳遞的參數確實是一個數組。以防萬一你想知道,是的,我已經嘗試了一個有數據分配給它的數組。

我知道這是微妙的我在VBA語法中缺少,但我沒有看到這樣的例子。任何有識之士將不勝感激。

回答

3

改變這一行:
Function ProcessArray(Arr() As Variant) As Variant
這樣:
Function ProcessArray(Arr As Variant) As Variant

這樣,你的功能現在將接受包含代替尋找變量數組的數組的變體。正如你所說,一個微妙但重大的差異。

+0

丹尼爾,如果我是一個小妞,我有你的孩子沒有有效辦法那讓我瘋狂。 – user1902208

+0

Anyt提示得到一個函數返回字符串數組沒有咳嗽類型失配誤差(下面的例子): 功能CreateArray()作爲字符串() 昏暗數組1(1〜4)作爲字符串 CreateArray = Array1 End Function – user1902208

+0

@ user1902208。該片段不會返回錯誤。你可以像dimx()這樣的字符串來調用它:x = CreateArray'。 –

0

我想還是不回答就是爲什麼
1. MySub(MyArg)
作品不錯,但
2. MyOtherSub(MyArg1, MyArg2)

This blog entry explains it well.

本質上講,你可以通過一個通常爲Byval的參數:
Call MySub(Arg1, (Arg2)) 'Arg1 is passed byref, Arg2 is passed byval

代碼#1。因爲VBA認爲你傳遞了一個參數byVal,因此它不會被計數爲調用Sub而不使用Call關鍵字的括號。正如其他答案中所述,如果沒有Call關鍵字,Sub調用中不允許使用括號。

Call關鍵字需要括號中的Params。因此,Call關鍵字Call MySub(MyArg)實際上會通過MyArg byRef,因爲括號被用作參數的外殼。

代碼#2不工作,因爲在語法來證明括號(這是隻允許與Call關鍵字。

相關問題