このページの内容について
このページは、VBAエキスパート(ExcelVBAスタンダード)試験合格講座の第七回記事です。公式テキスト第4章「ファイルの操作」の内容について解説します。ExcelVBA(マクロ)は、Excel上の操作だけではなくその他多くのPC作業を自動化することができます。VBAに備え付けの関数の中にはファイル操作ができる関数が存在します。自分でも手を動かしながら読み進めてください。主に講座受講者の復習での利用を想定しています。
Dir関数
Dir関数は、指定した条件でファイルやフォルダを検索することができます。Dir関数はワイルドカードでファイルやフォルダの検索ができるため、検索結果が複数になることがあります。その場合、最初の呼び出し時は1番目の検索結果が返され、条件を指定せず再度関数を呼び出すことで2番目以降の結果を得ることができます。すべての結果を返した後は「””(空白文字)」を返します。
引数 | 型 | 役割 |
---|---|---|
PathName | Variant(String) | 検索条件を指定します。ワイルドカードを使用することができます。 |
Attributes | vbFileAttribute | vbNormal ・・・ ファイル検索 vbDirectory ・・・ フォルダ+ファイル検索 他にも指定できるものがありますが、公式サイトで確認してください。 |
ファイルを検索する
サンプルコード(クリックでコピー)
Private Sub Test_DirFile()
Dim file_name As String
file_name = Dir(ThisWorkbook.Path & "\*.txt", vbNormal)
Do While file_name <> ""
Debug.Print file_name
file_name = Dir()
Loop
End Sub
実行結果
上記サンプルコードはマクロが格納されたフォルダ内でファイル名に「.txt」を含むファイルを検索し結果(ファイル名)をfile_name変数に格納します。変数の中身をイミディエイトウィンドウに出力したのち、次の検索結果を格納し、検索結果をすべて取得するまで繰り返します。
フォルダ+ファイルを検索する
サンプルコード(クリックでコピー)
Private Sub Test_DirFolder()
Dim folder_name As String
folder_name = Dir(ThisWorkbook.Path & "\*", vbDirectory)
Do While folder_name <> ""
Debug.Print folder_name
folder_name = Dir()
Loop
End Sub
実行結果
上記サンプルコードはマクロが格納されたフォルダ内にあるすべてのフォルダとファイルの名称を取得し、イミディエイトウィンドウに出力します。
使用時の注意点
実は、Dir関数の使用は非推奨であるという解説サイトは多いです。また、VBAエキスパートの試験範囲でもありません。しかし、気を付けるべき点をしっかり理解して使いこなせば非常に強力な機能です。※現時点で私が把握している注意点は2つだけです。
フォルダ検索はフォルダ+ファイル検索
既に説明した通りですが「vbDirectory」は見た目はフォルダ検索ですが、実際にはフォルダ+ファイル検索です。フォルダだけだと考えて処理すると思わぬ結果をまねくことがあります。
呼び出し先で使用するとき
Dir関数を使用した状態で、別の関数を呼び出したとき、呼び出し先でDir関数を使用されると、呼び出し元のDir関数が保持している検索結果がクリアされます。
サンプルコード(クリックでコピー)
Private Sub MultiDir()
Dim folder_name As String
folder_name = Dir(ThisWorkbook.Path & "\*", vbDirectory)
Do While folder_name <> ""
Call DirSubFolder(ThisWorkbook.Path & "\" & folder_name)
folder_name = Dir()
Loop
End Sub
Private Sub DirSubFolder(ByVal folder_path As String)
Dim folder_name As String
If VBA.GetAttr(folder_path) = vbDirectory Then
folder_name = Dir(folder_path, vbDirectory)
Do While folder_name <> ""
Debug.Print folder_name
folder_name = Dir()
Loop
End If
End Sub
実行結果
サンプルコードは、Dir関数でフォルダを検索し、さらに検索したフォルダ内をDir関数で書き出す・・という内容です。しかし、呼び出し元である「MultiDir」でDir関数を使用し、呼び出し先である「DirSubFolder」でもDir関数が使用されています。呼び出し先のDir関数の使用によって呼び出し元のDir関数の検索結果がリセットされるため、呼び出し元ではエラーが発生します。
MkDir関数
フォルダを作成する
引数 | 型 | 役割 |
---|---|---|
Path | String | 作成したいフォルダを絶対パスで指定します。フォルダ名のみ指定すると、実行中のマクロが格納されたフォルダ内に作成されます。 |
サンプルコード(クリックでコピー)
Private Sub Test_MkDir()
Dim new_folder_name As String
Dim new_folder_path As String
new_folder_name = Application.InputBox("作成したいフォルダ名を入力する", "フォルダ名入力受付", "VBAエキスパート", Type:=2)
If new_folder_name = "" Or new_folder_name = "False" Then Exit Sub
new_folder_path = ThisWorkbook.Path & "\" & new_folder_name
If Dir(new_folder_path, vbDirectory) = "" Then
Call MkDir(new_folder_path)
Call MsgBox(new_folder_name & "フォルダを作成しました。", vbInformation)
Else
Call MsgBox(new_folder_name & "フォルダはすでに存在するため、新規に作成できません", vbCritical)
End If
End Sub
実行結果
このサンプルコードでは、ユーザーが入力した名称でマクロと同じ階層にフォルダを作成します。ただしMkDir関数は同じ名前のフォルダがすでに存在する状態でフォルダを作成しようとするとエラーとなるため、Dir関数でフォルダの有無を判定しています。
FileCopy関数
ファイルをコピーする
FileCopy関数はExcelファイルに限らずファイルのコピーを作成することができます。
引数 | 型 | 役割 |
---|---|---|
Source | String | コピーしたいファイルの絶対パスを指定します。 |
Destination | String | コピー先を絶対パスで指定します。ファイル名のみ指定するとコピー元と同じ場所に保存されます。 |
サンプルコード(クリックでコピー)
Private Sub Test_FileCopy()
Dim file_name As String
file_name = Dir(ThisWorkbook.Path & "\*", vbNormal)
If file_name = "" Then Exit Sub
Call VBA.FileCopy(ThisWorkbook.Path & "\" & file_name, "コピー" & file_name)
Call MsgBox(file_name & "をコピーしました")
End Sub
実行結果
このサンプルコードでは、マクロが保存されている階層にあるファイルを同じ階層に一つコピーします。マクロが保存されていないとエラーになります。
Comment