VBAを使っていて、「Do While文」の使い方がよく分からない…
そんなお悩みを抱えていませんか?
この記事では、VBAの「Do While文」を使って、条件が満たされるまで繰り返し処理を行う方法を詳しく解説します。
「Do While文」は、条件に基づいた柔軟なループ処理を行いたいときにとても便利です。
使用例はコピペして実行できるので、ぜひ最後までお読みいただき、実践してみてください。
【 この記事の概要 】
よく使う度 | |
難しさ | |
覚えておくと安心度 |
この記事を読むとできるようになること
この記事を読むことで、以下のことができるようになります。
Do While文とは?
VBAの「Do While文」は、指定された条件が「True」である間、繰り返し処理を行うための構文です。
たとえば、「セルが空でない限り処理を続ける」といった、条件に基づいた繰り返し処理を実行したい場合に非常に便利です。
他のループ文と異なり、条件が満たされている限り処理を続行し、条件が「False」になるとループを終了します。
これにより、事前にループ回数が決まっていない場合でも、柔軟に処理を行うことができます。
繰り返し処理の種類
引用元:VBA For文の基礎から応用まで|繰り返し処理をマスターする完全ガイド
繰り返し処理の種類 説明 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回は処理が行われます。
他の繰り返し処理と比較し、どのような場合に「Do While文」が適しているかを理解しましょう。
Do While文の基本構文
以下は、VBAでのDo While文の基本的な構文です。
- 条件式
- コレクション内の各要素がこの変数に代入されます。
ループを続けるかどうかを判断する条件です。条件が「True」の間は処理が繰り返されます。
- コレクション内の各要素がこの変数に代入されます。
Do While文が、よく使われる事例
「Do While文」は、柔軟な繰り返し処理が必要な場面で多く活用されます。
特に、繰り返し回数が事前に分からない場合に便利です。以下に代表的な使用事例を紹介します。
- Dir関数との相性が抜群
- 「Do While文」は、Dir関数を使ったファイル操作でよく使われます。
たとえば、指定したフォルダ内のファイルをすべて取得し、その内容を処理する際に、Dir関数で次々とファイル名を取得し、フォルダ内のすべてのファイルが処理されるまでループを繰り返すことができます。
この組み合わせは、ファイル操作の自動化に非常に役立ちます。
- 「Do While文」は、Dir関数を使ったファイル操作でよく使われます。
- セル範囲の動的処理
- セル範囲をループで処理する際にもDo While文が役立ちます。
たとえば、特定のセルが空でない限り、次々とセルを処理する場合や、セルに特定の値が入るまでループを続けるといった状況でDo While文が使われます。
- セル範囲をループで処理する際にもDo While文が役立ちます。
- データ入力やデータチェックの自動化
- データが存在する限り繰り返し処理を行うときにもDo While文は活用されます。
たとえば、ユーザー入力のバリデーション処理や、データベースのレコードを順次チェックする場合、Do While文で必要な条件が満たされるまで処理を継続できます。
- データが存在する限り繰り返し処理を行うときにもDo While文は活用されます。
Do While文を使う際の注意ポイント
- 無限ループに注意
- Do While文を使用する際に気を付けるべき最大のポイントは、無限ループに陥らないことです。
条件が常に「True」になってしまう場合、ループが終了しないため、プログラムが永久に繰り返し続けます。
条件が適切に変化するよう、必ずループの中で条件に影響を与えるコードを記述しましょう。
- Do While文を使用する際に気を付けるべき最大のポイントは、無限ループに陥らないことです。
- パフォーマンスの影響
- Do While文の条件によってループ回数が予測できない場合、処理が予想以上に長くなる可能性があります。
特に大規模なデータセットや複雑な計算処理を行う場合は、処理の最適化が必要です。
繰り返し処理の進捗状況を確認しながら実行するように心がけましょう。
- Do While文の条件によってループ回数が予測できない場合、処理が予想以上に長くなる可能性があります。
- 変数の初期化と条件の確認
- ループで使用する変数は、必ず初期化し、正しい値を持つことを確認しましょう。
また、ループを開始する前に、条件が正しく設定されていることを確認することも重要です。
変数が適切に管理されていないと、意図しない結果になることがあります。
- ループで使用する変数は、必ず初期化し、正しい値を持つことを確認しましょう。
Do While文の使用例
ここからは、「Do While文」の使用例を紹介します。
どれも実際に動作するコードなので、ぜひ実行してみてください。
使用例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
- STEP1変数「num」の宣言と初期値の設定
整数型の変数「num」を宣言し、初期値として「1」を設定します。
- STEP2Do Whileループの開始
Do Whileループを開始します。
「num」が「10」以下である間、ループ内の処理を繰り返します。 - STEP3デバッグウィンドウへの出力
ループ内で、変数「num」の値をデバッグウィンドウに出力します。
- STEP4変数「num」の増加
変数「num」に「1」を加えます。
- STEP5ループの終了
変数「num」が「10」を超えた時点で、Do Whileループが終了します。
処理結果
このコードで使用している機能
1行ずつ解説
- Sub 繰り返し例1()
- この行では、「Subステートメント」を使用して新しいサブルーチン「繰り返し例1」を定義しています。
このサブルーチンは、特定の条件を満たすまで数値を繰り返し処理する内容になっています。
- この行では、「Subステートメント」を使用して新しいサブルーチン「繰り返し例1」を定義しています。
- Dim num As Long
- ここでは、変数「num」をLong型として宣言しています。
この変数は、数値のカウンタとして使用されます。
Long型は、整数を扱うためのデータ型です。
- ここでは、変数「num」をLong型として宣言しています。
- num = 1
- この行で、変数「num」に初期値「1」を代入しています。
ループのカウントを1から開始することを示しています。
- この行で、変数「num」に初期値「1」を代入しています。
- Do While num <= 10
- この行では、「Do While」ループが開始されます。
条件として「num <= 10」を設定しており、この条件が「True」(numが10以下)である限り、ループ内の処理が繰り返されます。
このループの特徴は、条件が「False」(numが10を超える)になると、ループが終了することです。
- この行では、「Do While」ループが開始されます。
- Debug.Print num
- この行では、現在の「num」の値をデバッグウィンドウに出力します。
「Debug.Print」は、プログラムの実行中に値を確認するための命令で、デバッグ作業に便利です。
例えば、最初のループでは「1」、次に「2」、そして「10」まで順に出力されます。
- この行では、現在の「num」の値をデバッグウィンドウに出力します。
- num = num + 1
- この行で、変数「num」に「1」を加えています。
ループが繰り返されるたびに「num」が「1」ずつ増加し、最終的に「num」が「10」を超えると、ループが終了します。
- この行で、変数「num」に「1」を加えています。
- Loop
- この行は、ループの終了を示します。
ここでループが1回終了し、次のループを実行するかどうかを判断します。
「Do While」文は、条件が「True」である限り、ループを続けます。
- この行は、ループの終了を示します。
- 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
- STEP1変数「cell」の宣言と初期設定
変数「cell」を Range 型で宣言し、セル「A1」を参照するように初期設定します。
- STEP2Do Whileループの開始
Do While ループを開始します。
「cell」が空でない限り、ループ内の処理を繰り返します。 - STEP3セルの値を「処理済み」に変更
現在のセル(cell)の値を「処理済み」に変更します。
- STEP4次のセルに移動
Offset メソッドを使って、1行下のセルに移動します。
- STEP5ループの終了
ループは、次のセルが空になるまで繰り返され、空のセルに到達した時点でループが終了します。
処理結果
このコードで使用している機能
1行ずつ解説
- Sub 繰り返し例2()
- この行では、新しいサブルーチン「繰り返し例2」を定義しています。
サブルーチンは、Excelシート上のセルに対して繰り返し処理を実行するための小さなプログラムです。
- この行では、新しいサブルーチン「繰り返し例2」を定義しています。
- Dim cell As Range
- この行では、Range 型のオブジェクト変数「cell」を宣言しています。
Range 型は、Excelのセルやセル範囲を指し、後のループ処理で使用されます。
- この行では、Range 型のオブジェクト変数「cell」を宣言しています。
- Set cell = Range(“A1”)
- ここでは、オブジェクト変数「cell」に「A1」セルを代入します。
「Set ステートメント」を使用することで、オブジェクト(この場合はセル)を変数に設定できます。
- ここでは、オブジェクト変数「cell」に「A1」セルを代入します。
- Do While cell.Value <> “”
- Do While ループの条件部分です。
cell.Value(セルの値)が空でない限り、ループ処理を繰り返します。
<> “” は「空でない」という意味を持っています。
- Do While ループの条件部分です。
- cell.Value = “処理済み”
- この行では、現在参照しているセルの値を「処理済み」に設定します。
ループが進むごとに、セルの内容が「処理済み」に書き換えられていきます。
- この行では、現在参照しているセルの値を「処理済み」に設定します。
- Set cell = cell.Offset(1, 0)
- Offset メソッドを使用して、現在のセルから1行下のセルに移動します。
この処理により、次のセルに対する操作が可能になります。
- Offset メソッドを使用して、現在のセルから1行下のセルに移動します。
- Loop
- この行は、ループの終了部分を示します。
Do While ループの条件が満たされる限り、処理が繰り返されます。
- この行は、ループの終了部分を示します。
- Set cell = Nothing
- この行では、オブジェクト変数「cell」が指していたオブジェクト参照を解除しています。
これにより、変数がもはやセルを参照しない状態になり、不要になったメモリを解放できます。
VBAでは、特に大きなプロジェクトや複数のオブジェクト参照を扱う場合、メモリ管理のために Nothing を使用して参照を解除することが推奨されます。
- この行では、オブジェクト変数「cell」が指していたオブジェクト参照を解除しています。
- 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
- STEP1変数 cell を宣言し、初期セルを設定
Range 型の変数 cell を宣言し、処理を開始するセルとして「A1」を設定します。
- STEP2ループ開始
Do While ループを開始し、セルの値が空でない限り処理を繰り返します。
- STEP3ループ終了条件の確認
もしセルの値が「終了」であれば、Exit Do でループを終了します。
- STEP4セルの値を変更し、次のセルに移動
セルの値を「処理済み」に変更し、次のセルに移動します。
- STEP5ループ終了とオブジェクトの解放
ループが終了した後、オブジェクト変数「cell」のオブジェクト参照を解除します。
処理結果
このコードで使用している機能
詳細解説
- Sub 繰り返し例3()
- この行は、新しいサブルーチン(プロシージャ)「繰り返し例3」を定義します。
このサブルーチンが実行されると、特定のセル範囲に対して繰り返し処理が行われます。
- この行は、新しいサブルーチン(プロシージャ)「繰り返し例3」を定義します。
- Dim cell As Range
- ここでは、オブジェクト変数「cell」を Range 型として宣言しています。
この変数はセルの範囲を保持し、ループ処理の中でセルの内容を操作するために使用されます。
- ここでは、オブジェクト変数「cell」を Range 型として宣言しています。
- Set cell = Range(“A1”)
- Excelのワークシート上のセル「A1」を操作の対象とするために、このセルの参照をオブジェクト変数「cell」に格納します。
つまり、cell という変数は、これ以降セル「A1」を指すことになります。
- Excelのワークシート上のセル「A1」を操作の対象とするために、このセルの参照をオブジェクト変数「cell」に格納します。
- Do While cell.Value <> “”
- Do While ループが開始されます。
このループは、セル「cell」の値が空でない限り、処理を繰り返します。
- Do While ループが開始されます。
- If cell.Value = “終了” Then
- ここでは、「セルの値が空白でない限り、ループを繰り返す」という意味です。
「cell.Value <> “”」 は「セルの値が空白でない」という条件を意味します。
もしセルに何らかのデータが入力されていれば、この条件が「True」となり、ループが開始されます。
- ここでは、「セルの値が空白でない限り、ループを繰り返す」という意味です。
- Exit Do
- ループを強制的に終了します。
「Exit Do」は、Do While ループを途中で終了させる命令です。
もし現在のセルに「終了」と書かれていたら、それ以降のセルには何も処理を行わず、ループをすぐに抜け出します。
- ループを強制的に終了します。
- End If
- If 文の終了です。 ここで If の条件分岐が終了します。
セルの値が「終了」でなかった場合、Exit Do は実行されず、次の処理に進みます。
- If 文の終了です。 ここで If の条件分岐が終了します。
- cell.Value = “処理済み”
- セルの値を「処理済み」に変更します。
ここでは、現在操作中のセルに「処理済み」という文字列を入力しています。
例えば、最初のセル「A1」の値が「終了」でなければ、そのセルに「処理済み」と入力されます。
- セルの値を「処理済み」に変更します。
- Set cell = cell.Offset(1, 0)
- 次のセルに移動しています。
cell.Offset(1, 0) は、現在のセルから「1行下」のセルに移動することを意味します。
列の移動は行わず、行だけが1つ下がるという動作です。
これにより、例えば「A1」から「A2」へとセルの操作対象が移動します。
- 次のセルに移動しています。
- Loop
- ループの終了点です。
ここで再び Do While の条件に戻り、次のセルが空白かどうかを確認します。
もしセルが空白でなければ再びループが実行され、セルが空白であればループが終了します。
- ループの終了点です。
- Set cell = Nothing
- オブジェクト参照を解除します。
「Set cell = Nothing」は、オブジェクト変数「cell」の中に保存されていたセルの参照を解放する(消去する)ために使います。
これにより、メモリリークを防ぎ、VBAの動作が軽くなります。
変数を使い終わった後は、このように明示的にメモリを解放することが推奨されます。
- オブジェクト参照を解除します。
- 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
- STEP1変数「cell」を宣言し、初期位置としてセル「A1」を指定
変数「cell」を Range 型として宣言し、最初の対象セルとしてセル「A1」を設定します。
- STEP2Do While ループの開始
セルが空でない間 (cell.Value <> “”)、繰り返し処理を行います。
- STEP3セルの値を確認し、「スキップ」があれば次のセルに移動してスキップ
セルの値が「スキップ」の場合、そのセルを飛ばして次のセルへ移動します。
- STEP4セルの値を「処理済み」に設定
スキップ条件に該当しないセルには、「処理済み」と入力します。
- STEP5次のセルに移動し、ループを続行
セル範囲を順に移動し、すべてのセルが処理されるまでループが繰り返されます。
処理結果
このコードで使用している機能
詳細解説
- Sub 繰り返し例4()
- ここで新しいサブルーチン「繰り返し例4」を定義します。
このコードは、特定のセルをスキップしながら一連の処理を行う仕組みです。
- ここで新しいサブルーチン「繰り返し例4」を定義します。
- Dim cell As Range
- ここでは、「cell」という名前の変数を Range 型として宣言します。
この変数は、セルのデータや位置を扱うために使用されます。
- ここでは、「cell」という名前の変数を Range 型として宣言します。
- Set cell = Range(“A1”)
- オブジェクト変数「cell」にセル「A1」をセットします。
これが最初に処理を開始するセルになります。
「Set ステートメント」を使ってセル範囲オブジェクトを変数に格納します。
- オブジェクト変数「cell」にセル「A1」をセットします。
- Do While cell.Value <> “”
- Do While ループを開始します。
この行は、cell.Value(現在のセルの値)が空でない間、ループが続行されることを示しています。
セルの値が空になるとループは終了します。
- Do While ループを開始します。
- If cell.Value = “スキップ” Then
Set cell = cell.Offset(1, 0)
GoTo Continue ‘ スキップして次のループへ
End If
- If 文で、現在のセルの値が「スキップ」であるかを確認します。
もし「スキップ」であれば、そのセルを飛ばし、「Offset メソッド」を使って次のセルに移動します。
「Offset(1, 0)」によって、現在のセルの1行下のセルが新しい対象となります。
その後、「GoTo Continue」でラベル「Continue」にジャンプして、次のループ処理に進みます。
これにより、スキップ条件に一致するセルの処理を回避します。
- If 文で、現在のセルの値が「スキップ」であるかを確認します。
- cell.Value = “処理済み”
- If 文で「スキップ」に該当しない場合、現在のセルに「処理済み」という文字を入力します。
この処理は「スキップ」でないセルにのみ適用されます。
- If 文で「スキップ」に該当しない場合、現在のセルに「処理済み」という文字を入力します。
- Set cell = cell.Offset(1, 0)
Continue:- 次のセルに移動します。
「Offset(1, 0)」 によって、1行下のセルが新たな対象となります。
「Continue: ラベル」は、「GoTo ステートメント」のジャンプ先を示しています。
ここから再びループ処理に戻ります。
- 次のセルに移動します。
- Loop
- ループの終了です。
この行まで達すると、再び Do While の条件をチェックします。
条件が満たされる限り、再度ループが実行されます。
- ループの終了です。
- Set cell = Nothing
- 処理が完了した後、オブジェクト変数「cell」への参照を「Nothing」に設定してオブジェクト参照を解除します。
これにより、メモリリークを防ぐことができ、不要なリソースが開放されます。
- 処理が完了した後、オブジェクト変数「cell」への参照を「Nothing」に設定してオブジェクト参照を解除します。
- 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
- STEP1変数を宣言し、フォルダのパスを設定
fileName、folderPath、rowの3つの変数を宣言し、フォルダパスと初期の行番号を設定します。
- STEP2最初のファイル名を取得
Dir関数を使って、指定したフォルダ内の最初のファイル名を取得します。
- STEP3ファイル名をセルに出力
取得したファイル名をシートのA1セルから順に出力します。
- STEP4次の行に移動
ファイル名を出力するたびに、次の行(A2、A3)に移動して、次のファイル名を出力します。
- STEP5フォルダ内のすべてのファイルが処理されるまでループ
フォルダ内のすべてのファイル名を取得して、セルに出力するまでループを続けます。
処理結果
このコードで使用している機能
詳細解説
- Sub 繰り返し例5()
- これは、新しいプロシージャ(サブルーチン)を定義するための行です。
「Sub ステートメント」の後に続く名前(ここでは 繰り返し例5)がサブルーチンの名前となります。
この名前は、後でサブルーチンを実行する際に呼び出すためのものです。Sub の終了は End Sub で示されます。
- これは、新しいプロシージャ(サブルーチン)を定義するための行です。
- Dim fileName As String
Dim folderPath As String
Dim row As Long- 「fileName」:各ファイルの名前を保持する文字列型の変数です。
「folderPath」:対象フォルダのパスを保持する文字列型の変数です。
「row」:Excelシートのどの行にファイル名を出力するかを管理する数値型の変数です。
- 「fileName」:各ファイルの名前を保持する文字列型の変数です。
- folderPath = “C:\ファイルパス\”
- この行では、変数「folderPath」にフォルダのパスを代入しています。
ここで指定されたフォルダが、後でファイルを探す対象になります。
「”C:\ファイルパス\”」 のように、フォルダのパスは常に 「\」 で終わるようにしてください。
これにより、後でファイル名とフォルダのパスを正しく結合できます。
- この行では、変数「folderPath」にフォルダのパスを代入しています。
- row = 1
- rowを「1」に初期化します。
これにより、ファイル名の出力をシートのA1セルから開始します。
- rowを「1」に初期化します。
- fileName = Dir(folderPath & “*.*”) ‘ // 最初のファイルを取得
- ここで、Dir 関数が使われています。
Dir 関数は、指定されたフォルダの中にあるファイル名を取得します。
「folderPath & “*.*”」 は、フォルダ内のすべてのファイル(どんな拡張子のファイルも)を対象にする指定です。
「*.*」は、任意のファイル名と任意の拡張子を意味します。
Dir 関数が最初のファイル名を返し、そのファイル名が変数「fileName」に保存されます。
- ここで、Dir 関数が使われています。
- Do While fileName <> “”
- Do While ループの開始行です。
このループは、fileName 変数が空(つまりファイルがもうない)になるまで繰り返されます。
fileName <> “” という条件は、「ファイル名が空でない限りループを続ける」という意味です。
<> は「等しくない」という意味の演算子で、”” は空の文字列を表します。
- Do While ループの開始行です。
- Cells(row, 1).Value = fileName
- Cells(row, 1).Valueは、シートの指定された行のA列にfileNameの値を設定します。
最初はA1セルにファイル名が出力されます。
- Cells(row, 1).Valueは、シートの指定された行のA列にfileNameの値を設定します。
- row = row + 1
- 変数「row」の値を「1」増やします。
これにより、次のファイル名をA2、A3といった次の行に出力する準備ができます。
- 変数「row」の値を「1」増やします。
- fileName = Dir()
- Dir関数を再度呼び出して、フォルダ内の次のファイル名を取得します。
この操作により、ループが続行されます。
- Dir関数を再度呼び出して、フォルダ内の次のファイル名を取得します。
- Loop
- ループの終了です。
この行まで達すると、再び Do While の条件をチェックします。
条件が満たされる限り、再度ループが実行されます。
- ループの終了です。
- End Sub
- この行は、サブルーチンの終了を示しています。
すべてのループ処理が完了した後、サブルーチンが終了し、プログラムは次のステップに進みます。
- この行は、サブルーチンの終了を示しています。
このコードは、指定したフォルダ内のすべてのファイル名を、ExcelのA列に順次出力するための簡単かつ効率的な方法を提供します。
Dir関数を使用してファイル名を取得し、シート上に順に出力する流れを通して、フォルダ内のファイルを簡単に一覧化することが可能です。
まとめ
「Do While文」は、条件に基づいた柔軟な繰り返し処理を行うために非常に有用です。
繰り返し回数が事前に決まっていない場合や、特定の条件が満たされるまで処理を続けたいときに活躍します。
また、Dir関数との組み合わせで、フォルダ内のファイル操作を自動化する際にも力を発揮します。
ポイントのおさらい
この記事の使用例を実践することで、VBAの「Do While文」を効果的に使いこなせるようになります。
まずは、サンプルコードをコピーして実行し、少しずつ自分の業務に応じたアレンジを加えていきましょう。