回答受付が終了しました

VBAの配列宣言について

VBAの配列宣言について パラメータが可変である引数を持つ Functionに配列を渡して配列を受け取るプログラムを練習として作っています。 下記のように意図した動きにならず困っています。 アドバイスをお願いします。 Functionは下記の通りです。 Function Mysum(ParamArray 引数()) Dim i As Integer Dim 合計値() As Variant For i = 0 To UBound(引数) 合計値(i) = 合計値(i) + 引数(i) Next Mysum = 合計値 End Function 呼び出し方法は 配列2 = Mysum(配列) です。 配列、配列2ともにVariantで定義しています。 ①呼び出し元でArray関数で値をセット Dim 配列() As Integer 配列 = Array(1,2,3) 上記のようにセットして配列を引数にFunctionに渡すと 2次元配列として勝手に書き換えられてしまいインデックスに関するエラーとなってしまいます。 関数を呼び出さないと一次元配列として定義されています。 Function側を 合計値(i) = 合計値(i) + 引数(i)(i) に変更しても「インデックスは有効範囲にありません」と出てしまいます。 エラーが出て止まっている状態で、イミディエイトウィンドウで ?引数(0)(0)とすると正しい値が出てきます。 ローカルウィンドウでも値が正しくセットされていることが 確認できています。 単純に、可変の引数を持つFunctionの練習がしたくて、 その一環で配列を渡し配列を返す動きのチェックをしています。 そのためロジックを丸ごと変更しても構いません。 しかし、このエラーの原因がわからず困っているので 特にこの原因についてアドバイスいただけると助かります。 よろしくお願いいたします。

Visual Basic17閲覧

回答(1件)

0

質問者さんの ParamArray の動作認識が誤っている感じです。 ParamArray の使い道は引数の数が可変になるときに使用するものです。 配列の添え字が可変という意味ではありません。 ここでの【可変】とは、たとえば Function MyFunc(a,b,Optional c) これも引数の数が可変しますが、引数が最低でも2個で最大で3つまで指定できます。 ParamArray はそれにも当てはまらず、その引数の数が可変になるということです。 Function MyFunc(ParamArray 引数()) とした場合 Call MyFunc(1,"A",Date()) とか、たくさん引数があるようなら Call MyFunc(1,"A",Date(),・・・・・・,"Z") とか、なんなら引数なしでも Call MyFunc() とかでも呼び出せます。 そんな動作をさせるものが ParamArray の機能です。 ・・・ということで・・・ Function Mysum(ParamArray 引数()) ↑これに対して ↓こうしたら Dim 配列, 配列2 配列 = Array(1,2,3) 配列2 = Mysum(配列) ↓こんな感じに認識されます。 Mysum(ParamArray 引数(配列())) ↓こう認識させないと意図通りにはなりません。 Mysum(ParamArray 引数(配列(0),配列(1),配列(2))) というか、この質問内容では ParamArray が邪魔です。 Function Mysum(引数) と定義するだけでOKです。

この返信は削除されました