ファイル操作
EXCEL VBAでのファイル操作で、よく使うものチートシート。
いくつかで、
・通常のステートメントで実行するもの
・FileSystemObjectを使って実行するもの
の両方を載せておく。
使用環境
・Windows11
・EXCEL 2019
ダイアログで選択
ファイル選択ダイアログを表示して、ファイルを選択する。
Dim filePath As Variant
' ファイルを開くダイアログを表示
filePath = Application.GetOpenFilename("EXCEL File,*.xlsx,CSV File,*.csv", 1, "ファイルを選択", , False)
' 返り値は False(Variant/Boolean) or ファイルパス(Variant/String)
If filePath <> False Then
Debug.Print filePath
End If
VBAGetOpenFilename() の第一引数が選択するファイルのフィルタ。
名称とフィルタ内容のセットをカンマ繋ぎで指定する。
第二引数がその内のどれをデフォルトにするか(通常は1で良いはず)。
第三引数がファイル選択ダイアログのタイトル。
第四引数は(Mac版のみ)ボタンテキストを指定。
第五引数が複数選択を許容するかどうか。
単一ファイルを選択させる場合はfalse。
帰り値は、ファイルを選択した場合はファイルパスが文字列として返る。
(第五引数でtrueを指定している場合、選択した数分の配列が返る)
選択をキャンセルした場合はfalse。
存在確認
Dim filePath As String
filePath = "[ファイルパス]"
If Dir(filePath) <> "" Then
Debug.Print "ファイルが存在している"
End If
VBADir()はファイルが存在する場合はファイル名が返り、存在しない場合は空文字が返る。
手軽にやるならこれで事足りるが、何をやっているのか分かりづらくはあるので、丁寧にやるならFileSystemObjectを使った方が良い。
FileSystemObjectを使う場合は以下。
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Dim filePath As String
filePath = "[ファイルパス]"
If fso.FileExists(filePath) Then
Debug.Print "ファイルが存在している"
End If
VBA「Microsoft Scripting Runtime」を参照設定している場合、以下でも良い。
Dim fso As FileSystemObject
Set fso = New FileSystemObject
Dim filePath As String
filePath = "[ファイルパス]"
If fso.FileExists(filePath) Then
Debug.Print "ファイルが存在している"
End If
VBAFileExists()はファイルが存在する場合はtrue、存在しない場合はfalseが返る。
複製(コピー)
FileCopy "[コピー元ファイルパス]", "[コピー先ファイルパス]"
VBA返り値はなく、失敗時はエラーが発生する。
コピー先ファイルが既に存在している場合、上書きされるので注意。
FileSystemObjectを使う場合は以下。
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
fso.CopyFile "[コピー元ファイルパス]", "[コピー先ファイルパス]", True
VBA返り値と失敗時の扱いはFileCopyと同様。
第三引数のTrue/Falseで、上書きを許可するか指定出来る。
省略可能で既定値はTrue=上書き可。
移動、ファイル名変更
Name "[移動元ファイルパス]" As "[移動先ファイルパス]"
VBA返り値はなく、失敗時はエラーが発生する。
移動先ファイルが既に存在している場合、上書きされずにエラーになる。
場所の変更以外に、ファイル名も同様に変更できる。
FileSystemObjectを使う場合は以下。
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
fso.MoveFile "[移動元ファイルパス]", "[移動先ファイルパス]"
VBA返り値と失敗時の扱いや、ファイルが既に存在している場合の扱いはNameと同様。
削除
Kill "[削除するファイルパス]"
VBA返り値はなく、失敗時はエラーが発生する。
読み取り専用ファイルは削除できない。
FileSystemObjectを使う場合は以下。
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
fso.DeleteFile "[削除するファイルパス]", False
VBA返り値と失敗時の扱いはKillと同様。
第二引数のTrue/Falseで、読み取り専用ファイルの削除を許可するか指定出来る。
省略可能で既定値はFalse=削除不可。