Excel VBA

VBA超入門シリーズ:その10 ~ループ処理~

はじめに

VBA超入門シリーズ:その9 ~条件分岐~

 

前回は if文 や select文 と言われる条件分岐についてまとめました。

 

今回はループ処理についてです。プログラムっぽいですね!
手作業だと気の遠くなる繰り返し作業をループ処理が楽にしてくれます!

 

構文、サンプル、解説という順にまとめました。
それではループ処理、確認していきましょう!

For ~ Nextステートメント

ループ処理を行う「数」や「回数」を指定するタイプの仕組みです。

 

構文は以下の通りです。

 

For カウンタ用変数 = 開始値 To 終了値
繰り返し処理
Next

 

「For」のあとにカウンタ用変数を用意し、開始値と終了値を指定します。
そこから「Next」まで書かれた処理が、開始値から終了値の回数だけ繰り返し実行されます。

サンプル

下記コードは、カウンタ用変数に「i」を宣言し、開始値「1」 〜 終了値「5」を指定して、1~5の5回分の処理 (セルに繰り返しの回数記述) を行います。

 

Sub サンプル()
Dim i As Long 'カウンタ用変数

For i = 1 To 5
Cells(i, 1).Value = i & "回目の処理"
Next

End Sub

 

実行結果は以下のようになります。

 

 

解説

カウンタ用変数は「For ~ Next」に挟まれた処理が実行されるたびに「1」を加算し、終了値に達するまで繰り返します。

 

サンプルのようにループ処理内でカウンタ用変数を利用すると、「1回目の処理」「2回目の処理」といったように毎回の処理の内容に変化を付けられます。

For ~ Nextは「○行目(開始)から×行目(終了)のセルの対して同じ処理をさせたい」ときに役立ちます。

 

Cells(行番号,列番号)
この形式で操作対象のセルを指定しています。いままで使っていた「Range」と違い選択したセルから横に(縦に)移動したセルを選択できます。

 

増減の方向、値の変更

Stepキーワードを使うと増減の方向や値の変更が可能です。

先ほどのサンプルを「1」ずつ減らしてみましょう。
減らしていくので開始値「5」 〜 終了値「1」を指定します。

 

 

Excel上はさっきと変わってない…?

 

この通り、ループ処理はセルA5から順にA1まで記述しているのでExcel上の見た目変わらず、減算されてループ処理されているかわかりません。

 

実行中の変数の変化が見たいですね!
Debug.Printを使うと実行中の変数やプロパティの値を確認することができます。

 

結果はExcel上ではなくVBEのイミディエイトウィンドウに出力されます。

 

 

しっかりと変数が「5.4.3.2.1」と減算されているのが確認できます。

 

開始値「10」終了値「1」、増減値「-2」にするとこのような結果になります。

 

 

Stepキーワードを使用すると「まとまった数ごとに決まった処理をさせる」ことが可能です。
数行おきに罫線を引いたり10区切りでデータを転記したりなどなど、詳しくは教本やネットにまとめられているので調べてみてください。

For Eachステートメント

特定のリストをもとに、そのリスト内のすべてのメンバーに対して処理を繰り返したい場合に利用します。

 

構文は以下の通りです。

 

For Each メンバー用変数 In リスト
個々のメンバーに対する処理
Next

 

ループ対象になるリストには、セル範囲やWorksheetsコレクションなどの各種コレクションや配列を指定します。

サンプル

サンプルで確認していきます。

 

テキトーに名前だけ並べてみました!

 

呼び捨てだと失礼なのですべてに" 様"を付けましょう。

 

↓それっぽく言い換えると…

 

名前というリスト内のすべてのメンバーに対して" 様"を語尾に付け加える処理を繰り返して行いたい!
ということですね。

 

コードはこのようになります。

 

Sub サンプル()

Dim i As Range

For Each i In Range("B3:B8")
i.Value = i.Value & " 様"
Next

End Sub

 

実行結果は以下のようになります。

 

 

解説

まず処理対象のリストとリスト内個々のメンバーを扱うための変数を用意します。今回は名前のリストRange("B3:B8")と変数 i です。
そのうえで「For Each メンバー用変数 In リスト ~ Next」と書くことでリスト内のメンバーの数だけ処理を繰り返します。

 

この際、メンバー用変数には任意の1メンバーが代入されています。
メンバー用変数を用いて個別メンバーに対して行いたい処理を実行できる仕組みになっています。

 

サンプルでは「i.Value」で格納されていた名前を取り出して「i.Value & " 様"」で" 様"を加えて再度格納します。
結果として、しっかりと指定したリスト全体に" 様"を付けられました。

Do loopステートメント

ループ処理の終了条件を決めておき、条件を満たす間(あるいは満たさない間)に繰り返し処理を行います。

 

構文は以下の通りです。

 

Do While 条件式
繰り返したい処理
Loop

 

Do While 条件式 ~ Loopの間で挟まれた処理を条件式が満たされる「True」の間繰り返します。

 

条件式を満たない間処理させたいときは、WhileキーワードでなくUntilキーワードを使います。
構文は先ほどと変わらずです。

 

Do Until 条件式
繰り返したい処理
Loop

 

条件式が満たされない「False」の間実行されます。

注意!

気を付けないといけないのが、繰り返されるコード内で条件式の結果が変更される仕組みにすることです。
変数を使わず変わらない条件式にしてしまうと、永遠に条件を満たす(満たさない)のでループから抜け出せなくなります。

 

無限ループ入りまぁす

 

もし無限ループに入った場合は「Esc キー」で抜け出しましょう。

サンプル

先ほどの名前のリストを使います。
横と下にちょっと拡張しました。

 

 

名前があれば確認のセルに◯を入れてもらいましょう。

 

↓それっぽく言い換えると…

 

名前のセルに値が入力されている間、横のセルに"◯"を格納する。
ということですね。

 

コードはこのようになります。

 

Sub サンプル()

Do While ActiveCell.Value <> ""
ActiveCell.Next.Value = "◯"
ActiveCell.Offset(1).Select
Loop

End Sub

 

ちょっとややこしいですね!
一つずつ確認しましょう。

 

解説

条件式を「ActiveCell.Value <> ""」とします。
ActiveCell (アクティブセル) 、今選択しているセルの中身が「 ”” (空白) 」と等しくない ( <> ) ときにループするようにしています。

 

簡単に言えば「選択したセルにデータが入っていれば繰り返す」ということです。

 

ループ処理一行目
ActiveCell.Next.Value = "◯"
見慣れない位置に「Next」と書きました。
これはアクティブセルの横のセルのことです。正しくは「Tabキーを入力したときと同じセル」です。

 

ループ処理二行目
ActiveCell.Offset(1).Select
次のループ処理のためにアクティブセルの位置を変えておきます。
Offset(行,列)で移動させます。行移動だけの場合には列を省略可能です。
今回は Offset(1) なので、行を1つ下に移動しています。(負の数だと上に)

 

意味も分かったところで実行しましょう。

 

 

実行されない?!?!

 

この場合エラーは起きてないので条件式から確認します。
条件式が「選択したセルにデータが入っていれば繰り返す」・・・「選択したセルに」・・・?

 

実行画像を確認するとA1が選択されています!データは入ってないですし、チェックしたい名前のセルはそこではないですね。

Range("B2").Selectで最初にセルを選択させましょう。

 

Sub サンプル()

Range("B2").Select

Do While ActiveCell.Value <> ""
ActiveCell.Next.Value = "◯"
ActiveCell.Offset(1).Select
Loop

End Sub

 

 

できましたー!よかった!

 

余談

イミディエイトウィンドウ

今回しれっと使いました。
普通にVBAを使っていても表示されていませんので、表示の仕方だけ書いておきます。

 

VBEの「表示」→「イミディエイトウィンドウ」から出します。

 

 

いろいろ使い道はあります。「VBA イミディエイトウィンドウ」で調べてみてください。

 

 

VBAで作業を自動化しようとすると必要な知識になります。
ここでは超入門用にまとめたので簡素にしてあります。ちゃんと学習したい方や実用したい方は教本使って勉強しましょう。それではまた次回!

 

「VBA超入門シリーズ:その11 ~配列~」に続く