Excel VBA で プログラムの基礎を学ぶ!?

ページ番号: 1 2 3 4 5 6

■処理 – 繰り返し

次は繰り返しですが、こちらも方法としては色々ありましてですねー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
Excel VBA で プログラムの基礎を学ぶ!? 1
配列は型が違うと怒られる

以下のように、受ける「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オブジェクトなので、受け側の変数には、バリアント型 の変数、汎用オブジェクト変数や特定のオブジェクト変数が指定できるのです

ページ番号: 1 2 3 4 5 6
広告

やもす ʕ•͡-•ʔ

のんびり!のほほん!がモットーです!w 蕎麦食いたい ライブ行きたい 暑いの嫌い

シェアする