Excel VBA で プログラムの基礎を学ぶ!?
■処理 – 繰り返し
次は繰り返しですが、こちらも方法としては色々ありましてですねーw
これもVBAで使用するものを紹介します
・For…Next ステートメント
基本的な繰り返しと言えば「○○から××まで繰り返す」ですね!
使い方はこんな感じで、繰り返す範囲や1回の繰り返しの増減値を指定できたりします
Sub FuncForNext() Dim idx As Integer For idx = 0 To 10 Step 1 Debug.Print "idx = " & idx If idx = 8 Then Exit For End If Next idx For idx = 10 To 0 Step -2 Debug.Print "idx = " & idx Next End Sub
条件によっては、繰り返しをやめたい場合には、「Exit For」で抜け出すことができます!
・For Each…Next ステートメント
もう一つのFor・・「For Each…Next」ステートメントです!
これは、配列やコレクションを指定して、そのグループを最初から最後まで繰り返してくれます
使い方はこんな感じで、あえて、見慣れたFileSystemObjectを使用してみました!
Sub FuncForEachNext(path As String, ptrn As String, data As Collection) Dim fl As File With New FileSystemObject ' pathのファイルを取得 For Each fl In .GetFolder(path).Files ' ファイルパターンに一致するものだけ取り出す If (UCase(fl.name) Like UCase(ptrn)) Then ' Fileオブジェクトをコレクションに格納 Call data.Add(fl) End If Next End With End Sub
FilesプロパティはFileオブジェクトのコレクションですので、ForEachNextステートメントで取り出す場合、Fileオブジェクト型の変数でのみ取り出すことことができます(ちょっとだけ嘘ですがw)
「For Each」と「In」の間の受け側の変数は、「In」の後ろの変数(コレクション)に内包された型の変数でのみ取り出せる!というのかな???
ま、型が一致してないとダメって、怒られます!?(これも微妙に違うw)
配列でFor Eachを使う場合、バリアント型の配列じゃないと・・
Sub FuncForEachNextNG() Dim var As String Dim str(3) As String Dim i As Integer For i = 0 To 3 str(i) = Trim(i) Next i For Each var In str Debug.Print Trim(var) Next End Sub
以下のように、受ける「var」をバリアント型(Variant)で定義することで受け取れますので、「バリアント型の配列」でなくても大丈夫です
Sub FuncForEachNextOK() Dim var As Variant Dim str(3) As String Dim i As Integer For i = 0 To 3 str(i) = Trim(i) Next i For Each var In str Debug.Print Trim(var) Next End Sub
ちなみに、FileSystemObjectのFileオブジェクトを格納したCollectionから、Fileオブジェクトを取り出すにはどうするのか!?ですが・・こうします!
Sub FuncForEachNextCollection(data As Collection) Dim fl As File For Each fl In data Debug.Print fl.Name Next End Sub
Collectionの中身がFileオブジェクトなので、受け側の変数には、バリアント型 の変数、汎用オブジェクト変数や特定のオブジェクト変数が指定できるのです