ES000007_VBAエキスパート(ExcelVBAスタンダード)合格講座/第七回:ファイル操作系関数

VBAエキスパート(ExcelVBAスタンダード)合格講座/第七回:ファイル操作系関数 ExcelVBA Standard

このページの内容について

このページは、VBAエキスパート(ExcelVBAスタンダード)試験合格講座の第七回記事です。公式テキスト第4章「ファイルの操作」の内容について解説します。ExcelVBA(マクロ)は、Excel上の操作だけではなくその他多くのPC作業を自動化することができます。VBAに備え付けの関数の中にはファイル操作ができる関数が存在します。自分でも手を動かしながら読み進めてください。主に講座受講者の復習での利用を想定しています。

Dir関数

Dir関数は、指定した条件でファイルやフォルダを検索することができます。Dir関数はワイルドカードでファイルやフォルダの検索ができるため、検索結果が複数になることがあります。その場合、最初の呼び出し時は1番目の検索結果が返され、条件を指定せず再度関数を呼び出すことで2番目以降の結果を得ることができます。すべての結果を返した後は「””(空白文字)」を返します。

引数役割
PathNameVariant(String)検索条件を指定します。ワイルドカードを使用することができます。
AttributesvbFileAttributevbNormal  ・・・ ファイル検索
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関数でフォルダのみを検索する方法は用意されていません。フォルダのみに絞るには様々な工夫が必要です。試験範囲から離れてしまうので、解説は外部サイトに譲ります。

使用時の注意点

実は、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関数

フォルダを作成する

引数役割
PathString作成したいフォルダを絶対パスで指定します。フォルダ名のみ指定すると、実行中のマクロが格納されたフォルダ内に作成されます。

サンプルコード(クリックでコピー)

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ファイルに限らずファイルのコピーを作成することができます。

引数役割
SourceStringコピーしたいファイルの絶対パスを指定します。
DestinationStringコピー先を絶対パスで指定します。ファイル名のみ指定するとコピー元と同じ場所に保存されます。

サンプルコード(クリックでコピー)

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

実行結果

このサンプルコードでは、マクロが保存されている階層にあるファイルを同じ階層に一つコピーします。マクロが保存されていないとエラーになります。

【PR】VBAエキスパート試験対策記事

当サイトでは、オデッセイコミュニケーションズ社が運営する試験であるVBAエキスパートExcel VBA ベーシックExcel VBA スタンダード)の出題範囲をベースに用語や各種関数の解説などを行っています。試験合格に向けて必須と言われる公式テキストに沿って解説をしています。受験をするか悩んでいる方、テキストとは別視点の解説を見てみたい方、受験はしないがExcelVBA(マクロ)に興味がある方へ向けた記事です。

Comment