FileSystemObjectを使用できるように準備する
- メニューバーの「ツール」>「参照設定」で参照設定ダイアログボックスが表示する。
- 「参照可能なライブラリファイル」で「Microsoft Scripting Runtime」を探してチェックを入れてOKボタンををクリック。
FileSystemObjectのオブジェクトを生成する
FileSystemObjectを使うには、まずFileSystemObjectのオブジェクトを生成する必要があります。次のコードは、まず1行目でFileSytemObject型の変数を定義しています。2行目でNewキーワードを使用してFileSystemObjectのオブジェクトを生成して、そのオブジェクトの参照をfso変数へ代入しています。
Dim 変数名 As FileSystemObject
Set 変数名 = New FileSystemObject
これでfso変数を使ってFileSystemObjectのオブジェクトを参照できるようになりました。もう1つの方法として、次のように1行で記述することもできます。
Dim 変数名 As New FileSystemObject
このように変数を定義すると、このコードが実行されてもFileSystemObjectのオブジェクトは生成されません。変数が最初に参照されたときにオブジェクトが自動的に生成され変数に格納されます。どちらの方法でも実用上は同じと言って良いので好きな方法を使います。
ファイル(Fileオブジェクト)とフォルダー(Folderオブジェクト)を取得する
特定のファイルを操作したい場合、まず最初にそのファイルを表すFileオブジェクトを取得します。これにはFileSystemObjectオブジェクトのGetFileメソッドを使用します。
FileSystemObjectオブジェクト.GetFile(パス)
同様に特定のフォルダーを操作したい場合は、そのフォルダーを表すFolderオブジェクトをFileSystemObjectオブジェクトのGetFolderメソッドを使って取得します。
FileSystemObjectオブジェクト.GetFolder(パス)
パスに相対パスを指定した場合、カレントフォルダーを基点とした相対パスとして解釈されます。また、渡されたパスのファイルあるいはフォルダーが存在しない場合はエラーとなります。
ファイルの操作
ファイルを移動と名前の変更
ファイルの移動と名前の変更は同じ操作になります。ファイルは移動と同時に名前を変更することができます。このとき、移動元と移動先のフォルダーが同じ場合は単なる名前の変更になります。
ファイルの移動(と名前の変更)には、FileSystemObjectオブジェクトのMoveFileメソッド、またはFileオブジェクトのMoveメソッドを使用します。
はじめにMoveFileメソッドから紹介しましょう。次の例は移動と同時にファイル名の変更を行っています。Source引数には移動もとのパス、Destination引数には移動先のパスを指定します。Destination引数に指定されたファイルが既に存在している場合はエラーになります。
Sub MoveFile1()
Dim fso As New FileSystemObject
fso.MoveFile Source:="C:\macro\source.xlsx", Destination:="C:\macro\dest\dest.xlsx"
End Sub
次のように移動元と移動先が同じフォルダーの場合は単なる名前の変更になります。
fso.MoveFile Source:="C:\macro\source.xlsx", Destination:="C:\macro\dest.xlsx"
単にファイルを別のフォルダーへ移動したい場合は、Destination引数のパスをパス区切り文字で終わらせます。このようにするとDestination引数は移動先の既存フォルダーを指定しているものとみなされます。
fso.MoveFile Source:="C:\macro\source.xlsx", Destination:="C:\macro\dest\"
Source引数にはパスの最後の要素にワイルドカード文字を含めることもできます。このときもDestination引数は移動先の既存フォルダーを指定しているものとみなされます。このようにするとワイルドカードに一致したすべてのファイルをDestination引数で指定したフォルダーへいっぺんに移動できます。
次の例は「C:\macro」フォルダー内の拡張子「.xlsx」を持つすべてのファイルを「C:\macro\dest」フォルダーへ移動します。
fso.MoveFile Source:="C:\macro\*.xlsx", Destination:="C:\macro\dest"
次のFileオブジェクトのMoveメソッドを使って同様の操作を実施してみましょう。このメソッドはFileオブジェクト自身が表すファイルをDestination引数に指定したパスへ移動します。次の例は移動と同時にファイル名も変更しています。
Sub MoveFile2()
Dim fso As New FileSystemObject
Dim f As File
Set f = fso.GetFile("C:\macro\source.xlsx")
f.Move Destination:="C:\macro\dest\dest.xlsx"
MsgBox f.path
End Sub
Moveメソッドを実行するとFileオブジェクトも移動後のファイルを表すようになります。そのため最後のメッセージボックスには「C:\macro\dest\dest.xlsx」が表示されます。
ファイルを別のフォルダーへ移動したい場合は、FileSystemObjectオブジェクトのMoveFileメソッド同様にDestination引数のパスをパス区切り文字で終わらせます。こうするとやはりDestination引数は移動先の既存フォルダーを指定しているものとみなされます。
Set f = fso.GetFile("C:\macro\source.xlsx")
f.Move Destination:="C:\macro\dest\"
最後の区切り文字をつけ忘れると名前の変更になってしまうので注意してください。
Fileオブジェクトは既存の1つのファイルを表すので、FileSystemObjectオブジェクトのMoveFileメソッドのようにワイルドカードを使用して複数のファイルを一度に移動するような操作はできません。
ファイルを削除する
ファイルを削除するにはFileオブジェクトのDeleteメソッドを使用します。次の例はブックと同じフォルダー内の「delete.xlsx」を削除します。
Sub DeleteFile()
Dim fso As New FileSystemObject
Dim path As String
path = fso.BuildPath(ThisWorkbook.path, "delete.xlsx")
fso.GetFile(path).Delete
End Sub
FileSystemObjectオブジェクトのDeleteFileメソッドを使ってファイルを削除することもできます。メソッドの引数にはファイルのパスを文字列で指定します。
fso.DeleteFile (fso.BuildPath(ThisWorkbook.path, "delete.xlsx"))
フォルダーの操作
フォルダー内のすべてのファイルを取得する
フォルダー内にあるすべてのファイルを取得するにはFolderオブジェクトのFilesプロパティを使用します。SubFoldersプロパティは、Filesオブジェクトを返します。
フォルダー内のすべてのサブフォルダーを取得する
フォルダー内にあるすべてのサブフォルダーを取得するにはFolderオブジェクトのSubFoldersプロパティを使用します。SubFoldersプロパティは、Foldersオブジェクトを返します。
Folderオブジェクト.SubFolders
フォルダーのパスとファイル名を結合する
フォルダーパスとファイル名を結合してファイルへのパスを構築したい場合があります。まず思いつくのは次のように文字列の結合を使って