【簡単エクセルマクロ・VBA】ファイルを移動する|MoveFile|ファイル操作 #008
いつもありがとうございます。
これは、ノンプログラマー向けのエクセルマクロ・VBA解説シリーズです。
本稿では、ファイルを移動する方法を解説いたします。
ことばの意味
- ノンプログラマー
プログラミングを本職としない人たちのことです。 - マクロ
VBAを使って作成される「機能」のことです。 - VBA
Visusal Basic for Application の略で、プログラミング言語のことです。
筆者の記事関連経験/資格
- VBA使用経験 約20年
- Python 3 エンジニア認定基礎試験 合格
一般社団法人Pythonエンジニア育成推進協会によって運営・認定されている民間資格で、経済産業省が定めたガイドライン「ITスキル標準(ITSS)」において、職種:ソフトウェアディベロップメント、専門分野:応用ソフトのレベル1に掲載されています。
VBAにおけるファイル操作の全体像
VBAにおける「ファイル操作」の全体像は以下の記事で解説しております。
本稿では「ファイル操作」の一部である「ファイルを移動する方法」を解説いたします。
VBAでファイルを移動する方法
以下のようなフォルダ構成を例に説明します。
- マクロを記述した "ファイルを移動する.xlsm" と同階層に directory - A、directory - B があります。
- directory - Aには "ファイル.xlsx"が入っています。
- この"ファイル.xlsx" を directory - B に移動します。
これを実行するコードとマクロ実行結果を以下に示します。
Sub Sample()
' 変数宣言
Dim fso As FileSystemObject
Dim source As String
Dim destination As String
' 変数にオブジェクトを代入
Set fso = New FileSystemObject
' 変数にファイルパスを代入
source = ThisWorkbook.Path & "\directory - A\ファイル.xlsx"
destination = ThisWorkbook.Path & "\directory - B\ファイル.xlsx"
' ファイルを移動
fso.MoveFile source, destination
' オブジェクトの解放
Set fso = Nothing
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 & "\directory - A\ファイル.xlsx"
destination = ThisWorkbook.Path & "\directory - B\ファイル.xlsx"
文字列型の変数 source
と destination
に ファイルパスを代入します。
' ファイルを移動
fso.MoveFile source, destination
ここがファイルを移動しているコードです。
MoveFile
メソッドは FileSystemObject
のメソッドで、ファイルを移動するメソッドです。構文は以下の通りです。
オブジェクト.MoveFile source, destination
ここで source
は移動元のファイルのパス、destination
は移動先のファイルのパスです。
移動先に同名のファイルがあった場合に上書きするかどうかを指定する引数はありません。
移動先に同名のファイルがあるかどうかをチェックしてから、どのような操作をするかを決める場合には以下のようにコードを記述します。
' 移動先に同名のファイルが存在するかどうかによって処理内容を決める
If Not fso.FileExists(destination) Then
' ファイルを移動
fso.MoveFile source, destination
Else
MsgBox "移動先に同名のファイルが存在します", vbExclamation
End If
この場合、移動先に同名のファイルが無ければファイルの移動を実行します。
移動先に同名のファイルが存在した場合は、以下の警告メッセージを出します。移動は実行されません。
' オブジェクトの解放
Set fso = Nothing
最後のこのコードは、変数 fso に代入したオブジェクトを開放する操作です。
この操作は必須ではありませんが、コーディングの良い習慣として、使用が終わったオブジェクトは開放することが推奨されます。これにより、メモリの無駄な消費を防ぐことができます。
ただし、小規模なマクロでは、このコードを省略してもそれほど影響はありません。
以上が、ファイルを移動する方法です。
ことばの意味
- インスタンス・・・クラス(設計図)に基づいて作成された「実体」のことです。
- キーワード・・・特定の意味や機能を持つ予約済みの単語のことです。
【発展偏】VBAでフォルダ内のすべてのファイルを移動する方法
移動元のファイルが単一のファイルで、しかもファイル名が固定値であることは少ないのではないでしょうか。
実用的なアプリケーションにするためには、もう一工夫必要な場合があると思います。
そこで、移動したいファイルが複数あり、それが動的に変わる場合を想定して、フォルダ内のすべてのファイルを移動するコードを以下に例示します。合わせてマクロ実行結果も示します。
Sub Sample3()
' 変数宣言
Dim fso As FileSystemObject
Dim source_folder As String
Dim destination_folder As String
Dim source_file As Object
Dim destination_file As String
' 変数にオブジェクトを代入
Set fso = New FileSystemObject
' 移動元と移動先フォルダのパスを設定
source_folder = ThisWorkbook.Path & "\directory - A"
destination_folder = ThisWorkbook.Path & "\directory - B"
' 移動元フォルダ内のすべてのファイルに順番に処理を実行する
For Each source_file In fso.GetFolder(source_folder).Files
' 移動先ファイルのパス代入用の変数に移動先のファイルパスを代入
destination_file = destination_folder & "\" & source_file.Name
' 移動先に同名のファイルが存在する場合の処理
If fso.FileExists(destination_file) Then
MsgBox "移動先に同名のファイルが存在します: " & source_file.Name, vbExclamation
Else
' ファイルを移動
fso.MoveFile source_file.Path, destination_file
End If
Next source_file
' オブジェクトの解放
Set fso = Nothing
End Sub
ポイントは移動元フォルダ内のすべてのファイルに対して処理を実行するコードにすることです。これを for...Each ステートメントで実装しています。
' 移動元フォルダ内のすべてのファイルに順番に処理を実行する
For Each source_file In fso.GetFolder(source_folder).Files
fso.GetFolder(source_folder).Files
は、移動元フォルダ内のすべてのファイルを表しています。このファイルの集合に対して、1つずつ順番に処理を実行していっています。
尚、For...Each ステートメントについては以下の記事で解説しています。もしよろしければご覧ください。
おわりに
ご覧いただきありがとうございました。
本稿では、「ファイル操作」の中の「ファイルを移動する方法」を解説いたしました。
お問い合わせやご要望等ございましたら、「お問い合わせ/ご要望」またはコメントにて、ご連絡いただければ幸いでございます。
皆様の人生がより一層素晴らしいものになるよう、少しでもお役に立てれば幸いでございます。
VBAプログラミングスキルアップのための参考情報
ここでは参考図書を紹介いたしますが、これらに限らず自分に合うものを選ぶことが重要だと考えております。皆様の、より一層のご成功を心よりお祈りしております。
VBAプログラミングのスキルアップ
学習用としてもハンドブックとしても役立つ便利な書籍がこちらです。価格はやや高めですが、その内容は非常に充実しています。相応のスキルを身に付けるためには、こうしたしっかりとした書籍を一冊持っておくと良いでしょう。
入門書に関しては、どの書籍も大きな違いはありません。あまり迷うことに時間をかけるより、手頃なものを一冊選んでみると良いでしょう。VBAの入門書は数多く出版されていますので、興味がある方はぜひチェックしてみてください。
私は、迷った場合は、インプレス社の「いちばんやさしい」シリーズを購入することが多いです。
>>Amazon で VBA の書籍をでチェックする>>楽天市場 で VBA の書籍をチェックする
>>Yahoo!ショッピングでVBAの書籍をチェックする
VBAのプログラミング能力を客観的に証明したい場合には「VBAエキスパート試験」があります。この試験はVBAの知識を公式に認定するものです。VBAの総合的な能力獲得を目指す方に適しています。以下の公式テキストが販売されております。
プログラミングの一般教養
「独学プログラマー」というプログラミングの魅力を解説した書籍があります。これはVBAではなくPythonを題材としていますが、プログラミングの基本的な知識や思考法、仕事の進め方まで幅広く学べます。
こちらの記事でも紹介しております。もしよろしければご覧ください。