エクセルVBAでファイルを開く方法と自動保存6つの基本技
紬ちゃんエクセルVBAでファイルを開くことができないかな?
ライクさん大丈夫、ファイルを開いたり閉じたりするのはエクセルVBAの基本なんだよ!
今回はエクセルVBAを使って、ファイルを操作する基本技6つをご紹介します。
解説している主なコードは次のとおりです。
- ファイルを開く
Open - ファイルを閉じる
Close - フォルダやファイルを選ぶ
FileDialog - フォルダやファイルの存在確認
Dir - フォルダがなければ作る
MkDir - 名前を付けて保存
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を記述しましょう。

- 「開発」タブを押す
- 「Visual Basic」をクリック
ライクさんAlt+F11でも開くよ!

- 「挿入」を押す
- 「標準モジュール」をクリック

- 「挿入」をクリック
- 「プロシージャ」をクリック

- 「名前」にマクロ名を入力
- 「OK」ボタンを押す

Public SubとEnd Subの間にファイルを開くVBAコードを書きましょう。
いったんVBAエディタを最小化し、開きたいファイルが格納されているフォルダを開きます。

- マクロで開きたいファイルを右クリック
- 「パスのコピー」を選択

- VBAエディタにSTEP6でコピーしたファイルのパスをCtrl+Vで貼り付ける
- パスの前に
Workbooks.Openと入力する
ライクさんWorkbooks.Openとファイルのパスの間には半角スペースが入るよ!
Shift+spaceで半角スペースが入力できるんだ!

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

「実行」ボタンを押してマクロを実行する
ライクさんF5でもマクロを実行できるよ!

マクロを使ってファイルを開くことができました。
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マクロの内容を簡単に解説するとこのようになります。

一番最初に変数を指定しておくことで、その後のマクロの記述が非常にラクになるのでお勧めです。
VBAでダイアログを表示させてファイルを選択して開こう
ファイルを「手動で指定して開く」というマクロは、実務で多く使われます。
VBAではファイルを選択して開く処理は主に次の2通りの方法があります。
- 簡単:
Application.GetOpenFilename - 高機能:
Application.FileDialog(msoFileDialogFilePicker)
ファイルを複数選択する場合は②を使用します。
ライクさん①でも複数ファイルを選択できるけど、取り扱いが難しくなるため、この記事では複数選択には②を使う方法を紹介しているよ!
作例では①でファイルを開く方法を解説し、②はサンプルコードを掲載します。
まずは簡単な方法をマスターしましょう。
任意のエクセルファイルからAlt+F11でVBAエディタを開き、コードを記述していきます。

- 「挿入」タブを押す
- 「標準モジュール」を押す
- 同様に「挿入」→「プロシージャ」をクリック

- 「名前」欄に分かりやすいマクロ名を入力
- 「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コードのポイントについては後ほど解説します。
ライクさんコードが長くなる場合は、 _で改行できるよ!
アンダーバーの前に半角スペースを入れるのを忘れないでね!

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

- ダイアログボックスが表示されることを確認する
- 好きなファイルを選択
- 「開く」ボタンを押す

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
-
変数
fdとiのデータの型を宣言しています。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エディタを開き、コードを記述していきましょう。

- 「挿入」タブを押す
- 「標準モジュール」をクリック
- 同様に「挿入」→「プロシージャ」を選択する

- マクロ名を入力する
- 「OK」ボタンを押す

以下のコードを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

- マクロの「実行」ボタンを押す
- フォルダダイアログボックスが表示されることを確認
- 好きなフォルダを選ぶ
- 「OK」ボタンを押す
ライクさんIf fd.Show <> -1 Then Exit Subがあるので、ここで「OK」を押さずに「キャンセル」や「閉じる」ボタンを押したら、マクロが終了するよ!

- メッセージボックスにフォルダの場所とフォルダ名が表示されたことを確認
- 「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"確認したいフォルダの場所"のところに、実際のフォルダパスを入力しましょう。
条件分岐はIf~Then~Else~End 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階層を作ろうとするとエラーになります。

繰り返し処理などを使って複数階層のフォルダをまとめて作る方法もありますが、複雑なコードを書く必要があるため、初心者の場合は手動で作ったほうが確実です。
VBAを使ってファイル名を取得して一覧表にしよう
エクセルVBAでは、フォルダ内のファイル名を自動で一覧にすることができます。
大量のファイルを確認したいときなどに便利です。
紬ちゃん監査のときに、ファイルの一覧表を提出するから助かる~!
作例では、ダイアログボックスで選んだフォルダの中にあるファイル名の一覧について、エクセルのシートに書き出すコードを紹介します。
前の章で解説したApplication.FileDialog(msoFileDialogFolderPicker)とDir関数を使います。
以下のフォルダの一覧表を取得するとどうなるか、一緒に確認しましょう。

作例ではこのフォルダ内の「2026年売上集計.xlsm」にVBAを作っていますが、フォルダの外にあるエクセルファイルでも構いません。
好きなエクセルファイルを開きAlt+F11でVBAエディタを開き、コードを記述していきましょう。

- 「挿入」タブを選択
- 「標準モジュール」を押す
- 同様に「挿入」→「プロシージャ」をクリック

- 「名前」欄にマクロ名を入力
- 「OK」ボタンをクリック

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 "一覧出力が完了しました。"コードの前半部分については前章で解説済みです。
後半部分のポイントは後ほど解説します。

- 「マクロの実行」ボタンを押す
- フォルダ選択ダイアログボックスが表示される
- ファイル一覧を表示したいフォルダをクリック
- 「OK」ボタンを押す

- 一覧表が表示されたのちにメッセージボックスが表示されることを確認
- 「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 While~Loopを使い、変数fNameに格納したファイルがなくなるまで処理を繰り返します。Cells(i, 1):A列にファイル名だけを出力Cells(i, 2):B列にフルパスを出力fName = Dir:次のファイル名を取得i = i + 1:1行下に進める
今回ご紹介したコードで行っている、以下のテクニックは定番で使うものです。
If~Exit Subのキャンセル対策- フォルダ末尾の「\」補正
i = 1のカウンタ初期設定
これらはぜひ覚えておきましょう。
ファイルの存在チェックとバックアップを一度に行う手順
この章では、Dir関数とFileCopyを使って、ファイルの存在チェックとバックアップを同時に行うマクロをご紹介します。
作例では、次の3つを自動化するマクロを作ります。
- 「2026年第3四半期.xlsx」の存在をチェック
- 存在する場合に作業日の日付つきのバックアップを作成
- ファイルが存在しない場合にエラーメッセージを表示する

マクロを記述するエクセルファイルを開いたうえでAlt+F11でVBAエディタを開き、コードを記述していきましょう。
ライクさん作例では「2026年売上集計.xlsm」にマクロを記述したよ!
存在チェックしたいファイルとは異なるファイルにマクロを記述しよう!

- 「挿入」タブを押す
- 「標準モジュール」をクリック
- 同様に「挿入」→「プロシージャ」を選択

- 「名前」欄にマクロ名を入力する
- 「OK」ボタンをクリック

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エディタはいったん最小化し、エクスプローラーを開きましょう。

- エクスプローラーに存在チェックしたいファイルを表示させて右クリック
- 「パスのコピー」を押す

VBAエディタを再び表示させ、Ctrl+Vで"ファイルの場所とファイル名"の箇所にファイルのパスをペーストします。
バックアップファイルを作る場所についても、存在チェックしたいファイルのパスを参考にパスを設定します。
ライクさん作例では、どちらのファイルも「デスクトップ>売上管理フォルダ」に設定しているよ!

- 「マクロの実行」を押す
- 処理が終わったらメッセージボックスが表示されることを確認
- 「OK」ボタンを押す

- バックアップファイルが作成されたことを確認
- バックアップファイルと存在を確認したファイルの更新日時が同じであることを確認
ライクさん更新日時が同じことから、ファイルを開かずにコピーしたことが分かるよ!
このマクロを実行して、確認したいファイルが存在しない場合は以下のメッセージボックスが表示されます。

今回のコードのポイントは次のとおりです。
- 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エディタを開き、コードを記述していきましょう。

- 「挿入」タブを押す
- 「標準モジュール」をクリック
- 同様に「挿入」→「プロシージャ」を選択する

- 「名前」欄にマクロ名を入力する
- 「OK」ボタンを押す

Public Sub マクロ名()とEnd Subの間に以下のコードをコピー&ペーストします。
Dim fPath As String
fPath = "ファイルを保存したい場所のパス\バックアップ_" & Format(Now, "yyyymmdd") & ".xlsx"
ActiveWorkbook.SaveAs Filename:=fPath, FileFormat:=xlOpenXMLWorkbook, Local:=True
MsgBox "ファイルを保存しました:" & fPath貼り付けたあとで、ファイルを保存したい場所のパスを手入力しましょう。
コードのポイントは後ほど解説します。

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

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

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

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

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

新たに出来たファイルを開き、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 SubActiveWorkbook.Saveで、いま開いているファイルを上書き保存します。
保存先やファイル名を変えたい場合は前節のSaveAsを使いましょう。
自動保存マクロをエクセルに組み込む手順
作業中にこまめに保存するのを忘れがちな方にお勧めするのが、自動保存マクロです。
Save と SaveCopyAs を組み合わせて、上書き保存とバックアップの両方を一度に実行します。
コードは以下を参考にしてください。
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"
- 10分ごと:
- 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を当てはめることで、作りたい理想のマクロが完成します。
それではコードのおさらいです。
- ファイルを開く
Open - ファイルを閉じる
Close - フォルダやファイルを選ぶ
FileDialog - フォルダやファイルの存在確認
Dir - フォルダがなければ作る
MkDir - 名前を付けて保存
SaveAs
ファイル操作は一見地味に見えますが、エクセルを扱う上で欠かせない作業です。
マクロ化もしやすいですので、ぜひ、自動化にチャレンジしてみてくださいね!
今回の基本のコードも含めて、マクロの有効化などの基礎を記事にまとめました。
エクセルの学習を基礎から行いたい方は併せてチェックしてくださいね。