【VBA】Excelマクロでファイルをコピーする方法

VBA
Image by Goumbik from Pixabay
スポンサーリンク

FileCopyを使えばファイルコピーを自動化できます。

Sub test()

FileCopy "C:\Users\HTOM\Desktop\Book1.xlsx", "C:\Users\HTOM\Desktop\Book1_copy.xlsx"

End Sub

フォルダーごとコピーすることも可能です。

Sub test()

originalFolder = "C:\Users\HTOM\Desktop\original"
copyFolder = "C:\Users\HTOM\Desktop\copy"
MkDir (copyFolder)

file = Dir(originalFolder & "\" & "*")
Do While file <> ""
    FileCopy originalFolder & "\" & file, copyFolder & "\" & file
    file = Dir()
Loop

End Sub

ファイルをコピーする方法

Sub test()

FileCopy "C:\Users\HTOM\Desktop\Book1.xlsx", "C:\Users\HTOM\Desktop\Book1_copy.xlsx"

End Sub

デスクトップの”Book1.xlsx”を”Book1_copy.xlsx”としてデスクトップにコピーします。

FileCopyの後に、コピーしたいファイルのパスとコピー後のパスを入れます。

デスクトップにある”Book1.xlsx”のパスは“C:\Users\[ユーザー名]\Desktop\Book1.xlsx”です。

上記コードではファイル名を”Book1_copy.xlsx”に変えています。

これでファイルがコピーできました。

このままではちょっと使いづらいので変数を使って切り分けましょう。

Sub test()

originalFolder = "C:\Users\HTOM\Desktop"
originalName = "Book1.xlsx"
copyFolder = "C:\Users\HTOM\Desktop"
copyName = "Book1_copy.xlsx"

FileCopy originalFolder & "\" & originalName, copyFolder & "\" & copyName

End Sub

コピー元とコピー先のパスを変数にしました。

originalFolder :コピー元のフォルダのパスを貼り付ける
originalName :コピー元ファイルの名前を入力する
copyFolder   :コピー先のフォルダのパスを貼り付ける
copyName   :コピー後のファイル名を入力する

こうすると使いやすいでしょう。

パスってどうやったらわかるの。

上にあるバーをクリックしたら全選択されるのでコピペしてください。

仮にコピー先をドキュメントフォルダにしたいなら、そのアドレスバーをコピーしてcopyFolderに貼り付ければ大丈夫です。

同名ファイルが存在する場合

コピー先に既に同名ファイルがある場合は上書き保存されます。

元々入っていた大事なファイルを上書きしちゃった。。。

なんてことにならないように注意したいですね。

そこでファイルコピーを実行する前に、同名ファイルが存在するかチェックしましょう。

Sub test()

originalFolder = "C:\Users\HTOM\Desktop"
originalName = "Book1.xlsx"
copyFolder = "C:\Users\HTOM\Desktop"
copyName = "Book1_copy.xlsx"

If Dir(copyFolder & "\" & copyName) = "" Then
    FileCopy originalFolder & "\" & originalName, copyFolder & "\" & copyName
Else
    MsgBox copyName & "がコピー先に存在します。"
End If

End Sub

Dirは()の中に入れたパスのファイルが存在するかを確認する関数です。

もし存在するならそのファイル名を返し、存在しないならカラの文字(“”)を返します。

つまり既に同名ファイルが存在しないならDirは””ですので、これをif文でチェックしましょう。

Dirが””ならそのままコピーし、カラじゃないなら同名ファイルがあることを伝えます。

これで重要なファイルを上書き保存してしまう危険性がなくなりましたね。

フォルダーごとファイルをコピーする方法

ファイル1つだけではなく、フォルダごと複数ファイルをコピーしたい場合もあります。

デスクトップにある”original”フォルダに4つのファイルがあるとしましょう。

これらをフォルダごとコピーする方法は2つ。

①フォルダを新規作成して中身をコピーする
②FileSystemObjectでコピーする

②の方法は次節で解説しますので今回は①を実装します。

新規フォルダを作成する

Sub test()

MkDir ("C:\Users\HTOM\Desktop\copy")

End Sub

コピー先のフォルダとしてデスクトップに”copy”フォルダを作りましょう。

MkDir()の中に新規作成したい場所とフォルダ名を足したパスを入れましょう。

これでフォルダを作成できました。

フォルダの中身をコピーする

MkDirで作ったフォルダの中に全ファイルをコピーします。

Sub test()

file = Dir("C:\Users\HTOM\Desktop\original\" & "*")
Do While file <> ""
    MsgBox file
    file = Dir()
Loop

End Sub

元々ある”original”フォルダの中身にアクセスしましょう。

Dir()に中身を確認したいフォルダのパスを入れてください。

ここで大事なのはワイルドカード(*)です。

ワイルドカードは任意の文字に対応するので、”Book1.xlsx”でも”Book2.xlsx”でもOKです。

これをloop文で繰り返し処理にかけましょう。

Dir()と打てば次の該当ファイルにアクセスできます。

もし全ファイルにアクセス終了したらカラ””になるので、その時がloop文の終わりです。

各ファイルの名前が手に入ったら、あとはFileCopyをするだけです。
Sub test()

file = Dir("C:\Users\HTOM\Desktop\original\" & "*")
Do While file <> ""
    FileCopy "C:\Users\HTOM\Desktop\original\" & file, "C:\Users\HTOM\Desktop\copy\" & file
    file = Dir()
Loop

End Sub

ここまでの一連のコードをつなげたら完成です。

Sub test()

originalFolder = "C:\Users\HTOM\Desktop\original"
copyFolder = "C:\Users\HTOM\Desktop\copy"
MkDir (copyFolder)

file = Dir(originalFolder & "\" & "*")
Do While file <> ""
    FileCopy originalFolder & "\" & file, copyFolder & "\" & file
    file = Dir()
Loop

End Sub

コピー元フォルダを変えたいならoriginalFolderを、コピー先を変えたいならcopyFolderを編集してくださね。

FileSystemObject

これまで紹介したファイルやフォルダのコピーはFileSystemObjectでも実装可能です。

手法が変わるだけで実行結果はFileCopyと変わりません。

インスタンスの作成

Sub test()

Dim FSO As Object
Set FSO = CreateObject("Scripting.FileSystemObject")

End Sub

今回使うFileSystemObjectは道具箱みたいなものです。

まずは箱(インスタンス)を作りましょう。

すると”ファイルをコピーする道具”や”フォルダをコピーする道具”を使うことができます。

Dimは変数の宣言です。FSOという名前の変数を作っています。

Setで変数FSOとしてインスタンス(道具箱)を作成しましょう。

FSOとかインスタンスとか色々ありますが、決まり文句なので覚えなくても大丈夫です。

最後にCreateObject(“Scripting.FileSystemObject”)で箱を作れます。

これで変数名FSOとして道具箱が使えるようになりました。

ファイルをコピーする

Sub test()

Dim FSO As Object
Set FSO = CreateObject("Scripting.FileSystemObject")

FSO.Copyfile "C:\Users\HTOM\Desktop\Book1.xlsx", "C:\Users\HTOM\Desktop\Book1_copy.xlsx"

End Sub

ファイルをコピーする場合は、Copyfileを使いましょう。

渡すパスはこれまでのFileCopyと同じように、コピー元とコピー先のパスです。

フォルダをコピーする

Sub test()

Dim FSO As Object
Set FSO = CreateObject("Scripting.FileSystemObject")

FSO.Copyfolder "C:\Users\HTOM\Desktop\original", "C:\Users\HTOM\Desktop\copy"

End Sub

フォルダごとコピーしたいなら、Copyfolderです。

これもコピー元のフォルダのパスとコピー先のパスを渡しましょう。

すると中身ごと一気にコピーしてくれます。

ファイルを移動する

Sub test()

Dim FSO As Object
Set FSO = CreateObject("Scripting.FileSystemObject")
FSO.Movefile "C:\Users\HTOM\Desktop\Book1.xlsx", "C:\Users\HTOM\Documents\"

End Sub

ファイルをコピーではなく移動したいなら、Movefileを使います。

上記はデスクトップにある”Book1.xlsx”をドキュメントフォルダに移動するコードです。

まとめ:ファイルをコピーする方法について解説

今回はファイルをコピーする方法を解説しました。

面倒な事務作業を一瞬で終わらせられるので便利ですね。

コメント

タイトルとURLをコピーしました