このサイトの記事内では「アフィリエイト広告」などの広告を掲載している場合があります。
消費者庁が問題としている「誇大な宣伝や表現」とならないよう配慮しコンテンツを制作しておりますのでご安心ください。
問題のある表現が見つかりましたらお問い合わせよりご一報いただけますと幸いです。

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

2023年1月13日

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

  1. ForNextで取り出す
  2. ForEachNextで取り出す

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

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

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

VBAが難しいと感じたら
ココナラにてマクロ(VBA)の作成代行を始めました。
ご依頼はこちらから

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)の作成代行を始めました。
ご依頼はこちらから

VBA

Posted by やろまい