アクセス上位ページ
 
最近の更新内容
(2)-c.FSOによるファイル移動 ⇐ [PREV]
[NEXT] ⇒ (2)-e.FSOによるファイル削除

Excel VBA ≫ 3.FSO - FSOによるファイル操作(2)-d.FSOによるファイルコピー

ファイルシステムオブジェクトによるファイルコピー

このページでは下表のファイルコピーメソッドについて説明します。

内容 メソッド
ファイルコピー fso.CopyFile(※1)
file.Copy


※1 ・・・ ワイルドカードを使用することで複数のオブジェクトを同時に操作することが可能。
<使用可能なワイルドカード>
  * (アスタリスク):任意の数(0以上)の文字を表します。
  ? (クエスチョン):任意の1文字を表します。


<使い分けの判断基準>
  • 複数のファイルをコピーする場合
  • fso.CopyFile を使用します。コピー元のファイル群を上記ワイルドカードで表現する必要があります。 ワイルドカードで表現できない場合は file.Copy でファイルを1つずつコピーするしかありません。 (⇒ フォルダ内のファイルを1つずつコピーする例

  • 1つのファイルをコピーする場合
  • 上記メソッドのどちらを使用しても機能的には同じになりますので、そのときの処理内容により判断します。 通常、処理の途中でファイルオブジェクトを取得済みであれば file.Copy、 ファイルオブジェクトを取得していないのであれば fso.CopyFile を使用します。



    fso.CopyFile

    引数にコピー元、コピー先のファイルパスを指定してファイルのコピーを行います。 コピー先のファイルを上書きしたくない場合は、引数 OverWriteFiles に False を指定します。

    • 【構文】
      fso.CopyFile Source, Destination [, OverWriteFiles]

    引数名 省略 説明
    Source × コピー元のファイルを表す文字列を指定します。パスの最後の構成要素内ではワイルドカード文字を使用できます。 ファイルパスは絶対パス、相対パスともに指定可能です。
    Destination × 引数 Source で指定したファイルのコピー先を表す文字列を指定します。ワイルドカード文字は使用できません。 ファイル名まで指定することで、コピーしたファイルの名前を変更することができます。 ファイルパスは絶対パス、相対パスともに指定可能です。
    OverWriteFiles 既存ファイルを上書きするかどうかを True(上書きする)または False(上書きしない) で指定します。 既定値は True(上書きする) です。
    引数 Source に指定したファイルが存在しない場合、エラーが発生します。また、引数 OverWriteFiles が False の場合、Destination に指定したファイルが存在するとエラーが発生します。

    • 1つのファイルをコピーする(ファイル名変更なし)
    • 引数 Destination に既存フォルダ名(パスの区切り文字で終わる)を指定します。
      以下の例では vba フォルダ内にある test.txt を backup フォルダ内にコピーします。
      Sub test_fs024_01()
          Dim fso         As Object   'ファイルシステムオブジェクト
          Dim strSrc      As String   'コピー元
          Dim strDst      As String   'コピー先
      
          'メインオブジェクトの生成
          Set fso = CreateObject("Scripting.FileSystemObject")
      
          'コピー元ファイルパスの設定
          strSrc = "C:\Users\xxx\Desktop\vba\test.txt"
          'コピー先フォルダパスの設定
          strDst = "C:\Users\xxx\Desktop\backup\"
      
          'ファイルのコピー(上書き)
          fso.CopyFile strSrc, strDst
      
          'オブジェクト変数のクリア
          Set fso = Nothing
      End Sub
      

    • 1つのファイルをコピーする(ファイル名変更あり)
    • 引数 Destination にコピー後のファイル名を指定します。
      以下の例では、vba フォルダ内にある test.txt を backup フォルダ内にコピーし、 さらに、ファイル名を test_130817.txt へ変更します。
      Sub test_fs024_02()
          Dim fso         As Object   'ファイルシステムオブジェクト
          Dim strSrc      As String   'コピー元
          Dim strDst      As String   'コピー先
      
          'メインオブジェクトの生成
          Set fso = CreateObject("Scripting.FileSystemObject")
      
          'コピー元ファイルパスの設定
          strSrc = "C:\Users\xxx\Desktop\vba\test.txt"
          'コピー先ファイルパスの設定(ファイル名変更)
          strDst = "C:\Users\xxx\Desktop\backup\test_130817.txt"
      
          'ファイルのコピー(上書き)
          fso.CopyFile strSrc, strDst
      
          'オブジェクト変数のクリア
          Set fso = Nothing
      End Sub
      


    • 複数のファイルを1命令でコピーする
    • 引数 Sourceワイルドカードを使用してコピーしたいファイル群を表現します。
      以下の例では、vba フォルダ内にあるテキストファイルをすべて backup フォルダ内へコピーします。
      Sub sample_fs024_03()
          Dim fso         As Object   'ファイルシステムオブジェクト
          Dim strSrc      As String   'コピー元
          Dim strDst      As String   'コピー先
      
          'メインオブジェクトの生成
          Set fso = CreateObject("Scripting.FileSystemObject")
      
          'コピー元ファイルパスの設定
          strSrc = "C:\Users\xxx\Desktop\vba\*.txt"
          'コピー先フォルダパスの設定
          strDst = "C:\Users\xxx\Desktop\backup\"
      
          'ファイルのコピー(上書き)
          fso.CopyFile strSrc, strDst
      
          'オブジェクト変数のクリア
          Set fso = Nothing
      End Sub
      

    file.Copy

    ファイルオブジェクト内にコピー元のファイルパス情報を持っているので、引数に必ず指定するのは移動先のファイルパスのみです。 その他の使用方法は fso.CopyFile に同じです。

    • 【構文】
      file.Copy Destination [, OverWriteFiles]

    引数名 省略 説明
    Destination × 引数 Source で指定したファイルのコピー先を表す文字列を指定します。ワイルドカード文字は使用できません。 ファイル名まで指定することで、コピーしたファイルの名前を変更することができます。 ファイルパスは絶対パス、相対パスともに指定可能です。
    OverWriteFiles 既存ファイルを上書きするかどうかを True(上書きする) または False(上書きしない) で指定します。 既定値は True です。
    引数 OverWriteFiles が False の場合、Destination に指定したファイルが存在するとエラーが発生します。

    • 1つのファイルをコピーする(ファイル名変更なし)
    • 引数 Destination に既存フォルダ名(パスの区切り文字で終わる)を指定します。
      以下の例では vba フォルダ内にある test.txt を backup フォルダ内にコピーします。
      Sub test_fs024_04()
          Dim fso         As Object   'ファイルシステムオブジェクト
          Dim fileObj     As Object   'ファイルオブジェクト
      
          'メインオブジェクトの生成
          Set fso = CreateObject("Scripting.FileSystemObject")
      
          'ファイルオブジェクト取得
          Set fileObj = fso.GetFile("C:\Users\xxx\Desktop\vba\test.txt")
      
          'ファイルのコピー(上書き)
          fileObj.Copy "C:\Users\xxx\Desktop\backup\"
      
          'オブジェクト変数のクリア
          Set fso = Nothing
          Set fileObj = Nothing
      End Sub
      


    • 1つのファイルをコピーする(ファイル名変更あり)
    • 引数 Destination にコピー後のファイル名を指定します。
      以下の例では、vba フォルダ内にある test.txt を backup フォルダ内にコピーし、 さらに、ファイル名を test_130817.txt へ変更します。
      Sub test_fs024_05()
          Dim fso         As Object   'ファイルシステムオブジェクト
          Dim fileObj     As Object   'ファイルオブジェクト
      
          'メインオブジェクトの生成
          Set fso = CreateObject("Scripting.FileSystemObject")
      
          'ファイルオブジェクト取得
          Set fileObj = fso.GetFile("C:\Users\xxx\Desktop\vba\test.txt")
      
          'ファイルのコピー(上書き)
          fileObj.Copy "C:\Users\xxx\Desktop\backup\test_130817.txt"
      
          'オブジェクト変数のクリア
          Set fso = Nothing
          Set fileObj = Nothing
      End Sub
      


    • フォルダ内の複数ファイルを1つずつコピーする
    • 指定されたフォルダ内のファイルのうち、Like 演算子を使用して、あるファイル名パターンにマッチするものだけをコピーする例です。
      以下の例では、ファイル名が"a"と4ケタの数字からなるテキストファイルを backup フォルダへコピーします。

      <補足>
      数値4ケタは2種類のワイルドカード( * および ? )では表現できません。 ? は任意の1文字を表すため "a????.txt" としてしまうと "aaaa.txt" が移動の対象となってしまいます。 このため、Like演算子と数字を表す"#"を使用してファイル名の判定を行っています。
      Sub sample_fs024_06()
          Dim fso         As Object   'ファイルシステムオブジェクト
          Dim folderObj   As Object   'フォルダオブジェクト
          Dim fileObj     As Object   'ファイルオブジェクト
      
          'メインオブジェクトの生成
          Set fso = CreateObject("Scripting.FileSystemObject")
      
          'フォルダオブジェクト取得
          Set folderObj = fso.GetFolder("C:\Users\xxx\Desktop\vba")
      
          For Each fileObj In folderObj.Files
              'ファイル名判定
              If fileObj.Name Like "a####.txt" Then
                  'ファイルのコピー(上書き)
                  fileObj.Copy "C:\Users\xxx\Desktop\backup\"
              End If
          Next
      
          'オブジェクト変数のクリア
          Set fso = Nothing
          Set folderObj = Nothing
          Set fileObj = Nothing
      End Sub
      

      <実行前 - vba フォルダの内容> 実行前のvbaフォルダの内容 <実行前 - backup フォルダの内容> 実行前のbackupフォルダの内容 <sample_fs024_06 実行後 - vba フォルダの内容> sample_fs024_06実行後のvbaフォルダの内容 <sample_fs024_06 実行後 - backup フォルダの内容> sample_fs024_06実行後のbackupフォルダの内容

    カテゴリ内ページ



    Page
    Top