ExcelVBA入門第8回 繰り返し処理

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

こんなふうに入れ子にすることも。

120702-1

実行するとこんな感じに。入れ子にすると短いコードでたくさん処理できますねー。

追記

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行目へ戻ります。正しいパスが入力されるまで何度でも戻ります。

動作は同じなので、目的によって使い分けていくのが良いですね。

公開日:2012/07/02
更新日:2014/02/14

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

コメントは承認制ですので、反映までしばらくお待ち下さい。(稀にスパムの誤判定にて届かないこともあるようですので、必要な際はお問い合わせからお願い致します。)

YouTubeでQ&Aコンテンツを企画しています

運営しているYouTubeチャンネルで、ご相談やご質問を募集しています。動画のコメントやお問い合わせページからお気軽にご相談をお寄せください。