
Contents
この記事でできること
毎月のルーチンでファイルを別フォルダに手作業でコピー・移動していませんか? VBAを使えば、Excelで移動リスト(ファイル名・コピーか移動か)を作って実行するだけで、複数ファイルを一括処理できます。この記事では、確認ダイアログ+ログ出力付きのコードをコピペで提供します。
- 対象:ファイルを手作業でコピー・移動している人、VBAが初めての人
- 所要時間:コピペ → 実行まで約10分(目安。移動リストの作成時間を含む)
完成イメージ(Before / After)
Excelの移動リスト
| A(ファイル名) | B(処理) | C(結果) | |
|---|---|---|---|
| 1 | ファイル名 | 処理 | 結果 |
| 2 | 月次報告_202601.xlsx | コピー | コピー成功 |
| 3 | 月次報告_202602.xlsx | コピー | コピー成功 |
| 4 | 完了_議事録.docx | 移動 | 移動成功 |
| 5 | 古い在庫データ.csv | 移動 | 移動成功 |
Before(実行前)
元フォルダ(C:\Users\tanaka\Desktop\作業フォルダ\):
月次報告_202601.xlsx
月次報告_202602.xlsx
完了_議事録.docx
古い在庫データ.csv
コピー先フォルダ(C:\Users\tanaka\Desktop\バックアップ\):
(空)
After(実行後)
元フォルダ:
月次報告_202601.xlsx ← コピーなので残っている
月次報告_202602.xlsx ← コピーなので残っている
← 完了_議事録.docx は移動したのでなくなった
← 古い在庫データ.csv は移動したのでなくなった
コピー先フォルダ:
月次報告_202601.xlsx ← コピーされた
月次報告_202602.xlsx ← コピーされた
完了_議事録.docx ← 移動された
古い在庫データ.csv ← 移動された
コピーと移動の違い
処理を始める前に、コピーと移動の違いを確認する。
| コピー(CopyFile) | 移動(MoveFile) | |
|---|---|---|
| 元ファイル | 残る | なくなる |
| 同名ファイルが先にある場合 | デフォルトで上書きする | エラーになる(上書きしない) |
| 危険度 | 低い(元が残る) | 高い(元からなくなる) |
| 取り消し | コピー先を削除すればOK | 元に戻すにはバックアップから復元 |
移動はファイルが元フォルダからなくなる破壊的操作です。 移動を使う場合は、必ず事前にバックアップを取ってください。
実行前の準備
バックアップを取る(必須)
移動(MoveFile)は元フォルダからファイルがなくなる操作です。 必ず元フォルダを丸ごとコピーしてバックアップを取ってください。コピーだけの場合も、念のためバックアップを推奨する。
手順:
- エクスプローラーで元フォルダを右クリック
- 「コピー」→ 同じ場所に「貼り付け」
- 「作業フォルダ – コピー」というバックアップが作られる
コピー先フォルダを作成する
コピー先のフォルダが存在しない場合は、事前に作成しておく。実務版コードにはフォルダ自動作成機能を含めているが、最小版では手動で作成する必要がある。
Excelをマクロ有効ブック(.xlsm)で保存する
- Excelを開く(新規でも既存でもOK)
- 「ファイル」→「名前を付けて保存」
- ファイルの種類を 「Excel マクロ有効ブック (*.xlsm)」 に変更して保存
Windowsの拡張子を表示する
移動リストにはファイル名を拡張子(.xlsx .csv など)付きで記載する必要がある。Windowsの初期設定では拡張子が非表示のため、以下の手順で表示する。
- エクスプローラーを開く
- 上部メニューの「表示」タブをクリック
- 「ファイル名拡張子」にチェックを入れる
これでファイル名の末尾に .xlsx .csv などが表示されるようになる。
手順
ステップ1:移動リストを作る(実務版の場合)
Sheet1 に以下のように入力する。
- A1:
ファイル名(ヘッダー) - B1:
処理(ヘッダー) - A2以降:コピー・移動したいファイル名(拡張子を含む)
- B2以降:
コピーまたは移動と入力
ファイル名の入力を楽にする方法: 「【VBA】フォルダ内のファイル一覧をExcelに自動出力する方法」のコードでA列にファイル名を出力し、それを移動リストのA列に使うと手入力が不要になる。
移動リストのチェックポイント:
- ファイル名は 拡張子を含めて 記載する(例:
月次報告_202601.xlsx) - B列の値は「コピー」か「移動」のどちらか(空欄やそれ以外の値はスキップされる)
- 移動を含む場合は バックアップを取ったか 再度確認する
ステップ2:VBEを開いてコードを貼り付ける
- Alt + F11 でVBE(コードを書く画面)を開く
- メニュー「挿入」→「標準モジュール」
- 下の「コード(最小版)」または「コード(実務版)」をコピーしてコードウィンドウに貼り付ける
一般的にはAlt + F11で開けるが、企業のセキュリティ設定でVBAが無効化されている場合は、IT部門に確認すること。
ステップ3:フォルダパスを書き換える
コード内の srcPath(元フォルダ)と dstPath(コピー先フォルダ)を、自分のフォルダパスに書き換える。
パスの末尾に \ を忘れないこと。
パスの確認方法:エクスプローラーでフォルダを開き、アドレスバーをクリックするとパスが表示される。それをコピーして使う。
ステップ4:マクロを実行する
- Alt + F8 を押す
- マクロ名を選択して「実行」
- 確認ダイアログが表示されるので内容を確認して「はい」を押す
ステップ5:結果を確認する
- C列に「コピー成功」「移動成功」「失敗:理由」が記録されているので確認する(実務版の場合)
- コピー先フォルダを開き、ファイルが存在することを確認する
- 移動の場合、元フォルダからファイルがなくなっていることを確認する
- 1つファイルを開いて、中身が壊れていないことを確認する
コード(最小版)— 指定ファイルを1つコピーする
まずはこれだけで動く。FileSystemObject の CopyFile で1つのファイルをコピーする。
Sub CopyOneFile()
Dim fso As Object
Dim srcPath As String
Dim dstPath As String
' ★ ここを自分のパスに書き換える(末尾の \ を忘れずに)
srcPath = "C:\Users\(ユーザー名)\Desktop\作業フォルダ\"
dstPath = "C:\Users\(ユーザー名)\Desktop\バックアップ\"
' FileSystemObject を作成(参照設定不要)
Set fso = CreateObject("Scripting.FileSystemObject")
' コピー元ファイルの存在チェック
If Not fso.FileExists(srcPath & "月次報告_202601.xlsx") Then
MsgBox "ファイルが見つかりません:" & srcPath & "月次報告_202601.xlsx", vbExclamation
Set fso = Nothing
Exit Sub
End If
' コピー先フォルダの存在チェック
If Not fso.FolderExists(dstPath) Then
MsgBox "コピー先フォルダが見つかりません:" & dstPath, vbExclamation
Set fso = Nothing
Exit Sub
End If
' ファイルをコピー(第3引数 True = 同名ファイルがあれば上書き)
fso.CopyFile srcPath & "月次報告_202601.xlsx", dstPath, True
MsgBox "コピーが完了しました。", vbInformation
Set fso = Nothing
End Sub
ポイント:
CreateObject("Scripting.FileSystemObject")を使っているため、参照設定は不要。そのままコピペで動くCopyFileの第3引数Trueは「同名ファイルがあれば上書きする」という意味。上書きしたくない場合はFalseに変える- コピーではなく 移動 したい場合は、
fso.CopyFileの行をfso.MoveFile srcPath & "月次報告_202601.xlsx", dstPathに変える。ただし 移動は元ファイルがなくなる ので注意 - ファイル名(
月次報告_202601.xlsx)は自分の対象ファイルに書き換えること
コード(実務版)— Excelリストで一括コピー・移動+ログ出力
複数ファイルを一括処理する場合はこちら。Sheet1の移動リスト(A列:ファイル名、B列:コピーor移動)に従って処理し、C列に結果を記録する。
Sub CopyMoveFiles()
Dim fso As Object
Dim srcPath As String
Dim dstPath As String
Dim ws As Worksheet
Dim row As Long
Dim fileName As String
Dim action As String
Dim copyCount As Long
Dim moveCount As Long
Dim failCount As Long
Dim skipCount As Long
Dim hasMoveAction As Boolean
' ★ ここを自分のフォルダパスに書き換える(末尾の \ を忘れずに)
srcPath = "C:\Users\(ユーザー名)\Desktop\作業フォルダ\"
dstPath = "C:\Users\(ユーザー名)\Desktop\バックアップ\"
Set ws = Worksheets("Sheet1")
' 移動リストに「移動」が含まれるかチェック
For row = 2 To ws.Cells(ws.Rows.Count, 1).End(xlUp).row
If LCase(ws.Cells(row, 2).Value) = "移動" Then
hasMoveAction = True
Exit For
End If
Next row
' 確認ダイアログ
Dim msg As String
msg = "移動リストの内容でファイルをコピー・移動します。" & vbCrLf & _
"元フォルダ:" & srcPath & vbCrLf & _
"先フォルダ:" & dstPath & vbCrLf & vbCrLf
If hasMoveAction Then
msg = msg & "【警告】移動リストに「移動」が含まれています。" & vbCrLf & _
"移動したファイルは元フォルダからなくなります。" & vbCrLf & _
"バックアップは取りましたか?" & vbCrLf & vbCrLf
End If
msg = msg & "実行しますか?"
If MsgBox(msg, vbYesNo + vbExclamation) = vbNo Then
Exit Sub
End If
' FileSystemObject を作成(参照設定不要)
Set fso = CreateObject("Scripting.FileSystemObject")
' 元フォルダの存在チェック
If Not fso.FolderExists(srcPath) Then
MsgBox "元フォルダが見つかりません:" & srcPath, vbExclamation
Set fso = Nothing
Exit Sub
End If
' コピー先フォルダがなければ作成
If Not fso.FolderExists(dstPath) Then
fso.CreateFolder dstPath
End If
' C列(結果列)をクリア
ws.Range("C:C").Clear
ws.Cells(1, 3).Value = "結果"
row = 2 ' ヘッダー行(1行目)をスキップ
Do While ws.Cells(row, 1).Value <> ""
fileName = ws.Cells(row, 1).Value
action = ws.Cells(row, 2).Value
' B列が「コピー」「移動」以外ならスキップ
If action <> "コピー" And action <> "移動" Then
ws.Cells(row, 3).Value = "スキップ(B列が「コピー」「移動」以外)"
skipCount = skipCount + 1
GoTo NextRow
End If
' 元ファイルの存在チェック
If Not fso.FileExists(srcPath & fileName) Then
ws.Cells(row, 3).Value = "失敗:元ファイルが見つからない"
failCount = failCount + 1
GoTo NextRow
End If
' コピー・移動を実行
On Error Resume Next
If action = "コピー" Then
' コピー(同名ファイルは上書き)
fso.CopyFile srcPath & fileName, dstPath & fileName, True
If Err.Number = 0 Then
ws.Cells(row, 3).Value = "コピー成功"
copyCount = copyCount + 1
Else
ws.Cells(row, 3).Value = "失敗:" & Err.Description
failCount = failCount + 1
Err.Clear
End If
ElseIf action = "移動" Then
' 移動先に同名ファイルがあるかチェック
If fso.FileExists(dstPath & fileName) Then
ws.Cells(row, 3).Value = "失敗:移動先に同名ファイルが存在する"
failCount = failCount + 1
Err.Clear
Else
fso.MoveFile srcPath & fileName, dstPath & fileName
If Err.Number = 0 Then
ws.Cells(row, 3).Value = "移動成功"
moveCount = moveCount + 1
Else
ws.Cells(row, 3).Value = "失敗:" & Err.Description
failCount = failCount + 1
Err.Clear
End If
End If
End If
On Error GoTo 0
' ↓ 次の行に進む(GoTo の飛び先)
NextRow:
row = row + 1
Loop
Set fso = Nothing
MsgBox "完了しました。" & vbCrLf & _
"コピー成功:" & copyCount & " 件" & vbCrLf & _
"移動成功:" & moveCount & " 件" & vbCrLf & _
"失敗:" & failCount & " 件" & vbCrLf & _
"スキップ:" & skipCount & " 件" & vbCrLf & vbCrLf & _
"C列に詳細を記録しました。", vbInformation
End Sub
使い方:
- Sheet1にA列(ファイル名)、B列(「コピー」or「移動」)を入力する
- コード内の
srcPath(元フォルダ)とdstPath(先フォルダ)を書き換える - Alt + F8 →「CopyMoveFiles」を選択して実行
- 確認ダイアログの内容を確認して「はい」を押す
- C列に結果が記録される
コピー先フォルダの自動作成: コピー先フォルダが存在しない場合、自動で作成する。
移動の警告: リストに「移動」が含まれる場合、確認ダイアログに追加の警告が表示される。
シート名について: コード内の "Sheet1" はシート名(タブに表示される名前)。シート名を変更している場合は書き換えること。
よくある落とし穴5選
| # | 症状 | 原因 | 対策 |
|---|---|---|---|
| 1 | コピー先のファイルが知らないうちに上書きされた | CopyFile はデフォルトで同名ファイルを上書きする(overwrites=True)。確認なしで上書きされる |
上書きしたくない場合は第3引数を False にする。上書きされたファイルはバックアップからのみ復元可能。実務版では移動時に同名チェックを行っている |
| 2 | 「パスが見つかりません」エラー | コピー先フォルダが存在しない、またはパスの末尾に \ がない |
コピー先フォルダを事前に作成する(実務版は自動作成)。パスの末尾に \ を付ける |
| 3 | 「書き込みできません」エラー | 対象ファイルが他のアプリ(Excel, Wordなど)で開かれている | 対象ファイルをすべて閉じてから実行する |
| 4 | 移動先に同名ファイルがあるとエラーで止まる | MoveFile は同名ファイルが存在する場合エラーになる(CopyFileと違い上書きしない) |
実務版では事前に同名チェックを行い、ログに記録してスキップする |
| 5 | 移動したファイルが消えた(ように見える) | MoveFile は元フォルダからファイルを削除してコピー先に移す。正常動作だが、知らないと焦る |
移動はファイルが元からなくなる操作。事前にバックアップを取る。コピー先フォルダを確認する |
FAQ
Q1: コピー先に同名ファイルがある場合、上書きしたい
CopyFile は第3引数を省略するか True にすると上書きする。MoveFile には上書きオプションがないため、移動先の同名ファイルを事前に削除するか、ファイル名を変えてから移動する必要がある。
Q2: サブフォルダも含めて一括コピーしたい
ファイル単体ではなくフォルダごとコピーするには fso.CopyFolder メソッドを使う。ただしこの記事ではファイル単体のみ対象。
Q3: ネットワークドライブ(\server\share)でも使える?
一般的にはUNCパス(\\サーバー名\共有名\)でも動作する。ただしアクセス権限がない場合はエラーになる。社内サーバーの場合はIT部門に確認すること。
Q4: 拡張子ごとにコピー先を振り分けたい(.xlsxはフォルダA、.pdfはフォルダBなど)
この記事のコードはコピー先が1つのフォルダ固定。拡張子ごとの振り分けにはコードのカスタマイズが必要。
Q5: コピー・移動した後にファイル名も変えたい
「【VBA】ファイル名を一括変更(リネーム)する方法」のコードと組み合わせて使える。コピー・移動した後にリネーム処理を実行する流れが効率的。
まとめ
この記事で、VBAを使ったファイルのコピー・移動の自動化ができるようになった。
- 最小版:FileSystemObject の CopyFile で1ファイルをコピー
- 実務版:Excelの移動リストで一括コピー・移動。C列にログ出力
重要:移動(MoveFile)は元フォルダからファイルがなくなる破壊的操作。必ずバックアップを取ってから実行すること。
関連記事:
- 移動リストのファイル名をExcelに自動出力したい場合は「【VBA】フォルダ内のファイル一覧をExcelに自動出力する方法」を参照
- コピー・移動した後にファイル名を変えたい場合は「【VBA】ファイル名を一括変更(リネーム)する方法」を参照
もっとカスタマイズしたい場合
「拡張子ごとにフォルダを振り分けたい」「日付ごとにフォルダ分けしたい」「特定の条件に一致するファイルだけコピーしたい」など、業務に合わせたカスタマイズが必要な場合は、ココナラで相談できます。
相談時に以下の情報があるとスムーズです:
- Excel のバージョン / OS
- コピー元・コピー先のフォルダ構成
- 振り分けのルール(例:拡張子、日付、ファイル名のパターン)
- ファイルの数(目安)