📢 パソコン学習の決定版、「オンライン学習」「ベテラン講師によるマンツーマンサポート」の『PCHack』でパソコンスキルを劇的に向上!《詳しくはこちらをクリック》

エクセルVBAでファイルを開く方法と自動保存6つの基本技

紬ちゃん

エクセルVBAでファイルを開くことができないかな?

ライクさん

大丈夫、ファイルを開いたり閉じたりするのはエクセルVBAの基本なんだよ!

今回はエクセルVBAを使って、ファイルを操作する基本技6つをご紹介します。

解説している主なコードは次のとおりです。

VBAのファイル操作で使う主なコード
  1. ファイルを開くOpen
  2. ファイルを閉じるClose
  3. フォルダやファイルを選ぶFileDialog
  4. フォルダやファイルの存在確認Dir
  5. フォルダがなければ作るMkDir
  6. 名前を付けて保存SaveAs

これらの基本コードを組み合わせることで、実務に役立つマクロを作ることができます。

コードが何行もあると複雑に感じますが、今回ご紹介するコードは、ひとつひとつは簡単ですのでぜひファイル操作の自動化に取り入れてみてください。

そのほかのマクロの基礎について、以下の記事にまとめましたので、併せてご活用ください。

目次

エクセルVBAでファイルを開いて閉じる基本構文

エクセルVBAでファイルを開く/閉じる動作は、すべてのマクロの基本となる操作です。

例えば、次のような場合に使われます。

  • 集計用のエクセルファイルを自動で開く
  • 集計後にファイルを自動で閉じる

VBAでファイルを開くにはOpen、ファイルを閉じるにはCloseを使います。

この2つを正しく覚えて、ファイルを自在に扱える第一歩を踏み出しましょう!

VBAの基礎用語として「プロパティ・メソッド・ステートメント」などがありますが、最初の段階では正確な呼び方を覚えることよりも、「この一行で何が起きるのか」を体感するほうが大切です。

Workbooks.Openは本来は「WorkbooksオブジェクトのOpenメソッド」といいますが、この記事では理解しやすいように「プロパティ・メソッド・ステートメント」などは極力省いて解説しています。

VBAでエクセルファイルを開く基本構文

エクセルVBAでファイルを開くときの基本構文は以下のとおりです。

Workbooks.Open "ファイルの場所とファイル名.xlsx"

このコードを実行すると、指定したファイルの場所にあるファイルが自動で開きます。

ファイルの場所とファイル名のあとに引数を設定することで、開く際の動作をカスタマイズできます。

設定できる引数は10個以上ありますが、実務に使用するのは以下の4つがほとんどです。

引数内容備考
ReadOnly読み取り専用で開くときReadOnly:=Trueで読み取り専用になる
Passwordパスワード付きファイルを開くときPassword:="ファイルのパスワード"と設定する
WriteResPassword書込み保護パスワード付きのファイルを開くときWriteResPassword:="書き込み保護パスワード"と設定する
IgnoreReadOnlyRecommended上書き推奨の警告を無視して開くときIgnoreReadOnlyRecommended:=Trueで警告を無視する

例えば、「パスワード付き」「書込み保護パスワード付き」のエクセルファイルを開く構文は次のように書きます。

Workbooks.Open "ファイルの場所とファイル名.xlsx", Password:="パスワード", WriteResPassword:="パスワード"

引数を複数設定したい場合は、後ろにつなげて書きます。

それでは作例として、デスクトップにある「売上管理」フォルダ内にある「四半期ごとの売上ファイル」を開くマクロを作成します。

サンプルデータ
サンプルデータ

「2026年売上集計」ファイルにVBAを記述しましょう。

STEP
エクセルファイルを開き、VBAエディタを開く
VBAエディタを開く
VBAエディタを開く
  • 「開発」タブを押す
  • 「Visual Basic」をクリック
ライクさん

Alt+F11でも開くよ!

STEP
標準モジュールを挿入
標準モジュールを挿入する
標準モジュールを挿入する
  • 「挿入」を押す
  • 「標準モジュール」をクリック
STEP
プロシージャを挿入
標準モジュール内にプロシージャを挿入する
標準モジュール内にプロシージャを挿入する
  • 「挿入」をクリック
  • 「プロシージャ」をクリック
STEP
マクロ名を入力する
マクロ名は日本語でOK
マクロ名は日本語でOK
  • 「名前」にマクロ名を入力
  • 「OK」ボタンを押す
STEP
プロシージャが挿入されたことを確認
プロシージャが挿入された
プロシージャが挿入された

Public SubEnd Subの間にファイルを開くVBAコードを書きましょう。

いったんVBAエディタを最小化し、開きたいファイルが格納されているフォルダを開きます。

STEP
開きたいファイルのパスをコピーする
右クリックで選択
右クリックで選択
  • マクロで開きたいファイルを右クリック
  • 「パスのコピー」を選択
STEP
VBAエディタにコードを記述する
VBAコードも同時に記述する
VBAコードも同時に記述する
  • VBAエディタにSTEP6でコピーしたファイルのパスをCtrl+Vで貼り付ける
  • パスの前にWorkbooks.Open と入力する
ライクさん

Workbooks.Openとファイルのパスの間には半角スペースが入るよ!
Shiftspaceで半角スペースが入力できるんだ!

STEP
必要に応じてほかの引数を入力
記号はすべて半角にする
記号はすべて半角にする

他の引数がある場合は、「,」「半角スペース」を入力して次の引数を入力しましょう。

STEP
実行ボタンを押す
再生ボタンのアイコンを押す
再生ボタンのアイコンを押す

「実行」ボタンを押してマクロを実行する

ライクさん

F5でもマクロを実行できるよ!

STEP
ファイルが開いたことを確認
指定したファイルが開いた
指定したファイルが開いた

マクロを使ってファイルを開くことができました。

VBAコードを書いたファイルは、「マクロファイル」として保存しておきましょう。

なお、以下のコードのように変数を使って開くファイルを指定することもできます。

Dim wb As Workbook
  Set wb = Workbooks.Open("ファイルの場所とファイル名.xlsx")

この場合、wbという変数にファイルパスを格納しています。

特定のファイルをマクロで開いて閉じる場合は、このように変数を使うと便利ですので覚えておきましょう。

相対パス・絶対パスを使い分けよう

先ほどの作業手順ではファイルのフルパスを指定しました。

このように、ファイルの場所を最初から全部指定する方法を「絶対パス」と言います。

一方で、マクロを実行するファイルから相対的な位置で指定する方法は「相対パス」です。

相対パスで指定する場合はThisWorkbook.Pathを使います。

マクロを実行するファイルと同じ場所に「2026年第1四半期.xlsx」がある場合は以下のように記述します。

Workbooks.Open ThisWorkbook.Path & "\" & "2026年第1四半期.xlsx"

もしも、マクロを実行するファイルより下のフォルダ階層に「2026年第1四半期.xlsx」がある場合は、以下のとおりです。

Workbooks.Open ThisWorkbook.Path & "\" & "フォルダ名\2026年第1四半期.xlsx"

絶対パスと相対パスの使い分けは、以下を参考にして実務に合わせて設定してください。

  • 会社の共有フォルダなど、毎回同じ場所にあるファイルを開く場合:絶対パス指定
  • プロジェクトごとのフォルダを誰かに配布する場合:相対パス指定

以下のようにファイルのパスを指定せずファイル名のみ記述した場合は、カレントディレクトリからファイルを探します。

Workbooks.Open "2026年第1四半期.xlsx"
ライクさん

「カレントディレクトリ」とは、今いるフォルダのことだよ!

VBAではThisWorkbook.Pathには最後に\が付かない一方で、手入力したパスには\が付くことがあります。

VBAでファイルパスとファイル名を連結する場合、エラーが起きた際にまずは\が重複したり抜けたりしていないかチェックしましょう。

ファイルパスを変数に格納する場合は、以下のコードを追加するのも有効です。

If Right$(fPath, 1) <> "\" Then fPath = fPath & "\"

変数fPathに格納されたパスの最後に\が付かない場合は\を追加するコードです。

開いたファイルをVBAで閉じる基本

VBAでファイルを閉じる際はCloseというコードを使います。

ここでポイントとなるのが、次の2点です。

  • どのファイルを閉じるのか
  • ファイルを閉じる際に保存するかどうか
1.どのファイルを閉じるのか

ファイルの種類によってCloseの前にくるコードが異なります。

閉じたいファイルの種類コード
最後に操作したファイルActiveWorkbook.Close
マクロが書かれている作業元のファイルThisWorkbook.Close
ファイル名を指定Workbooks("ファイル名").Close
開いているすべてのファイルWorkbooks.Close
2.ファイルを閉じる際に保存するかどうか

ファイルを閉じる際に保存するかどうかは、Closeの引数SaveChangesで指定します。

  • 保存する場合はSaveChanges:=True
  • 保存しない場合はSaveChanges:=False

最後に操作したファイルを保存してから閉じる場合は、以下のとおりです。

ActiveWorkbook.Close SaveChanges:=True

ファイル名を指定して、保存せずに閉じる場合は次のとおりです。

Workbooks("ファイル名.xlsx").Close SaveChanges:=False

なお、確実に特定のファイルを閉じる場合は、変数を使うことをお勧めします。

特定のファイルを開いて閉じるコード例は以下のとおりです。

Dim wb As Workbook

Set wb = Workbooks.Open("ファイルの場所とファイル名.xlsx")
 
'~中略~

wb.Close SaveChanges:=True

マクロの内容を簡単に解説するとこのようになります。

wbという変数にファイルパスを格納する
wbという変数にファイルパスを格納する

一番最初に変数を指定しておくことで、その後のマクロの記述が非常にラクになるのでお勧めです。

VBAでダイアログを表示させてファイルを選択して開こう

ファイルを「手動で指定して開く」というマクロは、実務で多く使われます。

VBAではファイルを選択して開く処理は主に次の2通りの方法があります。

  • 簡単:Application.GetOpenFilename
  • 高機能:Application.FileDialog(msoFileDialogFilePicker)

ファイルを複数選択する場合は②を使用します。

ライクさん

①でも複数ファイルを選択できるけど、取り扱いが難しくなるため、この記事では複数選択には②を使う方法を紹介しているよ!

作例では①でファイルを開く方法を解説し、②はサンプルコードを掲載します。

まずは簡単な方法をマスターしましょう。

任意のエクセルファイルからAlt+F11でVBAエディタを開き、コードを記述していきます。

STEP
「標準モジュール」「プロシージャ」を挿入
「挿入」タブから選択
「挿入」タブから選択
  • 「挿入」タブを押す
  • 「標準モジュール」を押す
  • 同様に「挿入」→「プロシージャ」をクリック
STEP
マクロ名を入力
分かりやすい名前を付ける
分かりやすい名前を付ける
  • 「名前」欄に分かりやすいマクロ名を入力
  • 「OK」ボタンを押す
STEP
コードをコピペする
そのままコピペしてOK
そのままコピペしてOK

以下のコードをPublic Sub マクロ名()End Subの間にコピー&ペーストします。

    Dim f As Variant  ' 文字列 or False が返る
    
    ' 種類を絞り込む(xlsx / xlsm / すべて)
    f = Application.GetOpenFilename( _
            FileFilter:="Excelブック (*.xlsx;*.xlsm),*.xlsx;*.xlsm,すべてのファイル (*.*),*.*", _
            FilterIndex:=1, _
            Title:="開くファイルを選んでください")
            
    If f = False Then Exit Sub          ' キャンセルなら終了
    
    Workbooks.Open Filename:=CStr(f), ReadOnly:=False

コードのポイントについては後ほど解説します。

ライクさん

コードが長くなる場合は、 _改行できるよ!
アンダーバーの前に半角スペースを入れるのを忘れないでね!

STEP
マクロの実行を押す
F5キーを押してもOK
F5キーを押してもOK

VBAコードを書き終えたら、マクロの実行を押してマクロがどのように動くのか確認しましょう。

STEP
ダイアログボックスが表示されることを確認
左上のタイトルが指定されたものとなっていることも確認
左上のタイトルが指定されたものとなっていることも確認
  • ダイアログボックスが表示されることを確認する
  • 好きなファイルを選択
  • 「開く」ボタンを押す
STEP
選んだファイルが開くことを確認
マクロでファイルを開くことができた
マクロでファイルを開くことができた

STEP5で選択したファイルが開くことを確認しましょう。

それでは、使用したコードのポイントを解説していきます。

Dim f As Variant

変数fにデータを格納します。

格納するデータは「ファイルのパスである文字列」と、ダイアログをキャンセルしたときの「False」と種類が異なるため、あらゆるタイプのデータを格納することができるVariant型を指定します。

f = Application.GetOpenFilename()

変数fに「開くファイルを選ぶ」ダイアログで指定したファイルのパスを格納します

FileFilter:

GetOpenFilenameの引数のひとつ。

FileFilter:で表示対象を絞り込むことができます。複数指定する場合はカンマで区切ります。

ここでは以下の2種類としています。

  • エクセルファイル
  • すべてのファイル
FilterIndex:=1

GetOpenFilenameの引数のひとつ。

FilterIndex:で、FileFilter:で絞り込んだ対象のうち、最初に表示するフィルタを指定できます。

今回は①番目のエクセルファイルを指定しています。

Title:

GetOpenFilenameの引数のひとつ。

Title:でダイアログのタイトル文字を設定できます。

If f = False Then Exit Sub

ダイアログをキャンセルしたとき、変数fに「False」が格納されます。

If f = False Then Exit Subでは、fに「False」が格納された場合は処理を終了することを指定しています。

この一行を入れておかないと、キャンセル時にマクロがエラーになります。

キャンセル対策として必須のコードです。

Workbooks.Open Filename:=CStr(f), ReadOnly:=False

変数fに格納したファイルのパスをCStr関数で文字列に変換した上でファイルを開きます。

ReadOnly:=Falseは読み取り専用では開かない設定をしています。

ファイルを複数選択する場合のサンプルコードは以下のとおりです。

Application.GetOpenFilenameでは複数選択の際の取り扱いが難しいため、Application.FileDialog(msoFileDialogFilePicker)を使います。

Public Sub 複数ファイルを開く()
    Dim fd As FileDialog, i As Long

    Set fd = Application.FileDialog(msoFileDialogFilePicker)
    With fd
        .Title = "開くファイルを選択"
        .AllowMultiSelect = True                  ' ←複数選択
        .Filters.Clear
        .Filters.Add "Excelブック", "*.xlsx; *.xlsm"
        .Filters.Add "すべてのファイル", "*.*"
        If .Show <> -1 Then Exit Sub              ' キャンセル
        ' すべて開く
        For i = 1 To .SelectedItems.Count
            Workbooks.Open .SelectedItems(i)
        Next
    End With
End Sub

サンプルコードのポイントは次のとおりです。

Dim fd As FileDialog, i As Long

変数fdiのデータの型を宣言しています。

  • fd As FileDialog:fdに格納されるデータはファイルダイアログであること
  • i As Long:iに格納されるデータは整数であること
Set fd = Application.FileDialog(msoFileDialogFilePicker)

変数fdに格納するファイル選択ダイアログを作ります。

msoFileDialogFilePickerで、ファイルを選ぶためのダイアログを指定しています。

With fd~End With

With fdからEnd Withの間に書かれたものは変数fdに対する設定です。

AllowMultiSelect

.AllowMultiSelect = Trueでファイルの複数選択を許可しています。

TrueをFalseに変更すると選択できるファイルは1つのみになります。

If .Show <> -1 Then Exit Sub

If .Show <> -1 Then Exit Subでファイル選択ダイアログがキャンセルされたら処理を終了することを指示しています。

この一行がないとダイアログをキャンセルした際にマクロがエラーとなるため、忘れずに記載しましょう。

For~Next

処理を繰り返すコードです。

1 To .SelectedItems.Countで、選んだファイルの件数だけ処理を繰り返します。

SelectedItemsにファイルのパスとファイル名が格納されており、1つずつWorkbooks.Open で開いています。

例えば第1四半期~第4四半期の4つのファイルを複数選択した場合、SelectedItemsに格納されているイメージは次のとおりです。

SelectedItems(1):"C:\デスクトップ\売上管理\2026年第1四半期.xlsx"

SelectedItems(2):"C:\デスクトップ\売上管理\2026年第2四半期.xlsx"

SelectedItems(3):"C:\デスクトップ\売上管理\2026年第3四半期.xlsx"

SelectedItems(4):"C:\デスクトップ\売上管理\2026年第4四半期.xlsx"

このように、ファイルを複数選択するかどうかでコードを使い分けることがポイントです。

どちらの場合でもダイアログのキャンセル対策をして、マクロがエラーにならないように気を付けましょう。

フォルダの選択や作成をエクセルVBAで行う基本

フォルダの操作は、VBAでファイルを扱ううえで基本となるものです。

例えばファイルの保存先について、いちいちフォルダのパスを手作業で指定するのは面倒です。

VBAを使って効率よく確実に処理を行いましょう。

この章で使う主なVBAコードは以下のとおりです。

  • FileDialog:フォルダを選ぶ
  • Dir:フォルダがあるか確認する
  • MkDir:フォルダがなければ作る

この3つを組み合わせれば、保存・バックアップ・自動出力など実務で必要なフォルダ操作のほぼすべてをカバーできます。

VBAでフォルダ選択ダイアログを表示させよう

まずは、エクセルファイルの保存先を自由に選べるようにする「フォルダ選択ダイアログ」を見てみましょう。

フォルダを選択できるダイアログはApplication.FileDialog(msoFileDialogFolderPicker)で表示できます。

このコードをマクロに組み込むことで、自分で保存先のフォルダを選んだり、処理対象のフォルダを指定したりできます。

フォルダを固定せずに状況に応じて柔軟に指定したい場合に、とても便利です。

作例として、選んだフォルダ名と場所がメッセージとして表示されるマクロを作成してみましょう。

以下のコードを使用します。

コード例
コード例

IF文で条件分岐をすることで、キャンセル時にマクロを止めるようにしています。

任意のエクセルファイルからAlt+F11でVBAエディタを開き、コードを記述していきましょう。

STEP
「標準モジュール」と「プロシージャ」を挿入する
「挿入」タブから選択
「挿入」タブから選択
  • 「挿入」タブを押す
  • 「標準モジュール」をクリック
  • 同様に「挿入」→「プロシージャ」を選択する
STEP
マクロの名前を付ける
分かりやすいマクロ名を付けるのがポイント
分かりやすいマクロ名を付けるのがポイント
  • マクロ名を入力する
  • 「OK」ボタンを押す
STEP
コードをコピペする
コードを貼る
コードを貼る

以下のコードをCtrl+Cでコピーし、Ctrl+Vでプロシージャに貼り付けてください。

    Dim fd As FileDialog
    Dim fPath As String

    ' フォルダ選択ダイアログを作成
    Set fd = Application.FileDialog(msoFileDialogFolderPicker)

    ' ダイアログを表示(キャンセルされたら終了)
    If fd.Show <> -1 Then Exit Sub

    ' 選択されたフォルダパスを取得
    fPath = fd.SelectedItems(1)

    ' 結果を表示(確認用)
    MsgBox "選択されたフォルダ:" & fPath
STEP
マクロがどう動くか確認する
フォルダダイアログボックスが表示された
フォルダダイアログボックスが表示された
  • マクロの「実行」ボタンを押す
  • フォルダダイアログボックスが表示されることを確認
  • 好きなフォルダを選ぶ
  • 「OK」ボタンを押す
ライクさん

If fd.Show <> -1 Then Exit Subがあるので、ここで「OK」を押さずに「キャンセル」や「閉じる」ボタンを押したら、マクロが終了するよ!

STEP
選択した結果が表示された
メッセージボックスに結果が表示された
メッセージボックスに結果が表示された
  • メッセージボックスにフォルダの場所とフォルダ名が表示されたことを確認
  • 「OK」ボタンを押して終了

実務で使う場合は、MsgBox "選択されたフォルダ:" & fPathの部分を例えば以下のように変更します。

' 指定したフォルダにファイルを保存する
ActiveWorkbook.SaveAs fPath & "\ファイル名.xlsx"

この場合、直近に操作したファイルを、選択したフォルダに保存します。

ファイル名は& "\ファイル名.xlsx"で指定した名前に変わります。

保存先のフォルダが毎回異なったりフォルダのパスが変更される可能性があったりする場合は、このようにフォルダ選択ダイアログをマクロで表示させることで、柔軟に対応できるのでお勧めです。

ぜひ、実務に取り入れてみましょう。

フォルダの存在をエクセルVBAで確認しよう

指定したフォルダが存在するかどうかは、Dirという関数で確認することができます。

ライクさん

Dirは「ディル」と読むよ!
「Directory」の略なんだよ。

Dirは、指定した場所にその名前のファイルやフォルダがあるか一つずつ探して、その名前を返す関数です。

見つからなければ空文字列""を返すため、これでファイルやフォルダの存在を簡単に確認できます。

ファイルの読み込みや保存をするときに、この関数を使ってフォルダが存在するかどうか確認することで、マクロのエラーを防ぐことができます。

次のサンプルコードはフォルダの存在の有無でその後の処理が分かれています。

  • 確認したいフォルダが実際に存在する場合は、メッセージボックスにフォルダパスを表示
  • 存在しなければ「フォルダが見つかりません」と表示する
フォルダが存在する場合はフォルダパスが表示される
フォルダが存在する場合はフォルダパスが表示される
Public Sub フォルダの存在をチェック()

Dim fPath As String
fPath = "確認したいフォルダの場所"  

If Len(Dir(fPath, vbDirectory)) > 0 Then
    MsgBox "フォルダが存在します。" & fPath
Else
    MsgBox "フォルダが見つかりません。"
End If

End Sub

"確認したいフォルダの場所"のところに、実際のフォルダパスを入力しましょう。

条件分岐はIfThenElseEnd Ifで設定しています。

  • Else:条件に当てはまらない場合の動作を指定
  • Then:条件に合致する場合の動作を指定

また、If Len(Dir(fPath, vbDirectory)) > 0の箇所が少し複雑なので解説します。

Dir(fPath, vbDirectory)

変数fPathで指定したフォルダパスが存在しているかどうか、Dirを使って調べています。

vbDirectoryは「フォルダ」だけを探すという意味です。

フォルダパスが存在すればそのフォルダパスを、存在しなければ空文字列""を返します。

Len(Dir(fPath, vbDirectory)) > 0

Len関数を使い、Dir(fPath, vbDirectory)で返された文字数を調べています。

Len関数はエクセルでもおなじみの、文字数をカウントする関数です。

フォルダパスが存在すれば、Len関数の結果は0より大きいです。

実務で使う場合は、MsgBox "フォルダが存在します。" & fPathの部分を例えば以下のように変更します。

' 指定したフォルダにマクロが登録された作業元のファイルを保存する
ThisWorkbook.SaveAs fPath & "\" & "ファイル名.xlsm"

マクロが登録された作業元のファイルを、選択したフォルダに保存します。

ファイル名は& "\ファイル名.xlsm"で指定した名前に変わります。

保存やバックアップ作成をする前に、今回説明した「フォルダの存在チェック」をしておくと、マクロが失敗しにくくなります。

フォルダが存在しない場合に新規作成する手順

マクロを使って保存やバックアップをするとき、指定したフォルダが存在しない場合があります。

そのときは、エクセルVBAの MkDirを使うと、フォルダを自動で作れます。

ライクさん

MkDirは「エムケーディル」と読むよ!
「Make Directory」の略だと知っておけば、どんな関数か分かりやすいね!

例えば「バックアップ先のフォルダがなければ自動で作る」といった処理に使えるので、定期レポートの保存などに便利です。

以下のコードは、前節のサンプルコードをアレンジして作成しました。

Public Sub フォルダが無ければ作成する()

Dim fPath As String
fPath = "確認したいフォルダの場所"  

If Len(Dir(fPath, vbDirectory)) = 0 Then
    MkDir fPath
    MsgBox "フォルダを新規作成しました。"
Else
    MsgBox "フォルダは存在します。"
End If

End Sub

ポイントは次のとおりです。

  • Dir(fPath, vbDirectory)でフォルダがなければ空文字列""を返す
  • Len(Dir(fPath, vbDirectory))=0、すなわちフォルダが無い場合はMkDirを実行してフォルダを作成
  • Len(Dir(fPath, vbDirectory))が0ではない場合はメッセージボックスで「フォルダは存在します。」と表示

このように、指定した場所にその名前のフォルダがあるか探すDirと、フォルダを作成するMkDirはセットで使うのが基本です。

フォルダを操作する基本として、この2つをまずは使えるようにしましょう。

MkDirは、一度にフォルダの1階層までしか作ることができません。

例えば以下の図のように、一度に2階層を作ろうとするとエラーになります。

一度に2階層は作れない
一度に2階層は作れない

繰り返し処理などを使って複数階層のフォルダをまとめて作る方法もありますが、複雑なコードを書く必要があるため、初心者の場合は手動で作ったほうが確実です。

VBAを使ってファイル名を取得して一覧表にしよう

エクセルVBAでは、フォルダ内のファイル名を自動で一覧にすることができます。

大量のファイルを確認したいときなどに便利です。

紬ちゃん

監査のときに、ファイルの一覧表を提出するから助かる~!

作例では、ダイアログボックスで選んだフォルダの中にあるファイル名の一覧について、エクセルのシートに書き出すコードを紹介します。

前の章で解説したApplication.FileDialog(msoFileDialogFolderPicker)Dir関数を使います。

以下のフォルダの一覧表を取得するとどうなるか、一緒に確認しましょう。

サンプルデータ
サンプルデータ

作例ではこのフォルダ内の「2026年売上集計.xlsm」にVBAを作っていますが、フォルダの外にあるエクセルファイルでも構いません。

好きなエクセルファイルを開きAlt+F11でVBAエディタを開き、コードを記述していきましょう。

STEP
「標準モジュール」「プロシージャ」を挿入
「挿入」タブから選択
「挿入」タブから選択
  • 「挿入」タブを選択
  • 「標準モジュール」を押す
  • 同様に「挿入」→「プロシージャ」をクリック
STEP
マクロ名を入力
分かりやすい名前を付けましょう
分かりやすい名前を付けましょう
  • 「名前」欄にマクロ名を入力
  • 「OK」ボタンをクリック
STEP
VBAコードをコピペする
Public SubとEnd Subの間に貼る
Public SubとEnd Subの間に貼る

Public Sub マクロ名()End Subの間に以下のコードを貼ってください。

    Dim fd As FileDialog
    Dim fPath As String
  Dim fName As String
    Dim i As Long

    ' フォルダ選択ダイアログを作成
    Set fd = Application.FileDialog(msoFileDialogFolderPicker)

    ' ダイアログを表示(キャンセルされたら終了)
    If fd.Show <> -1 Then Exit Sub

    ' 選択されたフォルダパスを取得
    fPath = fd.SelectedItems(1)

    ' パスの末尾に\がなかった場合は補う
    If Right$(fPath, 1) <> "\" Then fPath = fPath & "\"

    ' ファイル名を列挙
    fName = Dir(fPath & "*.*")

    i = 1

    Do While fName <> ""
        Cells(i, 1).Value = fName            ' ファイル名
        Cells(i, 2).Value = fPath & fName    ' フルパス
        fName = Dir                           ' 次のファイル名
        i = i + 1
    Loop

    MsgBox "一覧出力が完了しました。"

コードの前半部分については前章で解説済みです。

後半部分のポイントは後ほど解説します。

STEP
VBAエディタでマクロを実行する
F5でもOK
F5でもOK
  • 「マクロの実行」ボタンを押す
  • フォルダ選択ダイアログボックスが表示される
  • ファイル一覧を表示したいフォルダをクリック
  • 「OK」ボタンを押す
STEP
エクセルにフォルダ内のファイル一覧が表示された
エクセルファイル以外の拡張子があることを確認
エクセルファイル以外の拡張子があることを確認
  • 一覧表が表示されたのちにメッセージボックスが表示されることを確認
  • 「OK」ボタンを押す

コードのポイントは次のとおりです。

If Right$(fPath, 1) <> "\" Then fPath = fPath & "\"

フォルダの最後に\がないと、後でfPath & fName でファイルのフルパスを作るときに、フォルダ名とファイル名がくっついてしまいマクロが動きません。

そのため、If Right$(fPath, 1) <> "\" Then fPath = fPath & "\"を使い、フォルダパスの末尾に\が無い場合は追加しています。

fName = Dir(fPath & "*.*")

変数fNameに、フォルダの中にあるファイル名を格納しています。

*.*はすべてのファイルが対象という意味です。

もしもエクセルファイルのみの場合は、*.**.xlsxに変更します。

i = 1

シートに書き出す行番号を1から始めるための設定です。

後に出てくるCellsの行番号を1行ずつ下に進めるために、行カウンタの初期化を行っています。

Do While fName <> ""~Loop

Do WhileLoopを使い、変数fNameに格納したファイルがなくなるまで処理を繰り返します。

  • Cells(i, 1):A列にファイル名だけを出力
  • Cells(i, 2):B列にフルパスを出力
  • fName = Dir:次のファイル名を取得
  • i = i + 1:1行下に進める

今回ご紹介したコードで行っている、以下のテクニックは定番で使うものです。

  • IfExit Subのキャンセル対策
  • フォルダ末尾の「\」補正
  • i = 1のカウンタ初期設定

これらはぜひ覚えておきましょう。

ファイルの存在チェックとバックアップを一度に行う手順

この章では、Dir関数とFileCopyを使って、ファイルの存在チェックとバックアップを同時に行うマクロをご紹介します。

作例では、次の3つを自動化するマクロを作ります。

  • 「2026年第3四半期.xlsx」の存在をチェック
  • 存在する場合に作業日の日付つきのバックアップを作成
  • ファイルが存在しない場合にエラーメッセージを表示する
「2026年第3四半期.xlsx」の存在をチェックする
「2026年第3四半期.xlsx」の存在をチェックする

マクロを記述するエクセルファイルを開いたうえでAlt+F11でVBAエディタを開き、コードを記述していきましょう。

ライクさん

作例では「2026年売上集計.xlsm」にマクロを記述したよ!
存在チェックしたいファイルとは異なるファイルにマクロを記述しよう!

STEP
「標準モジュール」と「プロシージャ」を挿入
「挿入」タブから選択
「挿入」タブから選択
  • 「挿入」タブを押す
  • 「標準モジュール」をクリック
  • 同様に「挿入」→「プロシージャ」を選択
STEP
マクロ名を入力
分かりやすい名前にしましょう
分かりやすい名前にしましょう
  • 「名前」欄にマクロ名を入力する
  • 「OK」ボタンをクリック
STEP
VBAコードをコピペする
Public SubとEnd Subの間に貼る
Public SubとEnd Subの間に貼る

Public Sub マクロ名()End Subの間に以下のコードを貼ってください。

    Dim fPath As String
    Dim bkPath As String
    
    fPath = "ファイルの場所とファイル名"
    bkPath = "バックアップファイルを作る場所のパス\バックアップ_" & Format(Now, "yyyymmdd") & ".xlsx"
    
    If Len(Dir(fPath)) = 0 Then
        MsgBox "ファイルが見つかりません。"
        Exit Sub
    Else
        FileCopy fPath, bkPath
        MsgBox "バックアップを作成しました"
    End If

コードのポイントは後ほど解説します。

コードを貼り終えたら、VBAエディタはいったん最小化し、エクスプローラーを開きましょう。

STEP
ファイルのパスをコピーする
エクスプローラーを表示する
エクスプローラーを表示する
  • エクスプローラーに存在チェックしたいファイルを表示させて右クリック
  • 「パスのコピー」を押す
STEP
VBAエディタにファイルのパスをペースト
VBAエディタに戻って作業する
VBAエディタに戻って作業する

VBAエディタを再び表示させ、Ctrl+V"ファイルの場所とファイル名"の箇所にファイルのパスをペーストします。

バックアップファイルを作る場所についても、存在チェックしたいファイルのパスを参考にパスを設定します。

ライクさん

作例では、どちらのファイルも「デスクトップ>売上管理フォルダ」に設定しているよ!

STEP
マクロを実行する
F5でマクロを実行してもOK
F5でマクロを実行してもOK
  • 「マクロの実行」を押す
  • 処理が終わったらメッセージボックスが表示されることを確認
  • 「OK」ボタンを押す
STEP
バックアップファイルが作成されていることを確認
バックアップファイルが作成された
バックアップファイルが作成された
  • バックアップファイルが作成されたことを確認
  • バックアップファイルと存在を確認したファイルの更新日時が同じであることを確認
ライクさん

更新日時が同じことから、ファイルを開かずにコピーしたことが分かるよ!

このマクロを実行して、確認したいファイルが存在しない場合は以下のメッセージボックスが表示されます。

ファイルが存在しない場合に表示
ファイルが存在しない場合に表示

今回のコードのポイントは次のとおりです。

bkPath = "バックアップファイルを作る場所のパス\バックアップ_" & Format(Now, "yyyymmdd") & ".xlsx"

変数bkPathに、バックアップファイルの保存先とファイル名を格納しています。

Formatは指定した書式で値を文字列であるString型に変換する関数です。

Format(Now, "yyyymmdd")で現在の日付をyyyymmddで表示しています。

If~Then~Else~End If

If文で条件分岐をしています。

  • Then:条件に合致する場合の動作を指定
  • Else:条件に当てはまらない場合の動作を指定
FileCopy fPath, bkPath

FileCopyは元のファイルを閉じたままコピーできる命令です。

  • fPath:コピー元のファイルを指定
  • bkPath:コピーした後のファイルの保存先とファイル名を指定

このマクロは「ファイルの存在チェック→コピー保存→完了メッセージを表示」という基本的なバックアップを行っています。

VBAに慣れてきたら、後に紹介する自動保存やタイマー処理も組み合わせて、より使いやすいマクロを作成してみましょう。

エクセルVBAでファイルを保存する基本構文

ファイルを開いてから閉じるまでの間に必ず出てくるのがファイル保存です。

せっかくマクロで自動化を行っても、作成したデータを保存しなければ無駄になってしまいます。

ファイルを閉じる際に上書き保存するコードは先に紹介しましたが、この章では以下の3点を解説します。

  • 名前を付けて保存:SaveAs
  • 上書き保存:Save
  • 応用として自動保存・バックアップの方法

この3つを覚えるだけでVBAの保存処理が自由に行えます。

名前を付けて保存をVBAで行う方法

現在開いているエクセルファイルを新しい名前で保存するにはSaveAsを使います。

基本構文は次のとおりです。

対象となるファイル.SaveAs Filename:="ファイルの場所とファイル名.xlsx"

対象となるファイルに応じてコードを以下の表のとおり変更してください。

対象となるファイルコード
最後に操作したファイルActiveWorkbook.SaveAs
マクロが書かれている作業元のファイルThisWorkbook.SaveAs
ファイル名を指定Workbooks("ファイル名").SaveAs

ファイルの場所とファイル名のあとに引数を設定することで、開く際の動作をカスタマイズできます。

引数を設定することで、保存の際の動作をカスタマイズできます。

設定できる引数は10個以上ありますが、実務に使用するのは以下の5つがほとんどです。

引数内容備考
Filename:=保存するファイルのフルパスパスはダブルクォーテーションで囲む
FileFormat保存形式xlOpenXMLWorkbook:xlsxファイル
xlOpenXMLWorkbookMacroEnabled:xlsmファイル
xlCSV:csvファイル
Passwordパスワードを設定パスワードはダブルクォーテーションで囲む
WriteResPassword書き込み専用パスワードパスワードはダブルクォーテーションで囲む
Local日本語のパス・ファイル名の文字化け防止に使用Trueを推奨

わたしたちがエクセルで「名前を付けて保存」を手動でするのと同じ作業をマクロが代わりに行うイメージです。

作例では、開いているファイルについて、自動で日付付きファイルを保存する方法を解説します。

データが入っているファイルを開いたうえでAlt+F11でVBAエディタを開き、コードを記述していきましょう。

STEP
エディタに「標準モジュール」と「プロシージャ」を挿入
「挿入」タブから選択
「挿入」タブから選択
  • 「挿入」タブを押す
  • 「標準モジュール」をクリック
  • 同様に「挿入」→「プロシージャ」を選択する
STEP
マクロ名を入力
分かりやすい名前を付ける
分かりやすい名前を付ける
  • 「名前」欄にマクロ名を入力する
  • 「OK」ボタンを押す
STEP
VBAコードをコピペする
Public SubとEnd Subの間に貼る
Public SubとEnd Subの間に貼る

Public Sub マクロ名()End Subの間に以下のコードをコピー&ペーストします。

    Dim fPath As String
    fPath = "ファイルを保存したい場所のパス\バックアップ_" & Format(Now, "yyyymmdd") & ".xlsx"
    ActiveWorkbook.SaveAs Filename:=fPath, FileFormat:=xlOpenXMLWorkbook, Local:=True
    MsgBox "ファイルを保存しました:" & fPath

貼り付けたあとで、ファイルを保存したい場所のパスを手入力しましょう。

コードのポイントは後ほど解説します。

STEP
エクセルに文字を入力する
好きな文字を入力
好きな文字を入力

保存されていることが確認できるよう、VBAエディタからエクセルに戻り、好きな文字を入力しましょう。

STEP
VBAエディタでマクロを実行する
F5でもOK
F5でもOK

エクセルファイルを最小化してVBAエディタに戻り、「マクロの実行」ボタンを押します。

STEP
保存方法の確認をする
機能の保存と消去を押す
機能の保存と消去を押す

この画面が表示された場合は、「機能の保存と消去」をクリックします。

STEP
メッセージボックスが表示されることを確認
ファイル名とファイルの場所も確認
ファイル名とファイルの場所も確認

VBAでメッセージボックスが表示されるようにしているので、内容を確認して「OK」ボタンを押しましょう。

STEP
新たにエクセルファイルが出来ていることを確認
日付が作業日と同じであることを確認
日付が作業日と同じであることを確認

STEP3で指定した場所に新たにエクセルファイルが出来ていることを確認しましょう。

STEP
新たに出来たファイルの内容を確認
ファイルを開いて確認
ファイルを開いて確認

新たに出来たファイルを開き、STEP4で入力した文字が保存されていることを確認します。

VBAのポイントは以下のとおりです。

Dim fPath As String

変数fPathのデータの型を指定します。

fPathには保存先のパスを格納するため、文字列であるStringを指定しています。

fPath = "ファイルを保存したい場所のパス\バックアップ_" & Format(Now, "yyyymmdd") & ".xlsx"

変数fPathに、保存先とファイル名を格納しています。

Formatは指定した書式で値を文字列であるString型に変換する関数です。

Format(Now, "yyyymmdd")で現在の日付をyyyymmddで表示しています。

ActiveWorkbook.SaveAs Filename:=fPath, FileFormat:=xlOpenXMLWorkbook, Local:=True

今アクティブなファイルを、新しい名前で保存します。

引数の意味は以下のとおりです。

  • Filename:=fPath :変数fPathに格納された保存先・ファイル名を指定
  • FileFormat:=xlOpenXMLWorkbook:ファイル形式がxlsx 形式であることを指定
  • Local:=True :文字化け対策として、日本語名のファイルでもOKの設定
MsgBox "ファイルを保存しました:" & fPath

メッセージボックスで作業終了と保存先・ファイル名を表示

「名前を付けて保存」は「ファイルを開く」と同様、マクロの基本となる操作です。

まずはこの使い方をマスターしましょう。

エクセルVBAで上書き保存する方法

ファイルを一度保存したあとに、同じファイル名で上書き保存したいときはSaveを使います。

エクセルで手動でCtrl+Sを押すのと同じ動作であり、ファイル名を指定する必要はありません。

コード例は次のとおりです。

Public Sub 上書き保存()
    ActiveWorkbook.Save
    MsgBox "上書き保存が完了しました。"
End Sub

ActiveWorkbook.Saveで、いま開いているファイルを上書き保存します。

保存先やファイル名を変えたい場合は前節のSaveAsを使いましょう。

自動保存マクロをエクセルに組み込む手順

作業中にこまめに保存するのを忘れがちな方にお勧めするのが、自動保存マクロです。

SaveSaveCopyAs を組み合わせて、上書き保存とバックアップの両方を一度に実行します。

コードは以下を参考にしてください。

Public NextTime As Date


Public Sub 自動保存マクロ()
    Dim bkPath As String

    ' バックアップの保存先を指定
    bkPath = "バックアップを保存する場所のパス\" & ThisWorkbook.Name

    ' 上書き保存
    ThisWorkbook.Save

    ' バックアップコピーを作成
    ThisWorkbook.SaveCopyAs bkPath

    ' メッセージ表示
    MsgBox "自動保存&バックアップを完了しました。"

    ' 5分後にこのマクロを再実行(自動ループ)
  NextTime = Now + TimeValue("00:05:00")
    Application.OnTime NextTime, "自動保存マクロ"
End Sub

"バックアップを保存する場所のパス"は、実際のフォルダパスに変更してください。

ポイントは次のとおりです。

Public NextTime As Date

NextTimeという変数に格納されるデータが日時であることを表しています。

後述のマクロ「自動保存マクロを停止」と共通して使えるよう、Public Sub 自動保存マクロ()の外に書いています。

bkPath = "バックアップを保存する場所のパス\" & ThisWorkbook.Name

変数bkPathにバックアップファイルを保存するパスを格納します。パスの最後には\を付けましょう。

ThisWorkbookはこのマクロが入っているファイルのことを指します。

他のファイルを指定したい場合はWorkbooks("ファイル名")に変更しましょう。

MsgBox "自動保存&バックアップを完了しました。"

自動保存とバックアップが完了したことをメッセージボックスで表示します。

表示しなくても良い場合はこの行を削除しましょう。

NextTime = Now + TimeValue("00:05:00")

変数NextTimeに格納する時間を設定しています。この場合は5分後となっています。

TimeValue("00:05:00")の時間を変えれば保存間隔を変えることができます。

  • 10分ごと:"00:10:00"
  • 1時間ごと:"01:00:00"
Application.OnTime NextTime, "自動保存マクロ"

Application.OnTimeで、決まった間隔でマクロを繰り返し実行しています。

間隔は変数NextTimeで設定した時間です。

また、"自動保存マクロ"はマクロ名が入ります。

なお、自動保存マクロを停止したい場合は、自動保存マクロの下に続けて以下のマクロを作成しておきましょう。

Public Sub 自動保存マクロを停止()

On Error Resume Next
Application.OnTime EarliestTime:=NextTime, _
                   Procedure:="自動保存マクロ", Schedule:=False

End Sub

エクセルのシートに自動保存の「実施」「停止」ボタンを作るのもお勧めです。

エクセルVBAでファイルを開く際のQ&A

マクロでファイルを自動的に開く方法を教えてください。

VBAでファイルを開くにはWorkbooks.Openを使います。

開く際の動作を引数でカスタマイズできます。本文内のVBAでエクセルファイルを開く基本構文をご覧ください。

VBAでフォルダを開くにはどうすれば良いですか?

フォルダを選択できるダイアログはApplication.FileDialog(msoFileDialogFolderPicker)で表示できます。詳しくは本文内のVBAでフォルダ選択ダイアログを表示させようをご覧ください。

ファイル操作がVBA自動化の第一歩

この記事ではファイル操作の基本技を6つご紹介しました。

コードの書き方に迷ったら、ご自身が手動でファイル操作をしている動作をひとつずつ箇条書きで書き出してみてください。

日本語を一文ずつ英訳するように、箇条書きに対応するVBAを当てはめることで、作りたい理想のマクロが完成します。

それではコードのおさらいです。

おさらい
  1. ファイルを開くOpen
  2. ファイルを閉じるClose
  3. フォルダやファイルを選ぶFileDialog
  4. フォルダやファイルの存在確認Dir
  5. フォルダがなければ作るMkDir
  6. 名前を付けて保存SaveAs

ファイル操作は一見地味に見えますが、エクセルを扱う上で欠かせない作業です。

マクロ化もしやすいですので、ぜひ、自動化にチャレンジしてみてくださいね!

今回の基本のコードも含めて、マクロの有効化などの基礎を記事にまとめました。

エクセルの学習を基礎から行いたい方は併せてチェックしてくださいね。

よかったらシェアしてね!
  • URLをコピーしました!
目次