<スポンサーリンク>

【VBA】サブフォルダまで検索し、特定のシートを実行する方法

この記事は約4分で読めます。
コピーボタン
記事のタイトルとURLをコピー
スポンサーリンク

【VBA】サブフォルダまで検索し、特定のシートを実行する方法

<スポンサーリンク>

VBAを使用して、データベースを構築しようとすると、
・人によってはサブフォルダを使ってきれいにデータを保存している人
・乱雑にデータが並んでいる人
など、様々なデータの持ち方をしていることがわかります。

そこで今回は、サブフォルダーまですべて読み込んで、
ファイルを実するプログラムを書いていきたいと思います。

サブフォルダまで検索し、実行するプログラム紹介

サブフォルダまで検索し、指定した名前と一致した場合にそのファイルを
実行するプログラムは下記の通りです。
↓のプログラムの場合は、「C:\Downloads」の中の「SAMPLE1.xls」を実行しています。

※ダブルクリックでコピーできます。

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
Sub JIKKOU()
 
        Call searchFolder("C:\Downloads")'←検索したいフォルダを指定する。
     
End Sub
 
 
Sub searchFolder(Path As String)
    Dim buf As String, childf As Object
 
'フォルダ内全部
    buf = Dir(Path & "\*.*")
    
    Do While buf <> ""
     
    '名前が一致したら実行するように指示。
    If buf = "SAMPLE1.xls" Then '←ファイル名を指定してください。
     
        With CreateObject("Wscript.Shell")
            .Run Path & "\" & buf
        End With
         
        Exit Sub
 
    End If
    '次のファイル
        buf = Dir()
    Loop
     
    '子フォルダも同様に、subFolderを実行する。
    With CreateObject("Scripting.FileSystemObject")
        For Each childf In .GetFolder(Path).SubFolders
            Call searchFolder(childf.Path)
        Next
    End With
     
End Sub

プログラムの説明

まずは、1階層目を検索するプログラムです。
Dir関数とDo While関数を使って、
・Path内のフォルダを頭からすべて検索していきます。
・その中で(IF文で)、名前が一致したときに、Wscript.Shellでファイルを実行しています。

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
'フォルダ内全部
    buf = Dir(Path & "\*.*")
    Do While buf <> ""
     
    '名前が一致したら実行する場合は↓
    If buf = "SAMPLE1.xls" Then '←ファイル名を指定してください。
     
        With CreateObject("Wscript.Shell")
            .Run Path & "\" & buf
        End With
         
        Exit Sub
 
    End If
    '次のファイル
        buf = Dir()
    Loop

ここまでは、よくある定型文のテクニックです。

ここから、2階層目以降を検索するために、
この部分があります。

1
2
3
4
5
6
'子フォルダも同様に、subFolderを実行する。
With CreateObject("Scripting.FileSystemObject")
    For Each childf In .GetFolder(Path).SubFolders
        Call searchFolder(childf.Path)
    Next
End With

子フォルダに対しても、1階層目と同じ処理をしたいので、
関数内で同じ関数を繰り返しています。

こうすることで、サブフォルダがある限りこの関数内をループし続け、
すべてのファイルを検索することができます。

理解してしまえばそこまで難しいと思いませんので、
是非ご活用ください。

コメント欄

<スポンサーリンク>
タイトルとURLをコピーしました