VBA 引数に配列を渡して、配列の合計を求めます

ユーザー定義関数の引数に配列を渡します

 今回は 引数に配列を渡す方法 について解説します。配列を渡して値を受け取ったり、あるいは配列を渡して配列を受け取ったりということを自在に操れるようになると、VBA プログラミングの幅がぐーんと広がります。覚えておいて損はありません。とはいっても、そんなに難しい話ではないのです。要は引数のところに配列変数 a() をぽいっと放り込むだけです。

 ≫ 配列に関する基礎知識はこのページを見てね。

 あ、そうだ。言い忘れるところだったけど、宣言セクションに Option Base 1 と書いてインデックスの下限を 1 に揃えておいてください。引数として受け取る配列のインデックス下限値は自動的に 1 となってしまうからです。

 まずは簡単なテストコードを書いてみます。

 '配列要素を 2 倍にします

 Option Base 1

 Function TestArray(a() As Variant) As Variant

  a(1) = a(1) * 2
  a(2) = a(2) * 2
  a(3) = a(3) * 2

  TestArray = a()

 End Function

 見ての通り、受け取った配列要素をすべて 2 倍にして返す Function プロシージャ(ユーザー定義関数)です。このマクロは「配列を受け取って配列を返す関数」です。この関数をワークシートで呼びだすときは、下の図にあるように横並びのセルを3つ選んだ状態で、引数を配列定数の形で指定して

=TestArray({1,2,3})

と入力して、[Ctrl] + [Shift] + [Enter] を押すと値が返ります。

 Excel VBA 配列を引数に渡す方法

 次はこの関数を別のマクロで呼びだしてみます。

 'TestArray 関数を呼び出します

 Sub CallTestArray()

  Dim x As Variant
  Dim b(3) As Variant
  Dim j As Long

  b(1) = 3
  b(2) = 5
  b(3) = 2

  x = TestArray(b())

  For j = 1 To 3
   Debug.Print x(j);
  Next j

 End Sub

 TestArray の引数に配列要素 b() を渡して、戻ってきた配列をバリアント変数 x に格納して、x(1), x(2), x(3) の値を表示させます。実行してみると

 6 10 4

というように、b() の各要素が 2 倍になって戻ってきます。
 

配列の合計を求めるマクロ

 受け取った配列の合計を計算するユーザー定義関数をつくってみましょう。

 '配列要素をすべて足し合わせます

 Function SumArray(a() As Variant) As Variant

  Dim k As Long
  Dim lb As Long
  Dim ub As Long

  'インデックス番号の下限値を取得
  lb = LBound(a)

  'インデックス番号の下限値を取得
  ub = UBound(a)

  a(1) から a(k) まですべての要素を加えます
  For k = lb To ub

   SumArray = SumArray + a(k)

  Next k

 End Function

 この関数を呼び出して、10, 20, 30 を加えてみます。

 'SumArray 関数を呼び出します

 Sub SumTest()

  Dim x As Double
  Dim a(3) As Variant

  a(1) = 1
  a(2) = 2
  a(3) = 3

  x = SumArray(a())

  Debug.Print x

 End Sub

 実行すると「 60 」が戻ります。同じような要領で配列要素の平均値や分散を計算させるマクロをつくることもできます。配列要素を演算させるマクロは大きなデータを扱うための強力なツールになりうるので、ぜひ皆さんも配列を駆使したマクロを色々と試作してみてください。そういうマクロをライブラリとしてまとめておけば、様々な用途で活躍させることができます。

Google広告
スポンサーリンク
スポンサードリンク
末尾大型広告
末尾大型広告

コメントをどうぞ

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください