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

アフィリエイト広告を利用しています。
Information
運営者・ポテ

いつもありがとうございます!

皆さん、こんにちは。ご覧いただきありがとうございます。

“日々の業務にちょうどいい自動化を”──

業務改善アプリケーションの作成を行っている「ソフトデザイン工房」 です。

この記事ではファイルを移動する方法を解説します。

この記事が、あなたのVBAマクロの価値をさらに高める一助となれば幸いです。

VBAを活用して、自分自身や身近なコミュニティに合ったアプリケーションを作成し、仕事量は半分に、成果は2倍に──そんな未来を目指すあなたを応援しています。

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" は新しいインスタンス(実体)を作成するためのキーワードです。

Information
  • インスタンス
    クラス(設計図)に基づいて作成された「実体」のことです。
  • キーワード
    特定の意味や機能を持つ予約済みの単語のことです。
' 変数にファイルパスを代入
source = ThisWorkbook.Path & "\directory - A\ファイル.xlsx"
destination = ThisWorkbook.Path & "\directory - B\ファイル.xlsx"

文字列型の変数 sourcedestination に ファイルパスを代入します。

' ファイルを移動
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スキルアップの参考情報

近年は、ChatGPTをはじめとするAIの登場によって、学習のスタイルが大きく変わりました。

分からないことがあれば、AIに尋ねれば答えがすぐに見つかる時代です。

とはいえ、AIを使いこなすには、自分自身の基本的な知識や理解力が欠かせません。

全体像をつかむためには、やはり書籍などで体系的に学んでおくことが今でも有効です。

そのうえでAIを活用すれば、自分の理解度に合わせた的確な解説や、応用のヒントを得ることができます。

「学んで基礎を築く → AIで補い発展させる」──このサイクルを重ねることで、VBAスキルは着実に高まっていくでしょう。

VBAのスキルアップ

VBAを学び始めるなら

入門書は、どれを選んでも大きな差はないように感じます。

どれを選ぶかに悩むことに時間をかけるよりも、まずは手頃な一冊を手に取って進めてみるのがおすすめです。

もし迷ったときには、私はインプレス社の「いちばんやさしい」シリーズを選ぶことが多いです。

基礎を超えて力をつけたいなら

私は上級者を目指していましたので、入門書にとどまらず、このような内容の濃い一冊を選んで学んでいました。

今は誰でもAIを活用できる時代になりましたが、上級者を目指す方にとっては、AIをより上手に活用するという意味でも、こうした本は今なお価値があります。

このレベルの本を一冊持っておくことに、損はないでしょう。


資格で能力を証明したいなら

VBAのプログラミング能力を客観的に示したい場合には「VBAエキスパート試験」があります。

特に「スタンダード」の方は上級者向けです。

あなたが社内業務の改善を行う立場であっても、VBAで作成したシステムをお客様に納める立場であっても、この資格は信頼や安心につながるでしょう。

以下の公式テキストが販売されています。



プログラミングの一般教養

「独学プログラマー」というプログラミングの魅力を解説した書籍があります。

これはVBAではなくPythonを題材としていますが、プログラミングの基本的な知識や思考法、仕事の進め方まで幅広く学べます。

今はAIにコードを尋ねれば、答えが返ってくる時代です。

しかし、この本からは「コード」以上に、プログラミングに向き合う姿勢や考え方を学ぶことができるでしょう。


こちらの記事でも紹介しています。もしよろしければご覧ください。

【初心者歓迎】無料相談受付中 

運営者・ポテ

いつもありがとうございます!

限られた時間をより良く使い、日本の生産性を高めたい──

みんなの実用学を運営するソフトデザイン工房では、業務整理や業務改善アプリケーション作成のご相談を承っております。

お気軽にご相談ください。


こちらの記事でも紹介しております。

おわりに

運営者・ポテ

ご覧いただきありがとうございました。

この記事では、「ファイル操作」の中の「ファイルを移動する方法」を解説しました。

お問い合わせやご要望がございましたら、「お問い合わせ/ご要望」フォームまたはコメント欄よりお知らせください。

この記事が皆様のお役に立てれば幸いです。

なお、当サイトでは様々な情報を発信しております。よろしければトップページもあわせてご覧ください。

この記事を書いた人

運営者・ポテソフトデザイン工房|日々の業務にちょうどいい自動化を
■人生を追求する凡人 ■日本一安全で、気の向くままに自分の時間を過ごせる、こだわりのキャンプ場を作るのが夢 ■ソフトデザイン工房運営(個人事業者) - 業務改善アプリケーションをご提供 ■人生は時間そのもの。ひとりでも多くの人が「より良い人生にするために時間を使って欲しい」と願い、仕事のスキルの向上、余暇の充実、資産形成を追求。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です