「excel2013 vba 配列 for each in」
という検索で、このサイト『インストラクターのネタ帳』へのアクセスがありました。
配列をFor Each~Nextループで処理する、Excel VBAについて調べている方による検索です。
「excel2013 vba 配列 for each in」
という検索では、具体的にどんなことが知りたかったのかまではわかりませんので、参考になりそうなマクロをいくつかご紹介しておきます。
配列をFor Each~Nextループで処理するサンプルマクロ
以下のマクロが、配列をFor Each~Nextループで処理するときの基本です。実行すると配列に格納された「池田」「福田」「吉田」という文字列が、順番にメッセージボックスに表示されます。
Dim arr() As String
arr = Split("池田;福田;吉田", ";")
Dim itm As Variant
For Each itm In arr()
MsgBox itm
Next
End Sub
注意すべきは、For Each~Nextループで、配列の要素を取得する変数を、
Dim itm As Variant
と、バリアント型で宣言することです。
上記のマクロの場合、
Dim arr() As String
と宣言しているとおりString型の配列ですから、個々の要素を取り出す際に利用する変数もStringにしてしまいがちですが、その場合マクロを実行しようとしたときに
「コンパイルエラー:For Eachを配列で使用する場合は、バリアント型の配列でなければなりません。」
というエラーが発生します。
For Each~Nextループで配列の要素を受ける変数はVariantです。
配列をFor~Nextループで処理するサンプルマクロ
上記のマクロを、For Each~Nextではなく、For~Nextで書いた場合と比較しておきましょう。
Dim arr() As String
arr = Split("池田;福田;吉田", ";")
Dim i As Long
For i = LBound(arr) To UBound(arr)
MsgBox arr(i)
Next
End Sub
先のFor Each~Nextループでは、
For Each itm In arr()
と、配列・arr()の要素数は意識していませんでしたが、For~Nextループでは、
For i = LBound(arr) To UBound(arr)
と、カウンター変数を、いくつからいくつまで回すのかを、しっかりと指定する必要があります。
For Each~Nextループでセルに値を書き込むサンプルマクロ
実務では、配列の各要素を、セルに書き込むというケースがよくあります。そんなサンプルも確認しておきましょう。
Dim arr() As String
arr = Split("池田;福田;吉田", ";")
Dim i As Long
i = 1
Dim itm As Variant
For Each itm In arr()
Cells(i, "A").Value = itm
i = i + 1
Next itm
End Sub
For Each~Nextループと、For~Nextループの違いをしっかり理解できていない方の場合、
i = i + 1
を忘れがちです。
For~Nextループでセルに値を書き込むサンプルマクロ
同じことをFor~Nextループで書くと以下のとおりです。
Dim arr() As String
arr = Split("池田;福田;吉田", ";")
Dim i As Long
For i = LBound(arr) To UBound(arr)
Cells(i + 1, "A").Value = arr(i)
Next
End Sub
Split関数を使って作られた配列の場合、Option Base等の影響を受けず、必ず添え字・インデックスの最小値が「0」になりますから、
Cells(i + 1, "A").Value = arr(i)
の「+ 1」ように、データを入力するセルのアドレスが正しく指定されるようしてやる必要があります。
またFor Each~NextループとFor~Nextループの違いをしっかりと理解していないと、For Each~Nextループでは必要だった
i = i + 1
を、入れる必要のないFor~Nextループで入れてしまうというミスも、やってしまいがちなところです。
最終更新日時:2020-09-26 15:53
Home » エクセルマクロ・Excel VBAの使い方 » 配列 » 配列をFor Each~Nextループで処理する