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チャンネルで、ご相談やご質問を募集しています。動画のコメントやお問い合わせページからお気軽にご相談をお寄せください。