【簡単Excelマクロ・VBA】ファイルをコピーする|FileCopy関数 / FileSystemObject|ファイル操作 #007
いつもありがとうございます。
ノンプログラマー向け「Excelマクロ・VBA解説シリーズ」へようこそ。
本稿では、「ファイルをコピーする方法」を解説いたします。
ファイルのコピーには複数の方法があり、それぞれにメリットデメリットがありますが、筆者のおすすめは後述する「B-1-1:FileSystemObject でファイルをコピーする標準的な方法」です。
特別な事情が無ければこれを使っておけば問題ないでしょう。
VBAで自分に合ったアプリを作成し、仕事量は半分に、成果は2倍にしていきましょう。
初心者でも理解しやすいように、分かりやすく解説していきます。ぜひご覧ください。
ことばの意味
- ノンプログラマー
プログラミングを本職としない人たちのことです。 - マクロ
VBAを使って作成される「機能」のことです。 - VBA
Visusal Basic for Application の略で、プログラミング言語のことです。
関連記事
VBAにおけるファイル操作の全体像
VBAにおける「ファイル操作」の全体像は以下の記事で解説しております。
本稿では「ファイル操作」の一部である「ファイルをコピーする方法」を解説いたします。
VBAでファイルをコピーする方法は大きくわけて4つ存在する
まず、FileCopy関数を使った方法と、FileSsytemObject を使った方法の2つが存在します。そして、FileSystemObject を使った方法は、さらに3つに分類できます。即ち、下図の青で示した4つの方法が存在します。
解説していきます。
A:FileCopy 関数を使う方法
メリット
- シンプルで使い方が簡単
デメリット
- 機能が少ない
FileCopy 関数はファイルをコピーする基本的な機能しかありません。例えば、ファイルの存在チェックや削除などの機能はありません。 - ロバスト性が低い
エラーが起きやすいです。例えば、コピー元のファイルが開いていた場合や、コピー先のファイルが既に存在する場合はエラーが発生します。
B:FileSystemObjectを使う方法
メリット
- 機能が豊富
ファイルのコピーはもちろん、削除、移動、名前の変更、フォルダの作成、ファイルの存在チェックなど、多くの機能があります。 - ロバスト性が高い
例えば、コピー先のファイルが既に存在する場合でも上書きするかどうかを選択できます。
デメリット
- 事前準備が必要
FileSystemObject を使うためには、事前に Microsoft Scripting Runtime ライブラリを参照する設定を行う必要があります。Microsoft Scripting Runtime は、Microsoft が提供する外部ライブラリです。
※遅延バインディングの場合には、事前のライブラリ参照設定は必要ありません。後述します。 - FileCopy 関数よりも処理速度が遅い場合があります。
A:FileCopy 関数でファイルをコピーする方法
FileCopy 関数の基本構文を以下に示します。
ことばの意味
- 構文
プログラミング言語の文法のことです。
FileCopy Source, Destination
ここで、Source はコピー元のファイルパス、Destination はコピー先のファイルパスです。
具体例を用いて解説します。
下図のようなファイル構成において 「ファイルをコピーする.xlsm」 から、 「ファイルA.xlsx」 を操作してコピーするマクロを例に解説します。なお、マクロは「ファイルをコピーする.xlsm」 に記述します。
コード全文と、その実行結果を以下に示します。
Sub Sample()
' 変数宣言
Dim source As String ' コピー元ファイルのパスを格納
Dim destination As String ' コピー先ファイルのパスを格納
' 変数にファイルパスを代入
source = ThisWorkbook.Path & "\ファイルA.xlsx"
destination = ThisWorkbook.Path & "\ファイルB.xlsx"
' ファイルをコピーする
FileCopy source, destination ' コピー元ファイルをコピー先にコピー
End Sub
ファイルBが作成されました。
解説します。
' 変数宣言
Dim source As String ' コピー元ファイルのパスを格納
Dim destination As String ' コピー先ファイルのパスを格納
ここでは、コード内で使用する変数が宣言されています。変数は Dim 変数名 As データ型
の構文で宣言します。これにより、各変数は As
以降で指定したデータ型のデータを格納できるようになります。
尚、String
は、文字列型を意味しています。
' 変数にファイルパスを代入
source = ThisWorkbook.Path & "\ファイルA.xlsx"
destination = ThisWorkbook.Path & "\ファイルB.xlsx"
ここでは、冒頭で定義した変数にファイルパスを代入しています。source
にはコピー元のファイルパスを、destination
にはコピー先のファイルパスを指定します。
ここでは、 ThisWorkbook
、つまり 「ファイルをコピーする.xlsm」 を基準にパスを定義しています。
' ファイルをコピーする
FileCopy source, destination ' コピー元ファイルをコピー先にコピー
ここでは、ファイルをコピーしています。FileCopy
の後に source
= コピー元のファイルパス、destination
= コピー先のファイルパス、の順で指定します。
以上で、ファイルコピー関数の解説は終了です。ありがとうございました。
B:FileSystemObject でファイルをコピーする方法
B-1:参照設定が必要な方法
B-1-1:FileSystemObject でファイルをコピーする標準的な方法
Dim fso As FileSystemObject
Set fso = New FileSystemObject
この方法では、まず変数を宣言し(1行目)、その後に新しいインスタンスを作成しています(2行目)。New
は新しいインタンスを作成するためのキーワードです。
ことばの意味
- インスタンス
クラス(設計図)に基づいて作成された「実体」のことです。 - キーワード
特定の意味や機能を持つ予約済みの単語のことです。
この方法はオブジェクトのライフサイクル(作成~初期化~使用~更新~破棄)を細かく制御することができます。エラーハンドリングも適切に行うことができます。
特別な事情が無ければ、この方法を使っておくのが良いでしょう。
B-1-2:FileSystemObject でファイルをコピーするシンプルな方法
Dim fso As New FileSystemObject
この方法では、オブジェクト変数 fso を宣言すると同時に、インスタンス化しています。つまり、fso という変数を作り、その変数に FileSystemObject クラスの新しいインスタンスを割り当てています。
ことばの意味
- インスタンス化
オブジェクトを作り出すことです。 - クラス
オブジェクトの設計図のことで、属性(データ)とメソッド(操作)を定義したものです。属性の定義とはオブジェクトが持つデータ(例えば"名前"や"年齢")を設定することで、メソッドとはオブジェクトが実行できる操作(例えば"歩く"など)を設定することです。
この方法は、コードが短く読みやすいです。一方で、オブジェクトが自動的に作成されるため、必要なタイミングでオブジェクトを作成したり、破棄したい場合には好ましくありません。パフォーマンスに影響する場合があります。
また、この方法ではインスタンス化が失敗した場合、適切に例外処理することが難しいです。
この方法は、シンプルな操作を行う場合に向いていますが、細かな制御やパフォーマンスを重視する場合には、上述の標準的な方法の使用を検討すると良いでしょう。
B-2:参照設定が不要な方法
Dim fso As Object
Set fso = CreateObject("Scripting.FileSystemObject")
この方法では、Microsoft Scripting Runtiem の"参照設定" を追加せずに、FileSystemObject を使用することができます。
一方でデメリットとしては、パフォーマンスの低下や、実行時にファイルが存在しない場合などに対するエラーハンドリングが困難であることです。
- パフォーマンスの低下
遅延バインディングにより、コードの実行速度が遅くなる可能性があります。 - エラーハンドリングが難しい
CreateObject を使用した場合、コンパイル時に型チェックが行われないため、ファイルが存在しないなどのエラーが発生した際に、問題の発見や対処が遅れることがあります。
ことばの意味
- 遅延バインディング
コンパイル時ではなく実行時にオブジェクトをバインドすることです。As Object
の形式で宣言すると、遅延バインディングとなります。尚、「オブジェクトをバインドする」とは、オブジェクトと、そのオブジェクトが持つメソッドやプロパティを結びつけることです。 - コンパイル
ソースコード(人が読める形式のプログラム)を、コンピューターが理解して実行できる機械語(バイナリコード)に変換するプロセスのことです。
具体例と解説
B-1-1:FileSystemObject でファイルをコピーする標準的な方法
FileSystemObject でファイルをコピーする"標準的な方法"の具体例と解説を行います。
この方法では、ファイルを操作するためのライブラリ「Microsoft Scripting Runtime」が必要です。
まずはじめに、Microsoft Scripting Runtime の参照設定を追加します。以下の手順で行うことができます。
VBE画面から「ツール」-->「参照設定」と進み、Microsoft Scripting Runtime にチェックを入れ「OK」を押下します。なお、このライブラリをはじめて設定する場合、ダイアログボックスの上位には表示されていません。アルファベット順に従ってリストの下の方に表示されていますので、慌てずに探してください。
以上でライブラリの設定は完了です。次に進みます。
コード全文と、その実行結果を以下に示します。
Sub Sample2()
' 変数宣言
Dim fso As FileSystemObject
Dim source As String
Dim destination As String
' 変数にオブジェクトを代入
Set fso = New FileSystemObject
' 変数にファイルパスを代入
source = ThisWorkbook.Path & "\ファイルA.xlsx"
destination = ThisWorkbook.Path & "\ファイルB.xlsx"
' ファイルをコピーする
fso.CopyFile source, destination, True
End Sub
解説していきます。
' 変数宣言
Dim fso As FileSystemObject
Dim source As String
Dim destination As String
ここでは、コード内で使用する変数が宣言されています。変数は Dim 変数名 As データ型
の構文で宣言します。これにより、各変数は As
以降で指定したデータ型のデータを格納できるようになります。
例えば Dim fso As FileSystemObject
は、FileSystemObject 型の変数 fso
を宣言しているという意味です。
FileSystemObject 型とは、Windows のファイルシステムにアクセスして操作するためのオブジェクトです。このオブジェクトを使うことで、ファイルやフォルダの作成、読み込み、削除、コピー、移動などの操作ができるようになります。
String
は 文字列を扱うためのデータ型です。
' 変数にオブジェクトを代入
Set fso = New FileSystemObject
ここでは、ファイル操作をするための FileSystemObject を作成し、それを変数fsoに代入しています。尚、New
は新しいインスタンスを作成するためのキーワードです。
' 変数にファイルパスを代入
source = ThisWorkbook.Path & "\ファイルA.xlsx"
destination = ThisWorkbook.Path & "\ファイルB.xlsx"
ここでは、文字列型の変数 source
と destination
に ファイルパスを代入しています。
' ファイルをコピーする
fso.CopyFile source, destination, True
ここが、ファイルをコピーしているコードです。CopyFile
メソッドは FileSystemObject のメソッドで、ファイルをコピーするために使用されます。
構文は以下の通りです。
object.CopyFile コピー元のファイルパス, コピー先のファイルパス, [overwrite]
overwrite
はオプションです。既存のファイルを上書きするかどうかを指定します。省略も可能であり、省略した場合は True(上書き)が適用されます。
なお、overwrite
で指定できるオプションは以下の通りです。
オプション | 意味 |
---|---|
True | コピー先に同名のファイルが存在する場合、上書きする。 |
False | コピー先に同名のファイルが存在する場合、実行時エラーが発生する。 |
以上で、解説は終了です。ありがとうございました。
コピー先に同名のファイルが存在した場合のエラーハンドリング
意図しない上書きなどを防ぐためには、適切なエラーハンドリングが欠かせません。
以下に、コピー先に同名のファイルが存在するかどうかを判定し、存在しない場合にのみコピーする方法を例示します。
Sub Sample3()
' 変数宣言
Dim fso As FileSystemObject ' ファイル操作を行うためのオブジェクト
Dim source As String ' コピー元ファイルのパスを格納する変数
Dim destination As String ' コピー先ファイルのパスを格納する変数
' 変数にオブジェクトを代入
Set fso = New FileSystemObject
' 変数にファイルパスを代入
source = ThisWorkbook.Path & "\ファイルA.xlsx" ' コピー元ファイルパスをsourceに代入
destination = ThisWorkbook.Path & "\ファイルB.xlsx" ' コピー先ファイルパスをdestinationに代入
' コピー先に同名のファイルが存在しない場合のみコピー
If Not fso.FileExists(destination) Then ' destinationに同名ファイルがない場合
fso.CopyFile source, destination ' sourceのファイルをdestinationにコピー
Else
MsgBox "コピー先のファイルがすでに存在します。" ' 既存ファイルがある場合のメッセージ
End If
End Sub
変更したところはここです。
' コピー先に同名のファイルが存在しない場合のみコピー
If Not fso.FileExists(destination) Then ' destinationに同名ファイルがない場合
fso.CopyFile source, destination ' sourceのファイルをdestinationにコピー
Else
MsgBox "コピー先のファイルがすでに存在します。" ' 既存ファイルがある場合のメッセージ
End If
ここでは、FileSytemObject
の FileExists
メソッドを使用して、コピー先に同名のファイルが存在するかチェックし、存在しない場合にだけコピーしています。
これにより安全にファイルをコピーすることができます。
以上で、解説は終了です。ありがとうございました。
おわりに
ご覧いただきありがとうございました。
本稿では、「ファイル操作」の中の「ファイルをコピーする方法」を解説いたしました。
お問い合わせやご要望等ございましたら、「お問い合わせ/ご要望」またはコメントにて、ご連絡いただければ幸いでございます。
皆様の人生がより一層素晴らしいものになるよう、少しでもお役に立てれば幸いでございます。
なお、当サイトでは様々な情報を発信しております。もしよろしければ、トップページもご覧いただけると幸いでございます。
筆者の記事関連経験
- VBA使用経験約20年
実務に使用するマクロを多数作成してきました。 - Python 3 エンジニア認定基礎試験
経済産業省が定めたガイドライン「ITスキル標準(ITSS)」に掲載されている民間資格です。
VBAプログラミングスキルアップのための参考情報
ここでは参考図書を紹介いたしますが、これらに限らず自分に合うものを選ぶことが重要だと考えております。皆様の、より一層のご成功を心よりお祈りしております。
VBAプログラミングのスキルアップ
学習用としてもハンドブックとしても役立つ便利な書籍がこちらです。価格はやや高めですが、その内容は非常に充実しています。相応のスキルを身に付けるためには、こうしたしっかりとした書籍を一冊持っておくと良いでしょう。
入門書に関しては、どの書籍も大きな違いはありません。あまり迷うことに時間をかけるよりは、手頃なものを一冊選んでみると良いでしょう。VBAの入門書は数多く出版されていますので、興味がある方はぜひチェックしてみてください。
甲乙つけがたい場合、私はインプレス社の「いちばんやさしい」シリーズを選ぶことが多いです。
\チェックしてみよう/
\チェックしてみよう/
\チェックしてみよう/
VBAのプログラミング能力を客観的に証明したい場合には「VBAエキスパート試験」があります。この試験はVBAの知識を公式に認定するものです。VBAの総合的な能力獲得を目指す方に適しています。以下の公式テキストが販売されております。
プログラミングの一般教養
「独学プログラマー」というプログラミングの魅力を解説した書籍があります。これはVBAではなくPythonを題材としていますが、プログラミングの基本的な知識や思考法、仕事の進め方まで幅広く学べます。
こちらの記事でも紹介しております。もしよろしければご覧ください。