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