Home » エクセルマクロ・Excel VBAの使い方 » 配列 » 配列をFor Each~Nextループで処理する

配列をFor Each~Nextループで処理する

対象:Excel2007, Excel2010, Excel2013

「excel2013 vba 配列 for each in」
という検索で、このサイト『インストラクターのネタ帳』へのアクセスがありました。

配列をFor Each~Nextループで処理する、Excel VBAについて調べている方による検索です。

「excel2013 vba 配列 for each in」
という検索では、具体的にどんなことが知りたかったのかまではわかりませんので、参考になりそうなマクロをいくつかご紹介しておきます。

[スポンサードリンク]

配列をFor Each~Nextループで処理するサンプルマクロ

以下のマクロが、配列をFor Each~Nextループで処理するときの基本です。実行すると配列に格納された「池田」「福田」「吉田」という文字列が、順番にメッセージボックスに表示されます。

Sub 配列を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で書いた場合と比較しておきましょう。

Sub 配列を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ループでセルに値を書き込むサンプルマクロ

実務では、配列の各要素を、セルに書き込むというケースがよくあります。そんなサンプルも確認しておきましょう。

Sub 配列をFor_Each_Nextループで処理する_2()
 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ループで書くと以下のとおりです。

Sub 配列をFor_Each_Nextループで処理する_2()
 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ループで処理する

「配列」の記事一覧

検索


Copyright © インストラクターのネタ帳 All Rights Reserved.

.