スポンサーリンク
はじめに:VBAでファイルのコピー・移動などを行う
前回の記事で、Excel VBAのFileSystemObjectというものにちょっと言及した。
今回はそれに絡め、ファイルのコピー・移動などの処理をVBAで記述する方法を扱う。
ただ、VBAでファイルのコピー・移動などを行う記述は、正解は1つではない。
大きく、次の3つに分けられると言える。
FileSystemObjectを全く使わない方法
単にNameとかFileCopyとかの処理を記述して、FileSystemObjectを使う面倒な処理を経由しないものだ。
お手軽なので、ワイルドカードを使うとか凝った処理をしなくて良いなら、基本的にこの方法を使えば良いだろう。
FileSystemObjectを使う方法
ワイルドカードを使えるとか、上書き保存するかどうかを指定できるとか、ちょっとしたオプションが使えるので、そういうことをしたいときはFileSystemObjectを使う方法で良いだろう。
FileSystemObject―Fileオブジェクトを使う方法
ワイルドカードとか使えないし、FileSystemObjectを使う方法の下位互換ではないかと思う。
自分で好んで使う必要はないと思うが、書かれたのを見て何となく分かる程度になっとけば良いかなと。
さて次項からは、ファイルのコピー・移動など各種処理について、お手軽な順に
(1)FileSystemObjectを全く使わない方法
(2)FileSystemObjectを使う方法
(3)FileSystemObject―Fileオブジェクトを使う方法
の各記述方法を示していく。
厳密に言えば、処理を掛ける前にDir関数などで、対象とするファイルが存在するのかチェックを掛ける記述も入れるべきなのだが、そういうのは省略してソースコードを記述する。
ファイル名を変更する
Name
- Asを使うのがポイント。このNameは、後述するがファイル移動にも使える。
1 |
Name "C:\tmp\普通のファイル.xls" As "C:\tmp\普通のファイル002.xls" |
File.Name
- (変更後のファイル名)は、フルパスではなく、「普通のファイル.xls」のように、単なるファイル名で指定する。
1 2 3 4 5 6 7 8 9 |
'VBEで「ツール」→「参照設定」から、 '「Microsoft Scripting Runtime」にチェックを付けて使用する Dim FSO As New FileSystemObject 'Fileオブジェクト Dim FSOFile As File Set FSOFile = FSO.GetFile("C:\tmp\普通のファイル.xls") 'ファイル名変更 FSOFile.Name = "普通ではないファイル.xls" |
ファイルを移動する
Nameの変形
一番最初に紹介したNameについて、別フォルダに移動したことをもって、それをファイル名変更の一種とみなす方法だ。
Nameは本来
Name (元のファイル名のフルパス) As (変更後のファイル名のフルパス)
と記述するが、これを
とすれば良い。
1 |
Name "C:\tmp\普通のファイル.xls" As "C:\tmp\別フォルダ\普通のファイル.xls" |
FileSystemObject.MoveFile
- (変更後のファイル名のフルパス)について、既に同名ファイルが存在する場合はエラーになる。
- ワイルドカードを使って、拡張子とかファイル名に「○という文字を含む」条件を指定して、それに合致するものを全て移動するという処理もできる。
1 2 3 4 5 6 7 8 9 10 |
'VBEで「ツール」→「参照設定」から、 '「Microsoft Scripting Runtime」にチェックを付けて使用する Dim FSO As New FileSystemObject '別フォルダに移動する。 'フォルダ名の後に必ず「\」を付ける。 FSO.MoveFile "C:\tmp\普通のファイル.xls", "C:\tmp\別フォルダ\" 'ワイルドカードを使って、拡張子に「xls」を含むExcelファイルを全て別フォルダに移動する例 FSO.MoveFile "C:\tmp\*.xls*", "C:\tmp\別フォルダ\" |
File.Move
- ワイルドカードとか使えないし、特にこちらの記述を使う必要はないだろう。
1 2 3 4 5 6 7 8 9 10 11 |
'VBEで「ツール」→「参照設定」から、 '「Microsoft Scripting Runtime」にチェックを付けて使用する Dim FSO As New FileSystemObject 'Fileオブジェクト Dim FSOFile As File Set FSOFile = FSO.GetFile("C:\tmp\普通のファイル.xls") '別フォルダに移動する。 'フォルダ名の後に必ず「\」を付ける。 FSOFile.Move "C:\tmp\別フォルダ\" |
ファイルをコピーする(ファイル名そのまま、コピー先のフォルダを指定する)
FileSystemObject.CopyFile
- ワイルドカードを使って、拡張子とかファイル名に「○という文字を含む」条件を指定して、それに合致するものを全てコピーするという処理もできる。
- 最後の引数にoverwritefilesというのを指定して、同名ファイルがあったら上書きするかどうかも指定できる。
これは通常は省略してよいだろう。省略した場合はTrue扱いで、上書きされることになる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
'VBEで「ツール」→「参照設定」から、 '「Microsoft Scripting Runtime」にチェックを付けて使用する Dim FSO As New FileSystemObject '別フォルダにファイル名はそのままでコピーする。 'フォルダ名の後に必ず「\」を付ける。 '最後の引数overwritefilesは省略可能。 'デフォルトはTrueで、同名ファイルがあったら上書きする。 'Falseにすると、同名ファイルがあったらエラー。 FSO.CopyFile "C:\tmp\普通のファイル.xls", "C:\tmp\別フォルダ\", overwritefiles:=True 'ワイルドカードを使って、拡張子に「xls」を含むExcelファイルを全て別フォルダにコピーする例 FSO.CopyFile "C:\tmp\*.xls*", "C:\tmp\別フォルダ\", overwritefiles:=True |
File.Copy
1 2 3 4 5 6 7 8 9 10 11 |
'VBEで「ツール」→「参照設定」から、 '「Microsoft Scripting Runtime」にチェックを付けて使用する Dim FSO As New FileSystemObject 'Fileオブジェクト Dim FSOFile As File Set FSOFile = FSO.GetFile("C:\tmp\普通のファイル.xls") '別フォルダにファイル名はそのままでコピーする。 'フォルダ名の後に必ず「\」を付ける。 FSOFile.Copy "C:\tmp\別フォルダ\", overwritefiles:=True |
ファイルをコピーする(ファイル名をフルパスで指定)
FileCopy
- (変更後のファイル名のフルパス)は、フォルダのパスだけ示しても駄目。必ずファイルのフルパスで指定する。
- (変更後のファイル名のフルパス)について、既に同名ファイルが存在する場合は、上書き保存される。
1 |
FileCopy "C:\tmp\普通のファイル.xls", "C:\tmp\普通のファイル002.xls" |
FileSystemObject.CopyFile
- ワイルドカードを使って、拡張子とかファイル名に「○という文字を含む」条件を指定して、それに合致するものを全てコピーするという処理もできる。
- 最後の引数にoverwritefilesというのを指定して、同名ファイルがあったら上書きするかどうかも指定できる。
これは通常は省略してよいだろう。省略した場合はTrue扱いで、上書きされることになる。
1 2 3 4 5 6 7 8 9 |
'VBEで「ツール」→「参照設定」から、 '「Microsoft Scripting Runtime」にチェックを付けて使用する Dim FSO As New FileSystemObject 'ファイル名をフルパスで指定してコピーする。 '最後の引数overwritefilesは省略可能。 'デフォルトはTrueで、同名ファイルがあったら上書きする。 'Falseにすると、同名ファイルがあったらエラー。 FSO.CopyFile "C:\tmp\普通のファイル.xls", "C:\tmp\普通のファイル002.xls", overwritefiles:=True |
File.Copy
- ワイルドカードとか使えないし、特にこちらの記述を使う必要はないだろう。
- 最後の引数にoverwritefilesというのを指定して、同名ファイルがあったら上書きするかどうかも指定できる。
これは通常は省略してよいだろう。省略した場合はTrue扱いで、上書きされることになる。
1 2 3 4 5 6 7 8 9 10 |
'VBEで「ツール」→「参照設定」から、 '「Microsoft Scripting Runtime」にチェックを付けて使用する Dim FSO As New FileSystemObject 'Fileオブジェクト Dim FSOFile As File Set FSOFile = FSO.GetFile("C:\tmp\普通のファイル.xls") 'ファイル名をフルパスで指定してコピーする。 FSOFile.Copy "C:\tmp\普通のファイル002.xls", overwritefiles:=True |
ファイルを削除する
Kill
- (削除するファイル名のフルパス)には、ワイルドカードも使える。
1 |
Kill "C:\tmp\削除するフォルダ\削除するファイル.xls" |
FileSystemObject.DeleteFile
- 最後の引数Forceを、省略せずTrueを明示指定した方が良いかもしれない。そうすれば読み取り専用ファイルも削除されるようになる。
1 2 3 4 5 6 7 8 9 10 |
'VBEで「ツール」→「参照設定」から、 '「Microsoft Scripting Runtime」にチェックを付けて使用する Dim FSO As New FileSystemObject '最後の引数Forceは、デフォルトはFalse 'Trueを指定すると、読み取り専用ファイルも含めて削除する FSO.DeleteFile "C:\tmp\削除するフォルダ\削除するファイル.xls", Force:=True 'ワイルドカードを使って、拡張子に「xls」を含むExcelファイルを全て削除する例 FSO.DeleteFile "C:\tmp\削除するフォルダ\*.xls*", Force:=True |
File.Delete
- ワイルドカードとか使えないし、特にこちらの記述を使う必要はないだろう。
- 最後の引数Forceを、省略せずTrueを明示指定した方が良いかもしれない。そうすれば読み取り専用ファイルも削除されるようになる。
1 2 3 4 5 6 7 8 9 10 11 |
'VBEで「ツール」→「参照設定」から、 '「Microsoft Scripting Runtime」にチェックを付けて使用する Dim FSO As New FileSystemObject 'Fileオブジェクト Dim FSOFile As File Set FSOFile = FSO.GetFile("C:\tmp\削除するフォルダ\削除するファイル.xls") '最後の引数Forceは、デフォルトはFalse 'Trueを指定すると、読み取り専用ファイルも含めて削除する FSOFile.Delete Force:=True |
スポンサーリンク