VBAのDo While文徹底解説!柔軟な繰り返し処理をマスターし、業務を効率化しよう

当ページのリンクには広告 (Amazonアソシエイト含む) が含まれています。
DoWhile分のアイキャッチ

「VBAを使っていて、「Do While文」の使い方がよく分からない…」
そんなお悩みを抱えていませんか?


繰り返し処理を行いたいが、回数が事前に決まっていない…

・条件に基づいて柔軟にループを制御したい!

その場合は、VBAの「Do While文」を
使用すると解決します!


この記事では、VBAの「Do While文」を使って、条件が満たされるまで繰り返し処理を行う方法を詳しく解説します。

「Do While文」は、条件次第で処理を柔軟に繰り返す強力な機能です。
この記事で紹介するサンプルコードを使えば、すぐに実践できる具体的な解決策が手に入ります!

使用例はコピペして実行できるので、ぜひ最後までお読みいただき、実践してみてください。


【 この記事の概要 】

よく使う度
難しさ
覚えておくと安心度
目次

この記事を読むと「できるようになる」こと

この記事を読むことで、以下のことができるようになります。

回るデグー

VBAの繰り返し処理「Do While文」とは? | 繰り返し処理の種類もご紹介

VBAの「Do While文」は、指定された条件が「True」である間、繰り返し処理を行うための構文です。
たとえば、セルが空でない間だけ処理を続けたい場合など、条件に応じた繰り返し処理が必要なときに非常に便利です。

他のループ文とは異なり、ループ回数が決まっていない場合でも柔軟に処理を進められるため、条件が「False」になるまで処理が繰り返されます。

VBAにおける繰り返し処理の種類

VBAには複数の繰り返し処理があります。

以下は代表的なループ文の種類です。

繰り返し処理の種類説明
For文事前に決められた回数だけ繰り返し処理を行います。
固定回数のループに適しており、範囲内で連続した処理を行う際に便利です。
For Each文配列やコレクション内の各要素に対して順次処理を行います。
全要素にアクセスする場合に便利で、シートのセル範囲や
オブジェクトのコレクションに対してよく使用されます。
Do While文指定された条件がTrueの間、処理を繰り返します。
条件に基づいてループを制御したい場合に使用され、
繰り返し回数が不定のケースに適しています。
Do Until文指定された条件がTrueになるまで処理を繰り返します。
Do While文とは逆の条件で動作し、条件が満たされるまで処理を続けます。
While…Wend文指定された条件がTrueである間、処理を繰り返します。
Do While文に似ていますが、よりシンプルなループ処理に使用されます。
Do Loop While文処理を少なくとも1回は実行し、その後、指定された条件がTrueで
あれば繰り返します。
最初に必ず1回処理が行われる点が特徴です。
Do Loop Until文処理を少なくとも1回実行した後、指定された条件がTrue
になるまで繰り返します。
条件が満たされるまで必ず1回は処理が行われます。
引用元:VBA For Next文の使い方完全ガイド|ループ処理と抜ける方法を解説

VBAでは、状況に応じた適切な繰り返し処理を選ぶことが重要です。

特に、「Do While文」は繰り返し回数が不定の場面や、動的な条件で処理を行う場合に強力なツールです。

スポンサーリンク

VBAのDo While文の基本構文

VBAで繰り返し処理を行う際、Do While文を使うと、条件に応じて柔軟にループを制御できます。

繰り返し回数が不定な場合にも便利です。 以下が基本的な構文です。


Do While文の構文
構成について解説
  • 条件式
    • 繰り返しを続けるかどうかを判断する条件を指定します。
      条件が「True」の間は処理が繰り返され、条件が「False」になるとループを抜けます

      例: セルが空でない間だけ処理を続けるなど、繰り返し回数が不定の場合に便利です。

実際のDo While文の例

次のコードは、変数numが10になるまで繰り返し処理を行う例です。

Sub DoWhileExample()
    Dim num As Long
    num = 1
    
    Do While num <= 10
        Debug.Print num
        num = num + 1
    Loop
End Sub

この例では、VBAの繰り返し処理である「Do While文」を使ってnumが10に達するまで数字をカウントする方法を記述しました。
条件が「True」の間は処理が続き、numが10を超えた時点でループが終了します。

VBAのDo While文と合わせてよく使われるコード

「Do While文」は、繰り返し処理が必要な場面で非常に便利です。
特に、繰り返し回数が事前にわからないケースで活用されます。

ここでは、代表的な使用例を紹介しながら、ループからの抜け方や無限ループ回避方法などを解説します。

1: Dir関数を使ったファイル操作

「Do While文」と「Dir関数」を組み合わせると、フォルダ内のファイルを順次処理する際に非常に便利です。

フォルダ内の全ファイルを取得して処理する自動化が簡単に行えます。

コード | Dir関数を使用

Sub DirExample()
    Dim fileName As String
    fileName = Dir("C:\MyFolder\*.*")
    
    Do While fileName <> ""
        Debug.Print fileName
        fileName = Dir
    Loop
End Sub

動作解説

このコードは指定フォルダ内のすべてのファイル名を取得し、処理を行います。

Dir関数でファイルを1つずつ取得し、ファイルがなくなるまで繰り返し処理します。

あわせて読みたい
VBAのDir関数を使いこなす方法:ファイル名やパスの取得、ワイルドカードの活用 「指定したフォルダ内のファイルをセルに表示させたい!!」このように悩んだことはありませんか? ・フォルダ内にある特定のファイルを取得したいけどどうするの?・フ...

2: セル範囲を動的に処理する

「Do While文」は、セル範囲内のデータが特定の条件を満たすまで繰り返し処理を行う場面で使われます。

例えば、セルが空でない限り処理を続ける場合などです。

コード | セルの値に応じて動的に処理

Sub CellLoopExample()
    Dim cell As Range
    Set cell = Range("A1")

    Do While cell.Value <> ""
        cell.Value = "処理済み"
        Set cell = cell.Offset(1, 0) ' 次のセルへ
    Loop
End Sub

動作解説

セルが空でない限り処理を繰り返し、処理済みとマークして次のセルに進みます。
こうした動的なセルの処理に「Do While文」が役立ちます。

3: Do While文とIf文の組み合わせによる条件付き繰り返し処理

「Do While文」と「If文」を組み合わせると、特定の条件を満たす場合にだけ繰り返し処理を行うことができます。

これにより、より柔軟で精密な制御が可能となり、特定の処理をスキップしたり、途中でループを抜けるといった複雑な動作も簡単に実現できます。

基本的な組み合わせ例 | 特定条件でループを抜ける

次のコードは、「Do While文」と「If文」を組み合わせて、特定の条件を満たした場合に処理をスキップする例です。

コード | 特定条件でループを抜ける
Sub DoWhileIfExample()
    Dim num As Long
    num = 1

    Do While num <= 10
        '// numが5のとき処理をスキップ
        If num = 5 Then
            num = num + 1
            GoTo ContinueLoop
        End If
        
        Debug.Print "現在の数値: " & num
        num = num + 1
        
ContinueLoop:
    Loop
End Sub
動作解説

If num = 5 Thenで、変数numが5の場合に処理をスキップしています。
GoToを使ってラベルContinueLoopへ飛ばし、その後の処理をスキップして次のループに進みます。

条件を複数組み合わせて処理を分岐

さらに複雑な条件を使いたい場合、「If…ElseIf…Else文」を使うことで、異なる条件に応じて処理を切り替えることができます。

コード | 条件を複数組み合わせて処理
Sub MultiConditionExample()
    Dim num As Long
    num = 1

    Do While num <= 10
        If num Mod 2 = 0 Then
            Debug.Print num & "は偶数です"
        ElseIf num Mod 3 = 0 Then
            Debug.Print num & "は3の倍数です"
        Else
            Debug.Print num & "はその他の数です"
        End If
        num = num + 1
    Loop
End Sub
動作解説

この例では、If文の条件に応じて、numが偶数か、3の倍数か、それ以外かをチェックしています。
条件に応じて異なる処理が実行されるので、柔軟な繰り返し処理が可能です。


「Do While文」と「If文」を組み合わせることで、柔軟な条件付き繰り返し処理が実現できます。

これにより、特定の条件で処理をスキップしたり、途中でループを抜けるといった細かな制御が可能です。
業務においてデータのチェックやエラーハンドリングを効率的に行うためにも、この組み合わせは非常に有効です。

Do While文を使う際は「無限ループ」に注意

Do While文を使用する際に気を付けるべき最大のポイントは、無限ループに陥らないことです

条件が常に「True」になってしまう場合、ループが終了しないため、プログラムが永久に繰り返し続けます

条件が適切に変化するよう、必ずループの中で条件に影響を与えるコードを記述しましょう。

無限ループを抜ける方法 | Exit Doでループを抜ける

「Do While文」を使用する際、特定の条件が満たされたときにループを抜ける方法を知っておくと便利です。
これは無限ループの回避にも役立ちます。

「Do While文」では、Exit Doを使って特定の条件でループを強制的に終了することができます。

コード | 無限ループを抜ける方法

Sub ExitDoExample()
    Dim counter As Long
    counter = 0

    Do While counter < 100
        counter = counter + 1
        If counter = 50 Then Exit Do '// カウンターが50に達したらループを抜ける
    Loop
End Sub

動作解説

counterが50になった時点でループを終了する例です。

Exit Doを使うことで、柔軟にループを抜けることが可能です。

無限ループを防ぐための条件設定

無限ループにならないようにするためには、ループ内で条件が必ず変化することが重要です。

次の例は、無限ループに陥らないように条件を工夫しています。

コード | 無限ループを防ぐ方法

Sub PreventInfiniteLoop()
    Dim counter As Long
    counter = 0

    Do While counter >= 0 '// 無限にループし続ける可能性がある
        counter = counter + 1
        If counter > 10000 Then Exit Do '// カウンターが10000を超えたら強制終了
    Loop
End Sub

動作解説

このコードでは、counterが一定数を超えるとループを終了する安全策を設けています。
こうすることで、誤って無限ループに陥るリスクを減らせます。

無限ループに陥った場合の対処法

万が一、無限ループに陥ってしまった場合の対処法を知っておくと安心です。

もし、無限ループになってしまったら
  • 強制的にVBAの実行を停止
    • 実行中に「Ctrl + Break」を押すと、VBAの実行を強制停止できます。
      また、「デバッグ」メニューから「リセット」を選んで停止することも可能です。
  • コードを見直して修正
    • 無限ループの原因を特定し、ループ内で条件が適切に変化するように修正しましょう。
      ループ内での変数の変更を忘れないように注意します。
スポンサーリンク

VBAのDo While文の使用例をご紹介

ここからは、「Do While文」の使用例を紹介します。

以下に紹介する使用例は、すべてコピペしてすぐに実行できるコードです。
気になる例は、ぜひご覧いただき、実際に実行してみてください。

VBAの基礎から応用までを効率よくしっかり学習したい方には、UdemyのVBA講座もおすすめです。

特に自己学習で進める場合、ビデオや実践例があると理解が進みやすくなります。

多彩な講座から自分に合った講座を探そう!
UdemyでVBAを検索
UdemyでVBAを検索 画像出典:Udemy

\  自分のペースで学べるVBA講座はこちら  /

使用例1: Do While文を使って、数字をカウントする

特定の数値が10に達するまで、数を増やし続ける方法を紹介します。
このコードは、条件が満たされるまで繰り返し処理を行う「Do While文」の基本的な使い方を示しています。

主な使用用途: 回数が決まっていない、または柔軟にループを終了させたいときに使用します。具体的には、指定した条件が満たされるまで繰り返し処理を行う場合に便利です。

コード例

Sub 繰り返し例1()
    Dim num As Long
    num = 1

    Do While num <= 10
        Debug.Print num
        num = num + 1
    Loop

End Sub

処理結果

使用例1の結果

コードの動作概要

STEP
変数「num」の宣言と初期値の設定

整数型の変数「num」を宣言し、初期値として「1」を設定します。

STEP
Do Whileループの開始

Do Whileループを開始します。
「num」が「10」以下である間、ループ内の処理を繰り返します。

STEP
デバッグウィンドウへの出力

ループ内で、変数「num」の値をデバッグウィンドウに出力します。

STEP
変数「num」の増加

変数「num」に「1」を加えます。

STEP
ループの終了

変数「num」が「10」を超えた時点で、Do Whileループが終了します。

このコードで使用している機能

1行ずつコードを解説

クリック」してコードの詳細解説を見る
  1. Sub 繰り返し例1()
    • この行では、「Subステートメント」を使用して新しいサブルーチン「繰り返し例1」を定義しています。
      このサブルーチンは、特定の条件を満たすまで数値を繰り返し処理する内容になっています。
  2. Dim num As Long
    • ここでは、変数「num」をLong型として宣言しています。
      この変数は、数値のカウンタとして使用されます。
      Long型は、整数を扱うためのデータ型です。
  3. num = 1
    • この行で、変数「num」に初期値「1」を代入しています。
      ループのカウントを1から開始することを示しています。
  4. Do While num <= 10
    • この行では、「Do While」ループが開始されます。
      条件として「num <= 10」を設定しており、この条件が「True」(numが10以下)である限り、ループ内の処理が繰り返されます
      このループの特徴は、条件が「False」(numが10を超える)になると、ループが終了することです。
  5. Debug.Print num
    • この行では、現在の「num」の値をデバッグウィンドウに出力します。
      「Debug.Print」は、プログラムの実行中に値を確認するための命令で、デバッグ作業に便利です。
      例えば、最初のループでは「1」、次に「2」、そして「10」まで順に出力されます。
  6. num = num + 1
    • この行で、変数「num」に「1」を加えています
      ループが繰り返されるたびに「num」が「1」ずつ増加し、最終的に「num」が「10」を超えると、ループが終了します。
  7. Loop
    • この行は、ループの終了を示します。
      ここでループが1回終了し、次のループを実行するかどうかを判断します。
      「Do While」文は、条件が「True」である限り、ループを続けます。
  8. End Sub
    • この行は、サブルーチンの終了を示しています。
      すべてのループ処理が完了した後、サブルーチンが終了し、プログラムは次のステップに進みます。

総括・ポイント

このコードは、数値「num」が10に達するまで繰り返し処理を行う基本的な「Do While」ループの使い方を示しています。
ループ内で「num」の値を増加させることで、条件が満たされるまで処理が続きます。
「Do While」ループは、繰り返し処理が必要な場面で、柔軟に利用できるため、さまざまな場面で役立ちます。

使用例2: セルが空でない限り繰り返す

指定したセルが空でない限り、処理を繰り返す方法を紹介します。

主な使用用途: このコードは、特定の範囲内で空でないセルに対して一括で処理を適用したい場合に使用します。

コード例

Sub 繰り返し例2()
    Dim cell As Range
    Set cell = Range("A1")

    Do While cell.Value <> ""
        cell.Value = "処理済み"
        Set cell = cell.Offset(1, 0) '// 次のセルに移動
    Loop

    '// オブジェクト参照を解除
    Set cell = Nothing

End Sub

処理結果

使用例2の結果

コードの動作概要

STEP
変数「cell」の宣言と初期設定

変数「cell」を Range 型で宣言し、セル「A1」を参照するように初期設定します。

STEP
Do Whileループの開始

Do While ループを開始します。
「cell」が空でない限り、ループ内の処理を繰り返します。

STEP
セルの値を「処理済み」に変更

現在のセル(cell)の値を「処理済み」に変更します。

STEP
次のセルに移動

Offset メソッドを使って、1行下のセルに移動します。

STEP
ループの終了

ループは、次のセルが空になるまで繰り返され、空のセルに到達した時点でループが終了します。

このコードで使用している機能

1行ずつコードを解説

クリック」してコードの詳細解説を見る
  1. Sub 繰り返し例2()
    • この行では、新しいサブルーチン「繰り返し例2」を定義しています。
      サブルーチンは、Excelシート上のセルに対して繰り返し処理を実行するための小さなプログラムです。
  2. Dim cell As Range
    • この行では、Range 型のオブジェクト変数「cell」を宣言しています。
      Range 型は、Excelのセルやセル範囲を指し、後のループ処理で使用されます。
  3. Set cell = Range(“A1”)
    • ここでは、オブジェクト変数「cell」に「A1」セルを代入します。
      「Set ステートメント」を使用することで、オブジェクト(この場合はセル)を変数に設定できます。
  4. Do While cell.Value <> “”
    • Do While ループの条件部分です。
      cell.Value(セルの値)が空でない限り、ループ処理を繰り返します。
      <> “” は「空でない」という意味
      を持っています。
  5. cell.Value = “処理済み”
    • この行では、現在参照しているセルの値を「処理済み」に設定します。
      ループが進むごとに、セルの内容が「処理済み」に書き換えられていきます。
  6. Set cell = cell.Offset(1, 0)
    • Offset メソッドを使用して、現在のセルから1行下のセルに移動します。
      この処理により、次のセルに対する操作が可能になります。
  7. Loop
    • この行は、ループの終了部分を示します。
      Do While ループの条件が満たされる限り、処理が繰り返されます。
  8. Set cell = Nothing
    • この行では、オブジェクト変数「cell」が指していたオブジェクト参照を解除しています。
      これにより、変数がもはやセルを参照しない状態になり、不要になったメモリを解放できます。
      VBAでは、特に大きなプロジェクトや複数のオブジェクト参照を扱う場合、メモリ管理のために Nothing を使用して参照を解除することが推奨されます。
  9. End Sub
    • この行は、サブルーチンの終了を示しています。
      すべてのループ処理が完了した後、サブルーチンが終了し、プログラムは次のステップに進みます。

総括・ポイント

このコードでは、Excelの特定の範囲内で、空でないセルに対して「処理済み」と自動的に書き込むことができます。
Do While ループを使うことで、特定の条件が満たされるまで処理を続けることができ、効率的にセルに対して操作を行えます。

使用例3: 途中でループを止める方法

指定した条件が満たされたら、途中でループを終了する方法を紹介します。

主な使用用途: このコードは、特定の範囲内で空でないセルに対して一括で処理を適用し、特定の値(「終了」)が見つかった時点で処理を停止したい場合に使用します。

コード例

Sub 繰り返し例3()
    Dim cell As Range
    Set cell = Range("A1")

    Do While cell.Value <> ""
        If cell.Value = "終了" Then
            Exit Do '// ループを終了
        End If
        cell.Value = "処理済み"
        Set cell = cell.Offset(1, 0) '// 次のセルに移動
    Loop

    '// オブジェクト参照を解除
    Set cell = Nothing

End Sub

処理結果

使用例3の結果

コードの動作概要

STEP
変数「cell」を宣言し、初期セルを設定

Range 型の変数「cell」を宣言し、処理を開始するセルとして「A1」を設定します。

STEP
ループ開始

Do While ループを開始し、セルの値が空でない限り処理を繰り返します。

STEP
ループ終了条件の確認

もしセルの値が「終了」であれば、Exit Do でループを終了します。

STEP
セルの値を変更し、次のセルに移動

セルの値を「処理済み」に変更し、次のセルに移動します。

STEP
ループ終了とオブジェクトの解放

ループが終了した後、オブジェクト変数「cell」のオブジェクト参照を解除します。

このコードで使用している機能

1行ずつコードを解説

クリック」してコードの詳細解説を見る
  1. Sub 繰り返し例3()
    • この行は、新しいサブルーチン(プロシージャ)「繰り返し例3」を定義します。
      このサブルーチンが実行されると、特定のセル範囲に対して繰り返し処理が行われます。
  2. Dim cell As Range
    • ここでは、オブジェクト変数「cell」を Range 型として宣言しています。
      この変数はセルの範囲を保持し、ループ処理の中でセルの内容を操作するために使用されます。
  3. Set cell = Range(“A1”)
    • Excelのワークシート上のセル「A1」を操作の対象とするために、このセルの参照をオブジェクト変数「cell」に格納します。
      つまり、cell という変数は、これ以降セル「A1」を指すことになります。
  4. Do While cell.Value <> “”
    • Do While ループが開始されます。
      このループは、セル「cell」の値が空でない限り、処理を繰り返します。
  5. If cell.Value = “終了” Then
    • ここでは、「セルの値が空白でない限り、ループを繰り返す」という意味です。
      cell.Value <> “”」 は「セルの値が空白でない」という条件を意味します。
      もしセルに何らかのデータが入力されていれば、この条件が「True」となり、ループが開始されます。
  6. Exit Do
    • ループを強制的に終了します。
      「Exit Do」は、Do While ループを途中で終了させる命令です。
      もし現在のセルに「終了」と書かれていたら、それ以降のセルには何も処理を行わず、ループをすぐに抜け出します。
  7. End If
    • If 文の終了です。 ここで If の条件分岐が終了します。
      セルの値が「終了」でなかった場合、Exit Do は実行されず、次の処理に進みます
  8. cell.Value = “処理済み”
    • セルの値を「処理済み」に変更します。
      ここでは、現在操作中のセルに「処理済み」という文字列を入力しています。
      例えば、最初のセル「A1」の値が「終了」でなければ、そのセルに「処理済み」と入力されます。
  9. Set cell = cell.Offset(1, 0)
    • 次のセルに移動しています。
      cell.Offset(1, 0) は、現在のセルから「1行下」のセルに移動することを意味します。
      列の移動は行わず、行だけが1つ下がるという動作です。
      これにより、例えば「A1」から「A2」へとセルの操作対象が移動します。
  10. Loop
    • ループの終了点です。
      ここで再び Do While の条件に戻り、次のセルが空白かどうかを確認します。
      もしセルが空白でなければ再びループが実行され、セルが空白であればループが終了します。
  11. Set cell = Nothing
    • オブジェクト参照を解除します。
      「Set cell = Nothing」は、オブジェクト変数「cell」の中に保存されていたセルの参照を解放する(消去する)ために使います。
      これにより、メモリリークを防ぎ、VBAの動作が軽くなります。
      変数を使い終わった後は、このように明示的にメモリを解放することが推奨されます。
  12. End Sub
    • この行は、サブルーチンの終了を示しています。
      すべてのループ処理が完了した後、サブルーチンが終了し、プログラムは次のステップに進みます。

総括・ポイント

このコードは、Excelのセルを順番に処理しながら、「終了」という特定の値が見つかった時点でループを停止する機能を持っています。
ループ処理の基本的な使い方を学びながら、特定の条件で処理を停止する方法を理解するのに役立ちます。

使用例4: 途中でループをスキップする方法

指定した条件が満たされたら、そのセルの処理をスキップして次のセルに移動する方法を紹介します。

主な使用用途
このコードは、特定のセルを除外して一括処理を行いたい場合に使用します。
たとえば、データ処理中に特定の条件に一致するセルのみをスキップして、他のセルに対して一括で処理を適用したい場合に便利です。

コード例

Sub 繰り返し例4()
    Dim cell As Range
    Set cell = Range("A1")

    Do While cell.Value <> ""
        If cell.Value = "スキップ" Then
            Set cell = cell.Offset(1, 0)
            GoTo Continue '// スキップして次のループへ
        End If
        cell.Value = "処理済み"
        Set cell = cell.Offset(1, 0)
Continue:
    Loop

    '// オブジェクト参照を解除
    Set cell = Nothing

End Sub

処理結果

使用例4の結果

コードの動作概要

STEP
変数「cell」を宣言し、初期位置としてセル「A1」を指定

変数「cell」を Range 型として宣言し、最初の対象セルとしてセル「A1」を設定します。

STEP
Do While ループの開始

セルが空でない間 (cell.Value <> “”)、繰り返し処理を行います。

STEP
セルの値を確認し、「スキップ」があれば次のセルに移動してスキップ

セルの値が「スキップ」の場合、そのセルを飛ばして次のセルへ移動します。

STEP
セルの値を「処理済み」に設定

スキップ条件に該当しないセルには、「処理済み」と入力します。

STEP
次のセルに移動し、ループを続行

セル範囲を順に移動し、すべてのセルが処理されるまでループが繰り返されます。

このコードで使用している機能

1行ずつコードを解説

クリック」してコードの詳細解説を見る
  1. Sub 繰り返し例4()
    • ここで新しいサブルーチン「繰り返し例4」を定義します。
      このコードは、特定のセルをスキップしながら一連の処理を行う仕組みです。
  2. Dim cell As Range
    • ここでは、「cell」という名前の変数を Range 型として宣言します。
      この変数は、セルのデータや位置を扱うために使用されます。
  3. Set cell = Range(“A1”)
    • オブジェクト変数「cell」にセル「A1」をセットします。
      これが最初に処理を開始するセルになります。
      「Set ステートメント」を使ってセル範囲オブジェクトを変数に格納します。
  4. Do While cell.Value <> “”
    • Do While ループを開始します。
      この行は、cell.Value(現在のセルの値)が空でない間、ループが続行されることを示しています。
      セルの値が空になるとループは終了します。
  5. If cell.Value = “スキップ” Then
    Set cell = cell.Offset(1, 0)
    GoTo Continue ‘ スキップして次のループへ
    End If
    • If 文で、現在のセルの値が「スキップ」であるかを確認します。
      もし「スキップ」であれば、そのセルを飛ばし、「Offset メソッド」を使って次のセルに移動します。
      「Offset(1, 0)」によって、現在のセルの1行下のセルが新しい対象となります。
      その後、「GoTo Continue」でラベル「Continue」にジャンプして、次のループ処理に進みます。
      これにより、スキップ条件に一致するセルの処理を回避します。
  6. cell.Value = “処理済み”
    • If 文で「スキップ」に該当しない場合、現在のセルに「処理済み」という文字を入力します。
      この処理は「スキップ」でないセルにのみ適用されます。
  7. Set cell = cell.Offset(1, 0)
    Continue:
    • 次のセルに移動します。
      「Offset(1, 0)」 によって、1行下のセルが新たな対象となります。
      「Continue: ラベル」は、「GoTo ステートメント」のジャンプ先を示しています。
      ここから再びループ処理に戻ります。
  8. Loop
    • ループの終了です。
      この行まで達すると、再び Do While の条件をチェックします。
      条件が満たされる限り、再度ループが実行されます。
  9. Set cell = Nothing
    • 処理が完了した後、オブジェクト変数「cell」への参照を「Nothing」に設定してオブジェクト参照を解除します。
      これにより、メモリリークを防ぐことができ、不要なリソースが開放されます。
  10. End Sub
    • この行は、サブルーチンの終了を示しています。
      すべてのループ処理が完了した後、サブルーチンが終了し、プログラムは次のステップに進みます。

総括・ポイント

このコードは、特定のセル(「スキップ」と書かれたセル)を除外しながら、他のセルに対して一括処理を行う便利な方法を示しています。
特に、データクリーニングや整列処理など、特定の条件に一致するデータをスキップしながら他のデータを効率的に処理したい場合に役立ちます。

使用例5: Dir関数と組み合わせて、フォルダ内のファイルを全て取得する

Dir関数を使用して、指定したフォルダ内のファイルをすべて取得する方法を紹介します。

主な使用用途
このコードは、特定のフォルダ内にあるすべてのファイルを対象に、ファイル名の取得やファイルに対する一括処理を行いたい場合に便利です。たとえば、バックアップやデータの集計など、複数のファイルに対して繰り返し操作を行う場合に使用します。

コード例

Sub 繰り返し例5()
    Dim fileName As String
    Dim folderPath As String
    Dim row As Long
    
    folderPath = "C:\ファイルパス\" '// 対象フォルダのパス
    row = 1 ' A1から出力を開始
    
    fileName = Dir(folderPath & "*.*") '// 最初のファイルを取得
    
    Do While fileName <> ""
        Cells(row, 1).Value = fileName '// A列のセルにファイル名を出力
        row = row + 1 '// 次の行に移動
        fileName = Dir() '// 次のファイルを取得
    Loop

End Sub

処理結果

使用例5の結果

コードの動作概要

STEP
変数を宣言し、フォルダのパスを設定

「fileName」、「folderPath」、「row」の3つの変数を宣言し、フォルダパスと初期の行番号を設定します。

STEP
最初のファイル名を取得

Dir関数を使って、指定したフォルダ内の最初のファイル名を取得します。

STEP
ファイル名をセルに出力

取得したファイル名をシートのA1セルから順に出力します。

STEP
次の行に移動

ファイル名を出力するたびに、次の行(A2、A3)に移動して、次のファイル名を出力します。

STEP
フォルダ内のすべてのファイルが処理されるまでループ

フォルダ内のすべてのファイル名を取得して、セルに出力するまでループを続けます。

このコードで使用している機能

1行ずつコードを解説

クリック」してコードの詳細解説を見る
  1. Sub 繰り返し例5()
    • これは、新しいプロシージャ(サブルーチン)を定義するための行です。
      「Sub ステートメント」の後に続く名前(ここでは 繰り返し例5)がサブルーチンの名前となります。
      この名前は、後でサブルーチンを実行する際に呼び出すためのものです。Sub の終了は End Sub で示されます。
  2. Dim fileName As String
    Dim folderPath As String
    Dim row As Long
    • 「fileName」:各ファイルの名前を保持する文字列型の変数です。
      「folderPath」:対象フォルダのパスを保持する文字列型の変数です。
      「row」:Excelシートのどの行にファイル名を出力するかを管理する数値型の変数です。
  3. folderPath = “C:\ファイルパス\”
    • この行では、変数「folderPath」にフォルダのパスを代入しています。
      ここで指定されたフォルダが、後でファイルを探す対象になります。
      「”C:\ファイルパス\”」 のように、フォルダのパスは常に 「\」 で終わるようにしてください
      これにより、後でファイル名とフォルダのパスを正しく結合できます。
  4. row = 1
    • rowを「1」に初期化します。
      これにより、ファイル名の出力をシートのA1セルから開始します。
  5. fileName = Dir(folderPath & “*.*”) ‘ // 最初のファイルを取得
    • ここで、Dir 関数が使われています。
      Dir 関数は、指定されたフォルダの中にあるファイル名を取得します。
      「folderPath & “*.*”」 は、フォルダ内のすべてのファイル(どんな拡張子のファイルも)を対象にする指定です。
      「*.*」は、任意のファイル名と任意の拡張子を意味します。
      Dir 関数が最初のファイル名を返し、そのファイル名が変数「fileName」に保存されます。
  6. Do While fileName <> “”
    • Do While ループの開始行です。
      このループは、fileName 変数が空(つまりファイルがもうない)になるまで繰り返されます。
      fileName <> “” という条件は、「ファイル名が空でない限りループを続ける」という意味です。
      <> は「等しくない」という意味の演算子で、”” は空の文字列を表します。
  7. Cells(row, 1).Value = fileName
    • Cells(row, 1).Valueは、シートの指定された行のA列にfileNameの値を設定します。
      最初はA1セルにファイル名が出力されます。
  8. row = row + 1
    • 変数「row」の値を「1」増やします。
      これにより、次のファイル名をA2、A3といった次の行に出力する準備ができます。
  9. fileName = Dir()
    • Dir関数を再度呼び出して、フォルダ内の次のファイル名を取得します。
      この操作により、ループが続行されます。
  10. Loop
    • ループの終了です。
      この行まで達すると、再び Do While の条件をチェックします。
      条件が満たされる限り、再度ループが実行されます。
  11. End Sub
    • この行は、サブルーチンの終了を示しています。
      すべてのループ処理が完了した後、サブルーチンが終了し、プログラムは次のステップに進みます。

総括・ポイント

このコードは、指定したフォルダ内のすべてのファイル名を、ExcelのA列に順次出力するための簡単かつ効率的な方法を提供します。
Dir関数を使用してファイル名を取得し、シート上に順に出力する流れを通して、フォルダ内のファイルを簡単に一覧化することが可能です。

スポンサーリンク

この記事のまとめ

「Do While文」は、条件に基づいた柔軟な繰り返し処理を行うために非常に有用です。

繰り返し回数が事前に決まっていない場合や、特定の条件が満たされるまで処理を続けたいときに活躍します。
また、Dir関数との組み合わせで、フォルダ内のファイル操作を自動化する際にも力を発揮します。

ポイントのおさらい

  • VBAのDo While文を使った柔軟な繰り返し処理を理解する
    • VBAの「Do While文」は、指定された条件が満たされる間、処理を繰り返すための構文です。
      ループ回数が決まっていない場合や、特定の条件が成立するまで処理を続ける場合に便利です。

      ⇒ 「Do While文とは?」もう一度見る。
  • Dir関数との相性の良さを理解する
  • 繰り返し処理の際の注意点を確認する
    • 「Do While文」を使う際には、無限ループに注意が必要です。
      条件が常に「True」であり続けると、ループが終了せず、プログラムが止まらなくなります。
      ループ内で条件を適切に変更し、無限ループを避けましょう。

      ⇒ 「Do While文を使う際の注意ポイント」もう一度見る。
  • セルやファイルに対する動的な処理を効率化する
    • セル範囲の動的な処理や、フォルダ内のファイルを一覧化するなど、繰り返し処理を使って効率的にデータを操作できます。
      これにより、手動の作業を大幅に自動化することが可能です。

      ⇒ 「Do While文の使用例」もう一度見る。

この記事の使用例を実践することで、VBAの「Do While文」を効果的に使いこなせるようになります。

まずは、サンプルコードをコピーして実行し、少しずつ自分の業務に応じたアレンジを加えていきましょう。

あわせて読みたい
サイトマップ このページは、本サイトの記事を分かりやすくまとめました。ぜひご覧ください。 目次 「VBA」を見る 「Officeスクリプト」を見る 「ワークシート関数」を見る 「JavaScr...
スポンサーリンク
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次