make is.dev make it simple. development.
2024年11月17日

ファイル操作

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
VBA

GetOpenFilename() の第一引数が選択するファイルのフィルタ。
名称とフィルタ内容のセットをカンマ繋ぎで指定する。

第二引数がその内のどれをデフォルトにするか(通常は1で良いはず)。

第三引数がファイル選択ダイアログのタイトル。

第四引数は(Mac版のみ)ボタンテキストを指定。

第五引数が複数選択を許容するかどうか。
単一ファイルを選択させる場合はfalse。

帰り値は、ファイルを選択した場合はファイルパスが文字列として返る。
(第五引数でtrueを指定している場合、選択した数分の配列が返る)
選択をキャンセルした場合はfalse。

存在確認

Dim filePath As String
filePath = "[ファイルパス]"

If Dir(filePath) <> "" Then
    Debug.Print "ファイルが存在している"
End If
VBA

Dir()はファイルが存在する場合はファイル名が返り、存在しない場合は空文字が返る。
手軽にやるならこれで事足りるが、何をやっているのか分かりづらくはあるので、丁寧にやるなら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
VBA

FileExists()はファイルが存在する場合は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=削除不可。