この記事ではエクセルVBAでフォルダの移動・コピーを行う方法について説明しています。各見出しをクリックすると記事にジャンプできます。
フォルダの移動
フォルダを移動させる方法について説明します。
◆マクロ実行前のフォルダの状態
「フォルダ操作」内の本日日付のフォルダを「old」フォルダに移動させてみたいと思います。
「フォルダ操作」フォルダ内に「old」フォルダはないので、ない場合は作成するようにしています。
◆マクロ実行後のフォルダの状態
「フォルダ操作」フォルダ内に「old」フォルダが作成されて、
「20240831」フォルダが、oldフォルダ内に移動しています。
◆VBAコード
フォルダの移動はFileSystemObjectを使ってMoveFolderメソッドで移動が可能です。
FileSystemObjectの変数.MoveFolder 移動元フォルダ, 移動先フォルダ
シンプルに書くとそれだけですが、実際は移動元のフォルダがあるのかなどエラーにならないように色々なチェックを入れた方が良いです。
▽もろもろ対策を入れたコードがこちら
Sub Sample()
'***********************************
'フォルダの移動
'***********************************
Dim ForlderPath As String
Dim fso As Object
Dim ForlderPath_From As String
Dim ForlderPath_To As String
'移動させるフォルダパスを変数にセット
ForlderPath_From = ThisWorkbook.Path & "\" & Format(Now(), "yyyyMMdd")
'移動先のフォルダパスを変数にセット
ForlderPath_To = ThisWorkbook.Path & "\old\"
'移動元のフォルダがない場合は処理を中止する
If Dir(ForlderPath_From, vbDirectory) = "" Then
MsgBox "対象のフォルダがありません。処理を中止します。"
Exit Sub
End If
'移動先のフォルダがない場合は作成する
If Dir(ForlderPath_To, vbDirectory) = "" Then
'移動先のフォルダを作成する
MkDir ForlderPath_To
End If
'FileSystemObjectのインスタンスを作成
Set fso = CreateObject("Scripting.FileSystemObject")
'移動先に同名のフォルダがあるか
If Dir(ForlderPath_To & Format(Now(), "yyyyMMdd"), vbDirectory) = "" Then
'ない場合は移動させる
fso.MoveFolder ForlderPath_From, ForlderPath_To
Else
MsgBox "すでに同じ名前のフォルダが存在するため移動できませんでした。"
End If
Set fso = Nothing
End Sub
◆エラー対策について
◆エラー対策
① 移動させたいフォルダがそもそもない場合は中止させる
② 移動先のフォルダがあるかどうか確認して、ない場合は作成する
③ 移動先にすでに同名のフォルダがあるか確認して、ない場合だけ移動させる
ちなみに移動先にすでに同じ名前のフォルダがある場合は「既に同名のファイルが存在しています」のエラーが出力されます。これを避けるために③の対策を入れておいた方が良いです。
エラー処理を入れたので、同じ名前のフォルダがある場合はメッセージが表示されます。
フォルダのコピー
さいごはフォルダをコピーする方法について説明します。
◆マクロ実行前のフォルダの状態
マクロ実行するブックと同じ階層に「フォルダA」があります。
このフォルダをコピーしていきます。
◆マクロ実行後のフォルダの状態
「フォルダA」がコピーされて「フォルダAのコピー」が作成されました。
◆VBAコード
フォルダのコピーもFileSystemObjectを使ってCopyFolderメソッドで移動が可能です。
FileSystemObjectの変数.CopyFolder コピー元フォルダ, コピー先フォルダ
▽VBAコードはこちら
Sub Sample()
'***********************************
'フォルダのコピー
'***********************************
Dim ForlderPath As String
Dim fso As Object
Dim ForlderPath_CopyFrom As String
Dim ForlderPath_CopyTo As String
'コピーするフォルダパスを変数にセット
ForlderPath_CopyFrom = ThisWorkbook.Path & "\フォルダA"
'コピー先のフォルダパスを変数にセット
ForlderPath_CopyTo = ThisWorkbook.Path & "\フォルダAのコピー"
'コピー元のフォルダがない場合は処理を中止する
If Dir(ForlderPath_CopyFrom, vbDirectory) = "" Then
MsgBox "コピー元のフォルダがありません。処理を中止します。"
Exit Sub
End If
'FileSystemObjectのインスタンスを作成
Set fso = CreateObject("Scripting.FileSystemObject")
'コピー先に同名のフォルダがあるか
If Dir(ForlderPath_CopyTo, vbDirectory) = "" Then
'ない場合は移動させる
fso.CopyFolder ForlderPath_CopyFrom, ForlderPath_CopyTo
Else
MsgBox "すでに同じ名前のフォルダが存在するため移動できませんでした。"
End If
Set fso = Nothing
End Sub
◆コードの解説・エラー対策
コピー元のフォルダとコピー先のフォルダは先に変数に格納して使用しています。
手でフォルダをコピーするときは自動的に「元のフォルダ名+コピー」とフォルダ名を変更してくれますが、マクロで書くときはコピー後のフォルダ名を別名で指定しておく必要があります。
'コピーするフォルダパスを変数にセット
ForlderPath_CopyFrom = ThisWorkbook.Path & "\フォルダA"
'コピー先のフォルダパスを変数にセット
ForlderPath_CopyTo = ThisWorkbook.Path & "\フォルダAのコピー"
他にも移動時と同じようにエラー対策を入れておく必要があります。
◆エラー対策
① コピーしたいフォルダがそもそもない場合は中止させる
② コピー先にすでに同名のフォルダがあるか確認して、ない場合だけ移動させる
フォルダの移動のときと同じく、コピー先にすでに同じ名前のフォルダがある場合は「既に同名のファイルが存在しています」のエラーが出力されます。これを避けるために②の対策を入れておいた方が良いです。
エラー処理を入れたので、同じ名前のフォルダがある場合はメッセージが表示されます。
関連記事(フォルダの作成・削除)
フォルダの作成・フォルダの削除については下の記事で紹介しています。
※コードのコピー利用について
・コードのコピーは自由におこなっていただけます。
・気を付けて作成はしていますがコードには誤りがある可能性があります。
・自身の環境で動作確認をしていますが、すべての方の環境で同様に動くことは保証できません。
・データの破損等の責任は負いかねますのでご自身の責任のもとお使いください。
・記事の内容は適宜変更することがありますのでご了承ください。