【VBA】配列をFor文でループさせる2つの方法(1次元ならForNext推奨)

配列の中身を順番に取り出したい時、やり方は次の2つがあります。

  1. ForNextステートメントで取り出す
  2. ForEachNextステートメントで取り出す

ただ、プログラムを書く時にどちらにするか迷うことがありませんか?

今回は、どちらを使うのがベターかパッと分かる基準を紹介します。
この記事を読めば、もう無駄に悩むことはありません。

また、サンプルコードも記載するので、プログラムの書き方を知りたい人もご覧ください。

サンプルコード

ForNextステートメント

Sub ForNextState()
    Dim arr As Variant: arr = Array(1, 2, 3, 4)
    Dim index_i As Long

    For index_i = LBound(arr) To UBound(arr)
        Debug.Print index_i, arr(index_i)
    Next
End Sub

配列arrの中身を順番に表示するプログラムです。

配列の中身をすべて取り出したい場合、Forステートメントの始まりと終わりは数字ではなく、LBound(arr)とUBound(arr)を使いましょう。

  • LBound:配列の最小インデックスを返す。
  • UBound:配列の最大インデックスを返す。

この2つの関数を使っておけば、配列の要素数が変わっても書き換える必要がありません。

ForNextステートメントを使う大きなメリットは、ループの中でインデックス(index_i)が使えることです。
ForEachNextステートメントでは、カウントする変数を作らなければインデックスが分かりません。

ForEachNextステートメント

Sub ForEachNextState()
    Dim arr(1, 1) As Variant
    arr(0, 0) = 1: arr(1, 0) = 2
    arr(0, 1) = 3: arr(1, 1) = 4
    
    Dim oneArr As Variant
    For Each oneArr In arr
        Debug.Print oneArr
    Next
End Sub

こちらも配列arrの中身を順番に表示するプログラムです。(ただし、arrは2次元配列としています)

配列arrの中身をoneArrに取り出し、順番に表示しています。

ForEachNextステートメントを使う大きなメリットは多次元配列でも使用できることです。
ForNextステートメントでもできますが、次元の数だけForをネストする必要があるため、可読性が悪くなります。

1次元配列ならForNextステートメント推奨

次の2つの理由から、1次元配列ならばForNextステートメントで書くのがオススメです。

  1. 後々インデックスを使いたくなることが多い
  2. バリアント型の変数を避けられる

ForNextステートメントならば、ループ内でインデックスを使うことができます。

プログラムを作る当初はインデックスは確認しなくても良いと思っても、後々インデックスを使いたくなることがあります。
そのため、1次元配列ならばForNextステートメントを使うのがオススメです。

また、ForEachNextステートメントでは中身を受け取るためにバリアント型変数が必要になります。
この変数名を考えるのは意外と負担になります。ユニークで分かりやすい変数名を決めるのは労力がかかるため、できるだけ避けていきましょう。

以上の理由から、
・1次元配列ならForNextステートメント
・多次元配列ならばForEachNextステートメントを推奨します。

他の「VBA」の記事はこちらからどうぞ

VBA

Posted by やろまい