3

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

2 つの関数と、それら 2 つの関数を呼び出すサブルーチンだけです。コンパイラはコードのコンパイルを拒否し、次のように説明します。

コンパイル エラー:

型の不一致: 配列またはユーザー定義型が必要です

すべてが同じデータ型であり、渡された引数は実際には配列であるとしか言えません。ご参考までに、はい、データが割り当てられている配列を試してみました。

VBA 構文に欠けている微妙なものであることはわかっていますが、このような例は見たことがありません。どんな洞察も大歓迎です。

4

2 に答える 2

4

この行を変更します:
Function ProcessArray(Arr() As Variant) As Variant
これに:
Function ProcessArray(Arr As Variant) As Variant

このようにして、関数は、バリアントの配列を探す代わりに、配列を含むバリアントを受け入れるようになります。あなたが言ったように、微妙ですが重要な違い。

于 2012-12-13T20:39:55.707 に答える
0

まだ答えられていないのは、1.はうまく機能するが、2.は機能しない理由
MySub(MyArg)

思いMyOtherSub(MyArg1, MyArg2)
ます

このブログエントリはそれをよく説明しています。

基本的に、通常は byref である引数を byval として渡すことができます。
Call MySub(Arg1, (Arg2)) 'Arg1 is passed byref, Arg2 is passed byval

コード#1。VBA は 1 つの引数 byVal を渡していると考えているため、キーワードSubなしの呼び出しで使用されている括弧としてカウントされないため、機能します。Call他の回答で述べたように、キーワードのSubない呼び出しでは括弧を使用できません。Call

キーワードには、括弧内のCallParams が必要です。したがって、CallキーワードCall MySub(MyArg)を使用すると、括弧が引数の囲いとして使用されるため、実際にはMyArgbyRef が渡されます。

コード #2 は機能しません。これは、構文で括弧を正当化する有効な方法がないためです (Callキーワードでのみ許可されます)。

于 2012-12-14T19:16:34.687 に答える