よく使うステートメント

For Each ~ Next

 指定した範囲のセルの先頭から最後のセルまで、同じ処理をしてみたい。
こんな時に使用する便利な仕組みが「For Each ~ Nextt」ステートメントです。

 For ~ Next と似てはいますが別物です。

 For Each ステートメントは、「対象としたオブジェクトのリスト(セルの範囲など)を指定して、そのリスト内のすべての対象に同じ処理を行う」ということになります。

二つの例で説明します。

◆ 例 その1

Sub セルeach()
Dim Rng  ‘①
‘②
For Each Rng In Range(“A1:D8”)
  Rng.Value = “Japan” ‘③
Next

End Sub

① Rng を変数として宣言
  ここではあえて型を宣言していません(バリアント型)
  初心者のうちはこれでもいいです。

  書くなら 「Dim Rng As Range」となります。
  詳しくは次の例でお話しします。

② セル A1からD8の範囲でセルの数だけ処理を繰り返し行う命令

③ 範囲内の各セルに「Japan」と書き入れる処理内容

結果は

例 その2

このような「お取引先リスト」があります。
各会社名の後ろに「御中」の記載を入れます。

Sub セル処理()
‘①
Dim Rng As Range
‘②
For Each Rng In Range(“B3:C9”)
‘③
 Rng.Value = Rng.Value & “ 御中”
Next

End Sub

① Range型のオブジェクト変数「Rng」を宣言
  VBAではセルをRangeオブジェクトとして扱っています。
  よってセルを変数に格納するときは、データ型を「Range型オブジェクト変数」にします。

※ オブジェクト型変数については ココ でご覧いただけます。

② セル範囲 B3 から C9 まで順番にこのセルの数だけ繰り返し処理を行う命令

③ 右辺のRng.Valueは現在書かれているお取引先名。
  「& ”御中” 」で「(お取引先名)御中」となり、これが右辺に代入され、表示される

よって結果は

 一見この「For Each ~ Next」はわかりにくい一面があります。

 まず処理対象となるリスト、そしてそのリスト内の個々を扱うための変数を準備します。

そのうえで

For Each (変数)in リスト
   処理すべき内容
Next

の形式で書くことによって、リスト内の数だけ処理を繰り返すことになります。

 この「For Each ~ Next」は、VBAにある程度慣れてきてからの使用で大丈夫です。
ほとんど通常の「For ~ Next」で対応できます。

知っておこう

 このステートメントに設定する変数名は、何でもOKです。
勿論、VBAであらかじめ決められている用語(プロパティ名など)は使用できません。

 それ以外でしたら、自分でわかりやすい変数名にしておく方がやりやすいです。
回を重ねるごとに、自分なりのルールなりスタイルを持つことをおすすめします。

 たとえば Range は 「rng」、Sheet は「sht」のように、自分がすぐにわかるものに決めることです。