ExcelVBA入門第8回 繰り返し処理
Excelにはセルやシートという概念があるので、変数で指定して処理するのに繰り返し処理は欠かせません。サンプルをコピペして動かしてみてください!
For~Next文
こちらのコードを動かしてみます。
Sub ForNextSample1()
Dim i As Integer 'iという変数を整数型で宣言
For i = 1 To 10 'iを1から10まで繰り返す
Cells(i, 1) = i 'A□セルへ□を入れる←都度変わる
Next i '+1してForへ戻る
End Sub
ステップ実行しながら追ってみると、このような動きをしています。
RangeとCellは行列を逆に書くので、iが変化するごとにA1セル、A2セル、A3セル…のように変化していっていますね。
Sub ForNextSample1()
Dim i As Integer
For i = 1 To 10
Cells(i, 1) = i
If i = 5 Then Exit For 'iが5なら抜ける
Next i
End Sub
途中で処理を止めさせたいときはこのように書きます。iが5になったらForを抜けますよ、というIf文ですね。
Sub ForNextSample2()
Dim i As Integer, j As Integer
For i = 1 To 10
For j = 1 To 10
Cells(i, j) = i * j
Next j
Next i
End Sub
こんなふうに入れ子にすることも。
実行するとこんな感じに。入れ子にすると短いコードでたくさん処理できますねー。
追記
Stepについて書くのを忘れてました!
For i = 1 To 10 Step 2 '処理 Next i
このように書くと、変数へ入る値が1, 3, 5, 7… のように2ずつ増えていくことになります。(この場合だと10をスルーして11のときにループを抜けます)
Step 1のときのみ、この記述を省略することができるので、Stepを書かない場合は1ずつ増えていくことになります。
For i = 10 To 1 Step -1 '処理 Next i
マイナスも指定できます。このように書くと10, 9, 8, 7… のように処理されます。
For Each In~Next文
オブジェクトをループする構文です。私は「○○という名前のシートは存在するのか?」といった目的で使うことが多いです。
Sub ForEachSample1
Dim ws As Worksheet, flg As Boolean, stnam As String
stnam = "sheet1" 'シート名を指定
For Each ws In Worksheets '全シート数分繰り返す
If ws.Name = stnam Then flg = True '指定の名前のシートがあったらフラグを立てる
Next ws
If flg = True Then
MsgBox "シート名「" & stnam & "」は既に存在します。"
Else
MsgBox "シート名「" & stnam & "」は存在しません。"
End If
End Sub
こんな感じで。
Do~Loop文
条件式で判定する、For~Nextよりももうちょっと自由度の高いループです。
Sub DoLoopSample1()
Dim i As Integer 'iという変数を整数型で宣言
i = 1
Do While i <= 10 'iが10以下の間繰り返す
Cells(i, 1) = i 'A□セルへ□を入れる←都度変わる
i = i + 1 'iをカウントアップ
Loop 'Doへ戻る
End Sub
Do While 条件式(真の間繰り返す)、という形。
Sub DoLoopSample2()
Dim i As Integer 'iという変数を整数型で宣言
i = 1
Do Until i > 10 'iが10を超えるまで繰り返す
Cells(i, 1) = i 'A□セルへ□を入れる←都度変わる
i = i + 1 'iをカウントアップ
Loop 'Doへ戻る
End Sub
Do Until 条件式(真になるまで繰り返す)、という形。
Sub DoLoopSample3()
Dim i As Integer 'iという変数を整数型で宣言
i = 1
Do
Cells(i, 1) = i 'A□セルへ□を入れる←都度変わる
i = i + 1 'iをカウントアップ
If i > 10 Then Exit Do 'iが10を超えたらDoを抜ける
Loop 'Doへ戻る
End Sub
最初はDoだけにしておいて途中でDoを抜ける、という形。
えっと、WhileだっけUntillだっけ…、と、慣れてないと分かりにくいので、○が□だったらExit Do!っていうほうが明解で初心者さんにはわかりやすいかなーと個人的には思っています。
パスワード要求
Do~Loopは数値に依存しないので、こんなものも作れます。
Sub DoLoopSample4()
Dim pass As String 'passという変数を文字列型で宣言
Do '繰り返し
pass = InputBox("パスワードを入力してください") '入力要求
If pass = "" Then Exit Sub 'キャンセルなら終了
If pass = "abcd" Then '"abcd"という文字列なら
Exit Do 'ループを抜ける
Else 'それ以外なら
MsgBox "パスワードが間違っています" 'NGメッセージ
End If 'If文終わり
Loop 'Doへ戻る
MsgBox "正常にパスワードが入力されました" 'OKメッセージ
End Sub
“abcd”というパスワードが入力されたときのみDoを抜けられます。それまで延々とInputBoxを出し続けるというウザイ仕様ですw
別解
「繰り返し」とはちょっと異なるのですが、上記のパスワード入力はGoToステートメントを使ってこのようにも書けます。
Sub GoToSample1()
Dim pass As String 'passという変数を文字列型で宣言
err:
pass = InputBox("パスワードを入力してください") '入力要求
If pass = "" Then Exit Sub 'キャンセルなら終了
If pass <> "abcd" Then '"abcd"という文字列じゃなかったら
MsgBox "パスワードが間違っています" 'NGメッセージ
GoTo err
End If
MsgBox "正常にパスワードが入力されました" 'OKメッセージ
End Sub
パスワードが間違っていたとき、9行目のGoTo ○○に従って4行目へ戻ります。正しいパスが入力されるまで何度でも戻ります。
動作は同じなので、目的によって使い分けていくのが良いですね。
ほかの入門記事はこちら
- ExcelVBA入門第0回 始める前に
- ExcelVBA入門第1回 動かしてみる
- ExcelVBA入門第2回 とりあえず覚えておくべきこと
- ExcelVBA入門第3回 変数の宣言
- ExcelVBA入門第4回 RangeとCells
- ExcelVBA入門第5回 ステップ実行
- ExcelVBA入門第6回 If ~ End Ifステートメント
- ExcelVBA入門第7回 インデントとコメントアウト
- ExcelVBA入門第8回 繰り返し処理
- ExcelVBA入門第9回 5種類のモジュールの違い
- ExcelVBA入門第10回 3種類のプロシージャと命名規則
- ExcelVBA入門第11回 スコープ(適用範囲)
- これからExcelのマクロを始めたいという方に!簡単な練習問題作りました。
- 私がExcelVBAでよく使う便利なコード・スニペットまとめ
- プログラム初心者さんへ贈る、エラーが起きたら試してみて欲しいこと
- ExcelVBAのクラスモジュールって何?という人向けの使い方まとめ
書籍を執筆しています。
コメントは承認制ですので、反映までしばらくお待ち下さい。(稀にスパムの誤判定にて届かないこともあるようですので、必要な際はお問い合わせからお願い致します。)
YouTubeでQ&Aコンテンツを企画しています
運営しているYouTubeチャンネルで、ご相談やご質問を募集しています。動画のコメントやお問い合わせページからお気軽にご相談をお寄せください。