個人的に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