
VBA超入門シリーズ:その10 ~ループ処理~
前回はif文やselect文と言われる条件分岐についてまとめました。
今回はループ処理についてまとめます。プログラムっぽいですね!
手作業だと気の遠くなる繰り返し作業をループ処理が楽にしてくれます!
VBAに用意されているループ処理、確認していきましょう。
目次
For ~ Nextステートメント
ループ処理を行う「数」や「回数」を指定するタイプの仕組みです。
構文は以下
For カウンタ用変数 = 開始値 To 終了値
繰り返したい処理
Next
「For」のあとにカウンタ用変数を用意し、開始値と終了値を指定します。
そこから「Next」まで書かれた処理が、開始値から終了値の回数だけ繰り返し実行されます。
サンプル
下記コードのように記述すると、
開始値「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回目の処理」といったように毎回の処理の内容に変化を付けられます。
Cells(行番号,列番号)
この形式で操作対象のセルを指定しています。
なので「○行目から×行目のセルの対してループしたい!」といった仕組みと相性抜群です。
増減の方向、値の変更
Stepキーワードを使うと増減の方向、値の変更が可能です。
さっきのサンプルを「1」ずつ減らしてみましょう。
しかしこのループ処理はセルA5から記述しているので結果の見た目変わらず、減算されてループ処理されているかわかりません。
なので、、
Debug.Printをつかって実行中の変数やプロパティの値を確認することができるので使ってみましょう。
結果は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
実行するとこんな感じ
解説
For Eachステートメントでは、処理対象のリストとリスト内個々のメンバーを扱うための変数を用意します。(今回は名前のリスト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」の間実行されます。
気を付けないといけないのが、繰り返されるコード内で条件式の結果が変更される仕組みにすることです。
変数を使わず変わらない条件式にしてしまうと、永遠に条件を満たす(満たさない)のでループから抜け出せなくなります。
サンプル
先ほどの名前のリストを使います。
横と下にちょっと拡張しました。
名前があれば確認のセルに◯を入れてもらいましょう。
↓言い換えると。。
名前のセルに値が入力されている間、横のセルに”◯”を格納
コードはこちらです。
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(行,列)で移動させます。
今回は行を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で作業を自動化しようとすると必要な知識になります。
ちゃんと学習したい方や実用したい方は教本使って勉強しましょう。それではまた次回!