【簡単エクセル/Excel VBA マクロ】ファイルを移動する|MoveFile|ファイル操作 #008



いつもありがとうございます!
ノンプログラマー向け「Excel VBA マクロ解説シリーズ」へようこそ。
本稿では、ファイルを移動する方法を解説いたします。
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 ステートメントについては以下の記事で解説しています。もしよろしければご覧ください。

以上で、発展偏の解説は終了です。ありがとうございました!
関連記事
本稿と関連の深い記事です。もしよろしければ、合わせてご活用ください。
- 【簡単エクセル/Excel VBA マクロ】解説シリーズ目次 | みんなの実用学(jitsuyogaku.com)
- 【簡単エクセル/Excel VBA マクロ】Excel VBA マクロの全体像 | みんなの実用学 (jitsuyogaku.com)
VBAプログラミングスキルアップのための参考情報
ここでは参考図書を紹介いたしますが、これらに限らず自分に合うものを選ぶことが重要だと考えております。皆様の、より一層のご成功を心よりお祈りしております。
VBAプログラミングのスキルアップ
学習用としてもハンドブックとしても役立つ便利な書籍がこちらです。価格はやや高めですが、その内容は非常に充実しています。相応のスキルを身に付けるためには、こうしたしっかりとした書籍を一冊持っておくと良いでしょう。
入門書に関しては、どの書籍も大きな違いはありません。あまり迷うことに時間をかけるよりは、手頃なものを一冊選んでみると良いでしょう。VBAの入門書は数多く出版されていますので、興味がある方はぜひチェックしてみてください。
甲乙つけがたい場合、私はインプレス社の「いちばんやさしい」シリーズを選ぶことが多いです。
\チェックしてみよう/
\チェックしてみよう/
\チェックしてみよう/
VBAのプログラミング能力を客観的に証明したい場合には「VBAエキスパート試験」があります。この試験はVBAの知識を公式に認定するものです。VBAの総合的な能力獲得を目指す方に適しています。以下の公式テキストが販売されております。
プログラミングの一般教養
「独学プログラマー」というプログラミングの魅力を解説した書籍があります。これはVBAではなくPythonを題材としていますが、プログラミングの基本的な知識や思考法、仕事の進め方まで幅広く学べます。
こちらの記事でも紹介しております。もしよろしければご覧ください。

おわりに


ご覧いただきありがとうございました。
本稿では、「ファイル操作」の中の「ファイルを移動する方法」を解説いたしました。
お問い合わせやご要望等ございましたら、「お問い合わせ/ご要望」またはコメントにて、ご連絡いただければ幸いでございます。
皆様の人生がより一層素晴らしいものになるよう、少しでもお役に立てれば幸いでございます。
なお、当サイトでは様々な情報を発信しております。もしよろしければ、トップページもご覧いただけると幸いでございます。
この記事を書いた人
- ■人生を追求する凡人■日本一安全で、気の向くままに自分の時間を過ごせる、こだわりのキャンプ場を作るのが夢■光学・機械系エンジニア(歴20年、内マネジメント10年、特許数件権利化)/副業フリーランスエンジニア■読書・文学愛好■人生は時間そのもの。ひとりでも多くの人が「より良い人生にするために時間を使って欲しい」と願い、仕事のスキルの向上、余暇の充実、資産形成を研究。■VBAアプリ開発サービス提供中(業務委託 / VBA使用経験20年)■Python愛好(歴5年)■VBAエキスパート「Excel VBA スタンダード」(上級者向け資格)/ Python 3 エンジニア認定基礎(経済産業省「ITスキル標準(ITSS)」に掲載)