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

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

【筆者プロフィール】

・プログラミング未経験からVBAとPythonを独学

・業務自動化と機械学習を仕事に取り入れた

こんな私が書いた当記事は以下の人におススメです。

・VBAで業務効率を上げたい
・非IT社員だけどプログラミングを武器にしたい
・初心者や未経験者にもわかりやすい解説がいい

Excelマクロでファイルをコピーする方法まとめ

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

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()の中に新規作成したい場所とフォルダ名を足したパスを入れましょう。

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

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

フォルダ内の全ファイルにアクセスする
Sub test()

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

End Sub

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

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

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

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

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

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

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

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

MsgBoxで”Book1.xlsx”~”Book4.xlsx”が拾えたか確認しておきます。

無事アクセスできているなら後はFileCopyを使うだけです。

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という名前の変数を作っています。

HTOM

ここは何となくの理解大丈夫です。

Setで変数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でOK。

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

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

さっきのチマチマしたコピー方法は何だったんだよ。

先ほどのDirで中身にアクセスする方法なら、必要なファイルだけをコピーすることも可能です。

HTOM

中身を全てコピーするだけならFSOの方がラクですね。

ファイルを移動する

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”をドキュメントフォルダに移動するコードです。

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

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

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

おススメ書籍

こんな人におススメ:VBAの基礎を理解している人。平均レベルの一歩上を行きたい人。

こんな人におススメ:プログラミング初学者。実務への応用よりも基礎知識を求めている人。

VBA
スポンサーリンク
HTOMblog

コメント

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