ページコンテンツ
For Eachステートメントの使い方
どうも、takaです、今回は【For Eachステートメントの使い方】ということで、今まで【For~Next】や【Do~Loop】についてご紹介してきましたが、今回の【For Each】は今までとは少使用方法が違います、なので.【For~Next】や【Do~Loop】のような感覚でいると理解がしずらいかもしれません(;´・ω・)
今回は使い方とサンプルを用意しますので参考にしてください(^^♪
For Eachステートメントの書式
【For Eachステートメント】の書式は以下の通りです。
1 2 3 4 5 6 7 8 | Sub sample() Dim 変数名 As Long For Each 変数名 In グループ名 繰り返す処理 Next 変数名 |
【For Eachステートメント】は【一つのグループの中身を一つずつ取り出して順番に処理していく】というイメージになります(;^ω^)
この説明だけでは理解がしずらいですよね(;´・ω・)
たとえば↓のようにした場合
1 2 3 4 5 6 7 8 9 10 11 | Sub sample() Dim ws As Variant For Each ws In Worksheets MsgBox ws.Name Next ws End Sub |
これは【Worksheetsコレクション】からワークシートの名前を順番に取り出す コードです。
【For Eachステートメント】では、取り出した内容を変数に格納します。なので上記のようにWorksheetsを格納する場合は変数の型を【Woksheet 型】か【すべての方に対応できるVariant型】を宣言する必要があります。格納する内容によって変数の宣言を考る必要がありますのでご注意ください(´・ω・
)
サンプル
上記の説明だけでは少しわかりにくいと思いますのでいくつかsampleをご紹介します(´・ω・)
↓は【RangeA1:C3】というグループに対して文字列【E-VBA】を記述するコードです。ちなみにこの場合は【A1→B1→C1→A2→B2・・・】という順番で処理されていきます。
1 2 3 4 5 6 7 8 9 10 11 | Sub sample() Dim rg As range For Each rg In range("A1:C3") rg.Value = "E-VBA" Next rg End Sub |
下記のサンプルは【range(“A1:D10”)】を先に選択して、選択されている範囲を取得する【Selection】をグループに指定することによって選択されている【range(“A1:D10”)】に文字列を入力するプログラムです。
1 2 3 4 5 6 7 8 9 10 11 12 13 | Sub sample() Dim rg As range range("A1:D10").Select For Each rg In Selection rg.Value = "E-VBA" Next rg End Sub |
下記のコードはユーザーフォーム上のコントロールのオブジェクト名をすべて取得してMsgboxに表示するコードです。sampleではCommandButtonに割り振ってあります。
今回は【VBAでRGBと16進数カラーコード変換ツール】のフォーム上に取得ボタンを追加してテストしています。
1 2 3 4 5 6 7 8 9 | Private Sub CommandButton1_Click() Dim ms As String Dim myCntl As Variant For Each myCntl In Controls ms = ms & myCntl.Name & vbCrLf Next myCntl MsgBox ms End Sub |
取得ボタンを押したことによってフォーム上のコントロールをすべて取得しました。処理の順番はおそらくタブオーダーの順番です(;^ω^)
最後に
いかがでしたでしょうか?覚えてしまえば便利な【For Eachステートメント】ですが、ほかの繰り返し処理に比べると考え方が異なるためとっつきにくい印象があります(;´・ω・)
実際私も【For Each】を覚えたのはVBAを初めてからだいぶ後のことでした(笑)
今回の記事で【For Eachステートメント】について多少なりとも理解ができてもらえたらなら幸いです(;^ω^)
ファイルやコードの利用について
サンプルコードなどは当サイトの免責事項をよくお読みになってからお使いください。Twitterフォロー
ブログの更新通知を受け取るにはこちらにはこちら↓Twitterもやってます(^^♪Excelについてはあまり触れませんがブログの更新のお知らせはツイートしています(^^♪
Twitterフォロー
Follow @takabou63
コメントを残す