エクセルVBAでファイルをコピーするとき上書き保存を確認する

エクセルVBAでファイルをコピーする場合、FileCopy ステートメントを使います。FileCopy ステートメントは使いやすいですが、無条件にファイルをコピーします。同じファイルが指定したフォルダにあった場合でも、上書き保存してしまいます。これでは困る! といった場合に、同じファイルが存在した場合、それをメッセージを出して確認することができます。ここでは、エクセルVBAで、同じファイルがあった場合、確認メッセージを出して、上書き保存するかコピーをキャンセルするか選択して、処理する方法を紹介しています。これなら、上書き保存される心配はありません。エクセルVBAでコピーをする時、上書き保存したい場合は、「OK」ボタンをクリックするだけで上書き保存できます。

 

 

FileCopy ステートメント

ファイルをコピーするには、FileCopy ステートメントを使います。

FileCopy ステートメントの構文

FileCopy source, destination

 source は、コピー元の場所を表すファイルのパス、 destination は、コピー先のファイルの場所を表すパスを指定します。

 

 

FileCopy は無条件で上書きコピーする

エクセルVBAでファイルをコピーする場合、FileCopy ステートメントを使いますが、使用する場合は幾つか注意する点があります。

destination で指定したファイル名と、同じファイル名がコピー先のフォルダにあった場合、ファイルは上書きされます。

FileCopy ステートメントは、確認のメッセージが出ることなく、無条件に上書きするので、上書きされないようにするには、指定したファイル名と同じファイル名がコピー先のフォルダにあった場合、確認メッセージを出すように設定する必要があります。

それには、Dir 関数を使って確認します。

ファイルの存在を確認してからファイルをコピー

エクセルVBAでファイルをコピーする時に、指定したフォルダに同じファイルがあったら、メッセージを出すコードです。

同じファイル名がなかったら、そのままファイルがコピーされます。同じファイル名があったら、メッセージが出て上書き保存されません。

「お客様専用」フォルダにある「契約者名」ファイルを、「2018年度契約」フォルダにコピーしてみましょう。

「2018年度契約」フォルダに、「契約者名」ファイルがあったら、メッセージがでます。

Sub ファイルの所在確認()
If Dir(“D:\2018年度契約\契約者名.xls”) = “” Then
FileCopy “D:\お客様専用\契約者名.xls”, “D:\2018年度契約\契約者名.xls”
Else
MsgBox “D:\2018年度契約\契約者名.xls” & vbCrLf & _
“が存在します。”, vbInformation
End If
End Sub

 

 

上書きのメッセージを出してキャンセルまたは上書き保存する

エクセルVBAでファイルをコピーする時に、上書き保存の確認メッセージを出すコードです。

指定したフォルダに同じファイルがあったら、「上書き保存」するか、「キャンセル」するかメッセージを出して、どちらか選択してファイルをコピーします。

Sub ファイルの上書き保存を確認()
Dim rc As VbMsgBoxResult
rc = MsgBox(“同じファイルが存在します。” & vbCrLf & _
“上書きしますか?”, vbYesNo + vbQuestion)
If Dir(“D:\2018年度契約\契約者名.xls”) = “” Then
FileCopy “D:\お客様専用\契約者名.xls”, “D:\2018年度契約\契約者名.xls”
ElseIf rc = vbNo Then
MsgBox “処理を中止します”, vbCritical
Else
FileCopy “D:\お客様専用\契約者名.xls”, “D:\2018年度契約\契約者名.xls”
MsgBox “上書き保存しました。”, vbInformation
End If
End Sub

「vbYesNo」は、「はい」ボタンと「いいえ」ボタンを表示します。

「OK」ボタンと「キャンセル」ボタンを表示したい場合は、「vbOKCancel」を指定します。

 

 

ファイルの名前を変更してコピー

エクセルVBAで、ファイルの名前を変更してコピーするコードです。

「お客様専用」フォルダにある「契約者名」ファイルを、「2018年度契約」フォルダに、「契約№登録表」とファイル名を変更してコピーしてみましょう。

「2018年度契約」フォルダに、「契約者名」ファイルがあったら、メッセージがでます。

「いいえ」のボタンをクリックすると、処理がキャンセルされます。

「はい」のボタンをクリックすると、「2018年度契約」フォルダに、「契約者名」ファイルとは別に、「契約№登録表」ファイルが作成されます。

Sub 上書き保存を確認して別名でファイルをコピー()
Dim rc As VbMsgBoxResult
rc = MsgBox(“同じファイルが存在します。” & vbCrLf & _
“上書きしますか?”, vbYesNo + vbQuestion)
If Dir(“D:\2018年度契約\契約者名.xls”) = “” Then
FileCopy “D:\お客様専用\契約者名.xls”, “D:\2018年度契約\契約№登録表.xls”
ElseIf rc = vbNo Then
MsgBox “処理を中止します”, vbCritical
Else
FileCopy “D:\お客様専用\契約者名.xls”, “D:\2018年度契約\契約№登録表.xls”
MsgBox “上書き保存しました。”, vbInformation
End If
End Sub

ファイルの存在を確認

エクセルVBAで、ファイルの存在を確認するには、Dir関数を使います。ここではエクセルVBAでファイルをコピーする時、上書き保存の確認する場合に使いました。FileCopy ステートメントはコピー元のファイルがなかったり、指定したフォルダがなかった場合にエラーになるので、コピー元のファイルや、コピー先のフォルダの存在を確認したいときにも使えます。ファイルのコピーはよく使う操作です。ファイルをコピーするフォルダが奥深い場所になる場合は、フォルダを探すのも大変です。同じファイルをコピーする作業がよくある場合は、エクセルVBAでファイルをコピーした方が一発で簡単にできます。

こちらの記事もご覧ください。⇒エクセルVBAでファイルをコピーする!