PR

【ExcelVBA】フォルダの移動・フォルダのコピーを行う方法(FileSystemObject CopyFolder・MoveFolderメソッド)

エクセルVBA-フォルダの移動・コピー-アイキャッチ フォルダの操作

この記事ではエクセルVBAでフォルダの移動・コピーを行う方法について説明しています。各見出しをクリックすると記事にジャンプできます。

スポンサーリンク

フォルダの移動

フォルダを移動させる方法について説明します。

◆マクロ実行前のフォルダの状態

「フォルダ操作」内の本日日付のフォルダを「old」フォルダに移動させてみたいと思います。
「フォルダ操作」フォルダ内に「old」フォルダはないので、ない場合は作成するようにしています。

エクセルVBA-フォルダの移動-実行前のフォルダの状態

◆マクロ実行後のフォルダの状態

「フォルダ操作」フォルダ内に「old」フォルダが作成されて、
「20240831」フォルダが、oldフォルダ内に移動しています。

エクセルVBA-フォルダの移動-実行後のフォルダの状態

◆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

◆エラー対策について

◆エラー対策
① 移動させたいフォルダがそもそもない場合は中止させる
② 移動先のフォルダがあるかどうか確認して、ない場合は作成する
③ 移動先にすでに同名のフォルダがあるか確認して、ない場合だけ移動させる

ちなみに移動先にすでに同じ名前のフォルダがある場合は「既に同名のファイルが存在しています」のエラーが出力されます。これを避けるために③の対策を入れておいた方が良いです。

エクセルVBA-フォルダの移動-すでに同名のファイルが存在していますエラー

エラー処理を入れたので、同じ名前のフォルダがある場合はメッセージが表示されます。

エクセルVBA-フォルダの移動-すでに同じ名前のフォルダがある場合のエラーメッセージ
スポンサーリンク

フォルダのコピー

さいごはフォルダをコピーする方法について説明します。

◆マクロ実行前のフォルダの状態

マクロ実行するブックと同じ階層に「フォルダA」があります。
このフォルダをコピーしていきます。

エクセルVBA-フォルダのコピー-実行前のフォルダの状態

◆マクロ実行後のフォルダの状態

「フォルダA」がコピーされて「フォルダAのコピー」が作成されました。

エクセルVBA-フォルダのコピー-実行後のフォルダの状態

◆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のコピー"

他にも移動時と同じようにエラー対策を入れておく必要があります。

◆エラー対策
① コピーしたいフォルダがそもそもない場合は中止させる
② コピー先にすでに同名のフォルダがあるか確認して、ない場合だけ移動させる

フォルダの移動のときと同じく、コピー先にすでに同じ名前のフォルダがある場合は「既に同名のファイルが存在しています」のエラーが出力されます。これを避けるために②の対策を入れておいた方が良いです。

エクセルVBA-フォルダのコピー-すでに同名のファイルが存在していますエラー

エラー処理を入れたので、同じ名前のフォルダがある場合はメッセージが表示されます。

エクセルVBA-フォルダのコピー-すでに同じ名前のフォルダがある場合のエラーメッセージ
スポンサーリンク

関連記事(フォルダの作成・削除)

フォルダの作成・フォルダの削除については下の記事で紹介しています。

スポンサーリンク

※コードのコピー利用について

・コードのコピーは自由におこなっていただけます。
・気を付けて作成はしていますがコードには誤りがある可能性があります。
・自身の環境で動作確認をしていますが、すべての方の環境で同様に動くことは保証できません。
・データの破損等の責任は負いかねますのでご自身の責任のもとお使いください。
・記事の内容は適宜変更することがありますのでご了承ください。

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