個人的にVBAがすごく好きなのですが、触れる機会がめっきり減ってしまったので忘れないようにメモ。

脱エクセル!って流行っていたような気がしますが、最近は活エクセル!ってのもよく見かける。
基本的にWindows環境でしか実行できないため、どうしても必要な場合は GAS (Google Apps Script) も合わせて検討したりしなかったり…

VBAで使えるループ処理

VBAでは「For Next」「While」「For Each」3つのステートメントを使用してループ処理を行うことができる。
それぞれの特徴は以下の通り。

  • ステートメント
  • 特徴
  • For Next
  • 開始~終了まで、ループ回数を数値で指定して実行
  • While
  • 指定の値に到達するまで処理をループさせる
  • For Each
  • 配列の要素数とか、オブジェクト数など、対象の数だけ処理をループする

それぞれの基本書式

For Next

dim i as Long: for i = 1 to 10
    '処理を記述
next

While

Dim i As Long: i = 1
While i < 10
    '処理を記述
Wend

For Each

Dim arr() As Variant: arr = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
Dim buf As Variant: For Each buf In arr
    '処理を記述
Next

■ For Next

Step

Stepステートメントを使用することで、カウンタ値の増減数を変更可能。

dim i as Long: for i = 1 to 10 step 5
    '処理を記述
next

マイナスの値を指定して、ループを逆から処理することも可能。

dim i as Long: for i = 10 to 1 step -5
    '処理を記述
next

Exit For

ループから抜ける場合に使用する。

dim i as Long: for i = 1 to 10
    '処理を記述
    Exit For
next

■ While

種類がいくつかある。覚えてられないので基本的には「Do While Loop」を使用している☹

While Wend

条件式がTrueであれば、処理を繰り返す。

Dim i As Long: i = 1
While i < 10
    '処理を記述
    i = i + 1
Wend

Do While Loop

While Wend と書き方は、ほとんど同じ。

Dim i As Long: i = 1
Do While i < 10
    '処理を記述
    i = i + 1
Loop

Do Loop While

処理を先に記述し、条件を後に記述する。

Dim i As Long: i = 1
Do
    '処理を記述
    i = i + 1
Loop While i < 10

Exit Do

ループから抜ける場合に使用する。「While Wend」では使えない。

Dim i As Long: i = 1
Do While i < 10
    '処理を記述
    Exit Do
Loop

■ For Each

上記でもチラッと書いたが、配列の要素数とか、オブジェクト数など、対象の数だけ処理をループする。

配列の数だけループしたい場合

Dim arr() As Variant: arr = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
Dim buf As Variant: For Each buf In arr
    '処理を記述
Next

フォルダ内のファイル名をすべて取得する、とかに使う

説明するよりもサンプルを組んだほうがラクそうってことで、
以下は、デスクトップにあるファイル名を全て取得して、セルに出力していくサンプル。

'デスクトップのパス取得
Dim WSS As Object: Set WSS = CreateObject("WScript.Shell")
Dim DesktopPath  As String: DesktopPath = WSS.SpecialFolders("Desktop") & "\"

'FieSystemオブジェクト
Dim SFO As Object: Set SFO = CreateObject("Scripting.FileSystemObject")

Dim i As Long: i = 1
Dim File As Variant: For Each File In SFO.getfolder(DesktopPath).Files
    Cells(i, 1).Value = File.Name
    i = i + 1
Next

参考

Excel Visual Basic for Applications (VBA) リファレンス