Excel VBAループ-For Each,For Next,Do While,Nested&More

VBAで効果的に機能するには、ループを理解する必要があります。

ループを使用すると、コードブロックを設定回数繰り返したり、オブジェクトセット内の各オブジェクトでコードブロックを繰り返したりできます。

まず、ループが可能なものを示すためのいくつかの例を示します。 その後、私たちはあなたにループについてのすべてをお教えします。

VBA Loop Quick Examples

For Each Loops

for Each Loopsワークブック内のすべてのワークシートや範囲内のすべてのセルなど、コレクション内のすべてのオブジェクこのコードは、ブック内のすべてのワークシートをループし、各シートを再表示します。

2
3
4
5
6
7
8
ワークシート内の各wsのワークシート

wsとしてのdim ws。

範囲内のすべてのセルをループ

このコードは、セルの値が負、正、またはゼロであるかどうかをテストし、セルの範囲をループします。

範囲内のすべてのセルをループ

このコードは、セルの次のループのための

次のループのための

“for”ループの別のタイプはFor次のループです。 For Nextループを使用すると、整数をループすることができます。

このコードは、1から10までの整数をループし、それぞれにメッセージボックスを表示します:/div>

5
6
サブforloop()
整数としてdim i
i=1から10
msgbox i
次のi

do whileループ

do whileループは条件が満たされている間ループします。 このコードはまた、整数1から10をループし、それぞれをメッセージボックスで表示します。/div>

5
6
7
8
5
6
7
8
/div>

これについては、以下で説明しますが、次のようになります。 Do WhileまたはDo Untilループを作成するときは、終わることのないループを作成しないように、非常に注意する必要があります。

VBAループビルダー

これは、プレミアムVBAアドインAutoMacroの「ループビルダー」のスクリーンショットです。 ループビルダーを使用すると、さまざまなオブジェクトや数字をループするループをすばやく簡単に構築できます。 各オブジェクトに対してアクションを実行したり、特定の条件を満たすオブジェクトのみを選択したりできます。

アドインには、他の多くのコードビルダー、広範なVBAコードライブラリ、および各種コーディングツールも含まれています。 これは、任意のVBA開発者のために持っている必要があります。

ここでは、さまざまなタイプのループについて詳しく説明します。

VBA For Next Loop

For Loop構文

For Next Loopでは、コードブロックを指定した回数繰り返すことができます。 構文は次のとおりです:

1
2
3
4
5

For Counter = Start to End
Next

Where the items in brackets are optional.

  • – Declares the counter variable. Required if Option Explicit is declared at the top of your module.
  • Counter–カウントに使用される整数変数
  • Start–開始値(例。 1)
  • End–終了値(Ex. 10)
  • –すべての1つの整数ではなく、すべてのn個の整数を数えることができます。 また、負の値で逆にすることもできます(例。 Step–1)
  • –次のループのために
  • Next-Closing文を繰り返すコード。 あなたはカウンターを含めるかどうかを含めることができます。 ただし、コードを読みやすくするため、カウンタを含めることを強くお勧めします。

それが混乱している場合は、心配しないでください。 いくつかの例を検討します:このコードは、For-Nextループを使用して10にカウントされます。

Count to10

このコードは、For-Nextループを使用して10にカウントされます。

:/div>

5
6
7
8
/div>

次のn
サブ終了

ループステップの場合

10にカウント–偶数のみ

これは、次のn

ループステップの場合

10にカウント-偶数のみ

コードは偶数を数えるだけで10にカウントされます:/div>

5
6
7
8

「ステップ2」を追加しました。 これにより、forループはカウンタを2ずつ”ステップ”するように指示します。 負のステップ値を使用して逆にステップすることもできます。

For Loop Step–Inverse

Countdown from10

このコードは10からカウントダウンします:/div>

5
6
7
8
9
/div>

削除

削除

削除

削除

削除

削除

削除

削除

削除

削除

削除

削除

削除

削除

削除

削除

削除

削除 セルが空白の場合の行

私は最も頻繁に負のステップFor-Loopを使用してセルの範囲をループし、特定の基準を満たす行を削除しました。 上の行から下の行にループすると、行を削除するとカウンターが台無しになります。

この例では、空白のセルを持つ行を削除します(一番下の行から始まります)。

ネストされたForループ

あるForループを別のForループの中に”ネスト”することができます。 入れ子になったForループを使用して乗算表を作成します:/div>

/div> 行を整数としてdim、列を整数としてcol

行=1から9
col=1から9
セル(行+1、col+1)。値=行*col
次のcol
次の行
エンドサブ

exit For

exit forステートメントを使用すると、for nextループをすぐに終了できます。

通常、Exit ForをIf文とともに使用し、特定の条件が満たされた場合にFor Nextループを終了します。

たとえば、Forループを使用してセルを検索することができます。 そのセルが見つかったら、ループを終了してコードを高速化できます。見つかった場合、コードはセルを選択し、見つかったエラーを警告し、ループを終了します。

重要:ネストされたForループの場合、Exit Forは現在のForループを終了し、すべVBAには、Visual Basicにある”Continue”コマンドがありません。 代わりに、”Exit”を使用する必要があります。

VBA For Each Loop

VBA For Each Loopはコレクション内のすべてのオブジェクトをループします:

  • 範囲内のすべてのセル
  • ワークブック内のすべてのワークシート
  • ワークシート内のすべての図形
  • すべての開いているワークブック

ネストされたFor Eachループを使用することもできます。

  • すべてのワークシート上の範囲内のすべてのセル
  • すべてのワークシート上のすべての図形
  • すべての開いているワークブック内のすべてのシート
  • すべての開いているワークブック内のすべてのシート
  • すべての開いているワークブック内のすべてのシート
  • だから…

構文は次のとおりです:

1
2
3

For Each Object in Collection
Next

Where:

For Each Cell in Range

This code will loop through each cell in a range:

For Each Worksheet in Workbook

This code will loop through all worksheets in a workbook, unprotecting each sheet:

1
2
3
4
5
6
7
8
9

Sub ForEachSheet_inWorkbook()
Dim ws As Worksheet
For Each ws In Worksheets
ws.”パスワード”の保護を解除します
Next ws
End Sub

開いているワークブックごとに

このコードは、開いているすべてのワークブックを保存して閉じます:/div>

5
6
7
8
9
ワークブックでは

wb。SaveChangesを閉じる:=True
Next wb
End Sub

ワークシート内の各図形について

このコードは、アクティブなシート内のすべての図形を削除します。/div>

5
6
7
8
9
図形

shp。
次のshp
End Sub

ワークブック内の各ワークシートの各形状について

また、次のshp

ワークブック内の各ワークシートの各形状について

また、次のshp

/div> shpを形状として、wsをワークシートとして

ワークシート内の各wsの
ws内の各shpの。図形
shp。Delete
Next shp
Next ws
End Sub

For Each–IF Loop

前に述べたように、ループ内でIf文を使用して、特定の条件が満たされている場合このコードは、範囲内のすべての空白行を非表示にします。

VBA Do Whileループ

VBA Do WhileとDo Until(次のセクションを参照)は非常に似ています。 条件が満たされている間(または満たされるまで)、ループが繰り返されます。

Do Whileループは、条件が満たされている間にループを繰り返します。/div>

1
2
3
3
3
3
3
3
3

3

333333333333333333333333333333div>

3
do while条件
ループ

where:

  • 条件–条件を変更するには、
    • 条件–条件を変更するには、
      • 条件-条件を変更するには、
        • 条件-条件を変更するには、
          • 条件-条件を変更するには、
            • 条件-条件を変更するには、
              • test
              • -繰り返すコードブロック

              ループの最後に条件を指定してdo whileループを設定することもできます:

              1
              2
              3

              Do
              Loop While Condition

              We will demo each one and show how they differ:

              Do While

              Here is the Do While loop example we demonstrated previously:/div>

              5
              6
              7
              8
              11

              msgbox n
              n=n+1
              ループ
              end sub

              ループWhile

              ここで、条件をループの最後に移動する以外は、同じ手順を実行しましょう:/div>

              5
              6
              7
              8

              vbaはループまで実行します

              戻るまで

              戻るまで

              戻るまで

              戻るまで

              戻るまで

              戻るまで

              戻るまで

              戻るまで

              戻るまで

              戻るまで

              戻るまで

              戻るまで

              戻るまで

              戻るまで

              戻るまで

              戻るまで

              戻るまで

              戻るまで

              戻るまで

              戻る ループは、特定の条件が満たされるまでループを繰り返します。 構文は基本的にDo Whileループと同じです。

              1
              2
              3
              条件まで行います
              ループ

              同様に、条件はループの開始または終了に行くことができます:

              1
              2
              3

              Do
              Loop Until Condition

              Do Until

              This do Until loop will count to 10, like our previous examples

              1
              2
              3

              10

              msgbox n
              n=n+1
              ループ
              end sub

              ループまで

              このループまでループは10にカウント:/div>

              5
              6
              7
              8
              =n+1

              nまでループ>10
              サブ終了

              Exit Do Loop

              Exit Forを使用してForループを終了するのと同様に、Exit Doコマンドを使用してDoループをすぐに終了します

              ここでは、exit doの例です。

              endまたはbreak loop

              上記のように、exit forまたはexit doを使用してループを終了することができます:

              1
              Exit For
              1
              Exit Do

              However, these commands must be added to your code before you run あなたのループ。現在実行中のループを「中断」しようとしている場合は、キーボードでESCまたはCTRL+Pause Breakを押してみることができます。

              しかし、これは動作しない場合があります。 うまくいかない場合は、ループが終了するのを待つか、無限ループの場合はCTRL+ALT+Deleteを使用してExcelを強制的に閉じる必要があります。誤って無限ループを作成してExcelを再起動する方が簡単で、作業が失われる可能性があります。

              これが私がDoループを避けようとする理由です。

              その他のループ例

              行をループ

              これは、列内のすべての行をループします:

              列をループ

              これは行のすべての列をループします:

              フォルダ内のファイルをループします

              このコードは、フォルダ内のすべてのファイルをループし、リストを作成します。

              配列をループします

              このコードは、配列をループします’arrlist’:/div>

              1
              2
              3
              1
              2
              3
              for i=lbound(arrlist)to ubound(arrlist)
              msgbox arrlist(i)
              next i

              lbound関数は”下限”を取得します配列の”とuboundは”上限”を取得します。

              Access VBAのループ

              上記の例のほとんどは、Access VBAでも機能します。 ただし、Accessでは、rangeオブジェクトではなくRecordsetオブジェクトをループします。/div>

              5
              6
              7
              8
              9
              10
              11
              12
              13
              14
              15
              16
              17
              18
              19
              19
              19
              19
              19
              19
              19
              19
              19
              19
              19
              19
              19
              19
              /div>

              サブloopthroughrecords()
              エラー時に次を再開
              データベースとしてdbsを薄暗く
              レコードセットとしてdbs=currentdbを設定
              Set rst = dbs.OpenRecordset(“tblClients”, dbOpenDynaset)
              With rst
              .MoveLast
              .MoveFirst
              Do Until .EOF = True
              MsgBox (rst.Fields(“ClientName”))
              .MoveNext
              Loop
              End With
              rst.Close
              Set rst = Nothing
              Set dbs = Nothing
              End Sub



コメントを残す

メールアドレスが公開されることはありません。