【簡単エクセル/Excel VBA マクロ】フォルダ内のファイルをひとつだけ開く方法|Dir関数/FileSystemObject|ワンポイントテクニック #005



いつもありがとうございます。
ノンプログラマー向け「Excel VBA マクロ ワンポイントテクニック解説シリーズ」へようこそ!
本稿では「フォルダ内のファイルをひとつだけ開く方法」を解説します!
「え?そんな状況ある?」と思ったあなた。意外とあるんですよ、これが。
VBAでファイル操作をする際、プログラムへの「入力」としてファイルを開くことはよくあります。でも、「ファイル名を指定して開く方法」でコードを実装すると、毎回ユーザーに指定したファイル名に変更してもらう必要が出てきます。正直、かなり面倒ですよね。作り手としても、こんな作業をユーザーに強いるのは避けたいところです。動的にファイル名が決まるような場合は、最悪です。
そこで便利なのが、指定したフォルダにファイルを入れておくだけでOK! という方法です。ファイル名を気にする必要がなくなるので、ユーザーの負担はぐっと減り、操作もスッキリシンプルになります。
今回紹介するテクニックを使えば、あなたのマクロが一段と便利でプロフェッショナルな仕上がりになります!
VBAを活用して、自分やコミュニティに合ったアプリを作成し、仕事量は半分に、成果は2倍にしていきましょう! 初心者の方にも分かりやすく丁寧に解説していきますので、ぜひ最後までご覧ください!
VBAでフォルダ内のファイルを開く2つの方法
VBAでフォルダ内のファイルを開くにはどのようにすればよいのでしょうか?これには大きく分けて2つの方法があります。
1つは、VBAに組み込まれているシンプルなDir関数を使う方法。もう1つは、外部ライブラリを活用するFileSystemObjectを使う方法です。どちらの方法にも特徴があり、用途に応じて使い分けることができます。特別な事情がなければ、FileSystemObjectを使っておけば問題ありません。
Dir関数
Dir関数は、ファイルやフォルダを検索するためのVBA標準関数です。特定の条件に一致するファイル名やフォルダ名を取得できます。特別な設定は不要で、簡単な操作に適しています。
メリット
- シンプルで速い。
- 特別な設定が不要。すぐに使える。
デメリット
- サブフォルダを探せない。
- 他の情報(ファイルのサイズや作成日など)は取得しにくい。
FileSystemObject
FileSystemObject(FSO)は、VBAでファイルやフォルダを操作するためのオブジェクトです。フォルダ内のファイル一覧取得、サブフォルダ探索、ファイルのコピー・削除など、標準のDir関数では難しい操作を実現できます。利用するには、参照設定で「Microsoft Scripting Runtime」を有効にする必要があります。
メリット
- サブフォルダまで探せる。
- ファイルの詳細情報も簡単に取得できる。
デメリット
- 初めに設定が必要(少し手間)。
- 簡単な処理にはやや大げさ。
今回解説するアプリの仕様
今回解説するアプリのファイルとフォルダの構成は次の通りです。
your_folder/
├── 01_インプットするファイル/
└── インプットファイル.xlsx
└── フォルダ内のファイルをひとつだけ開く.xlsm
01_インプットするファイル
というフォルダには、操作対象となるインプットファイル.xlsx
が保存されています。そして、このフォルダと同じ場所にあるフォルダ内のファイルをひとつだけ開く.xlsm
にコードを記述します。
このコードは、指定したフォルダ(01_インプットするファイル
)の中を確認し、そこにあるファイルを1つだけ開く仕組みです。
Dir関数でフォルダ内のファイルをひとつだけ開く方法
Dir関数でフォルダ内のファイルをひとつだけ開くコードと、その実行結果を示します。
Sub OpenFileWithDir()
' 変数宣言
Dim folder_path As String ' インプットファイルのフォルダパス
Dim file_name As String ' 現在処理中のファイル名
Dim file_path As String ' 現在処理中のファイルのフルパス
Dim file_count As Long ' フォルダ内のファイル数
Dim src_wb As Workbook ' 処理対象のブックオブジェクト
' フォルダパスの設定
folder_path = ThisWorkbook.Path & "\01_インプットするファイル\"
' フォルダ内のファイル確認
file_count = 0
file_name = Dir(folder_path & "*.xlsx") ' フォルダ内のExcelファイルを取得
Do While file_name <> ""
file_count = file_count + 1 ' ファイル数をカウント
file_path = folder_path & file_name ' ファイルパスを生成
file_name = Dir() ' 次のファイルを取得
Loop
' ファイル数が1でない場合は、プロセスを終了
If file_count <> 1 Then
MsgBox "「01_インプットするファイル」フォルダには1つだけファイルを配置してください。" & vbCrLf & _
"現在のファイル数: " & file_count, vbExclamation
Exit Sub '条件を満たさない場合、これ以上処理を続けないために終了
End If
' 対象ファイルを開く
Set src_wb = Workbooks.Open(file_path)
' ここに処理したい内容を書く
End Sub
実行結果は次の通りです。インプットファイル.xlsx
が立ち上がります。


解説していきます。
' 変数宣言
Dim folder_path As String ' インプットファイルのフォルダパス
Dim file_name As String ' 現在処理中のファイル名
Dim file_path As String ' 現在処理中のファイルのフルパス
Dim file_count As Long ' フォルダ内のファイル数
Dim src_wb As Workbook ' 処理対象のブックオブジェクト
ここでは、コード内で使用する変数が宣言されています。変数は Dim 変数名 As データ型
の構文で宣言します。これにより、各変数は As
以降で指定したデータ型のデータを格納できるようになります。
なお、各データ型の意味は下表の通りです。
データ型 | 種類 | 意味 |
---|---|---|
String |
文字列型 | 文字列を扱うデータ型です。ファイルパスや名前などのテキスト情報を格納します。 |
Workbook |
オブジェクト型 | Excelのワークブック(ファイル)を表すデータ型です。操作対象のファイルを管理します。 |
Long |
数値型 | 数値を扱うデータ型です。-2,147,483,648 から 2,147,483,647 までの範囲の整数を格納できます。 |
' フォルダパスの設定
folder_path = ThisWorkbook.Path & "\01_インプットするファイル\"
ここでは、インプット用のファイルを保存しているフォルダのパスを設定しています。ThisWorkbook.Path
は、このコードを実行しているExcelファイル(自分自身)の保存場所を意味します。この保存場所に01_インプットするファイル
をつなげることで、フォルダの完全なパスを作成しています。
' フォルダ内のファイル確認
file_count = 0
file_name = Dir(folder_path & "*.xlsx") ' フォルダ内のExcelファイルを取得
Do While file_name <> ""
file_count = file_count + 1 ' ファイル数をカウント
file_path = folder_path & file_name ' ファイルパスを生成
file_name = Dir() ' 次のファイルを取得
Loop
ここでは、Dir
関数を使ってフォルダ内の .xlsx
ファイルを探索しています。まず、file_count
を0にリセットして(初期化して)、見つかったファイル名をもとにファイル数をカウントします。また、file_path
には、そのファイルのフルパスを格納します。Dir
関数を繰り返し呼び出すことで、フォルダ内のすべてのファイルを確認します。
なお、file_name = Dir
は次のファイル名を取得する処理です。フォルダ内にこれ以上ファイルがない場合、Dir
関数は空文字("")を返し、ループが終了する仕組みです。
' ファイル数が1でない場合は、プロセスを終了
If file_count <> 1 Then
MsgBox "「01_インプットするファイル」フォルダには1つだけファイルを配置してください。" & vbCrLf & _
"現在のファイル数: " & file_count, vbExclamation
Exit Sub '条件を満たさない場合、これ以上処理を続けないために終了
End If
ここでは、フォルダ内のファイルが「1」でなかった場合の処理を設定しています。具体的には、メッセージボックスに警告文を表示し、処理を終了しています。この状態になると、これ以降のコードは実行されません。
' 対象ファイルを開く
Set src_wb = Workbooks.Open(file_path)
' ここに処理したい内容を書く
ここでは、file_path
に格納されたフルパスを使用して、対象ファイルを開いています。Set
を使うことで、開いたファイルを src_wb
という変数に格納し、以降の処理でこの変数を通じてファイルを操作できるようにしています。
なお、Set
キーワードは、オブジェクト型の変数に値を代入する際に使用します。文字列や数値など、オブジェクト以外の値を代入する場合には Set
は不要です。この場合、src_wb
は Workbooks.Open
が返すワークブックオブジェクトを格納する変数であるため、Set
を使って代入しています。
その後、「ここに処理したい内容を書く」のところに、実際に行いたい処理を記述することで、開いたファイルに対する具体的な操作を追加できます。

以上でDir関数を使用した方法の解説は終了です。ありがとうございました。次のセクションで FileSystemIobject を使用した方法を解説します。
FileSystemObjectでフォルダ内のファイルをひとつだけ開く方法
FileSystemObjectでフォルダ内のファイルをひとつだけ開くコードと、その実行結果を示します。
Sub OpenFileWithFso()
' 使用ライブラリ
' - Microsoft Scripting Runtime
' 変数宣言
Dim folder_path As String ' インプットファイルのフォルダパス
Dim file_path As String ' 現在処理中のファイルのフルパス
Dim file_count As Long ' フォルダ内のファイル数
Dim src_wb As Workbook ' 処理対象のブックオブジェクト
Dim fso As FileSystemObject ' FileSystemObject
Dim Folder As Folder ' フォルダオブジェクト
Dim file As file ' ファイルオブジェクト
' FileSystemObject の初期化
Set fso = New FileSystemObject
' フォルダパスの設定
folder_path = ThisWorkbook.Path & "\01_インプットするファイル\"
Set Folder = fso.GetFolder(folder_path)
' フォルダ内のファイル確認
file_count = 0
For Each file In Folder.Files
If fso.GetExtensionName(file.Name) = "xlsx" Then
file_count = file_count + 1
file_path = file.Path ' 最後に見つかったファイルのパスを保存
End If
Next file
' ファイル数の検証
If file_count <> 1 Then
MsgBox "「01_インプットするファイル」フォルダには1つだけファイルを配置してください。" & vbCrLf & _
"現在のファイル数: " & file_count, vbExclamation
Exit Sub '条件を満たさない場合、これ以上処理を続けないために終了
End If
' 対象ファイルを開く
Set src_wb = Workbooks.Open(file_path)
' ここに処理したい内容を書く
End Sub
実行結果は次の通りです。インプットファイル.xlsx
が立ち上がります。


解説していきます。
まず、FileSystemObjectを利用するためには、Microsoft Scripting Runtime の参照設定を追加する必要があります。
「ツール」-->「参照設定」と進み、Microsoft Scripting Runtime にチェックを入れ「OK」を押下します。


このひと手間が FileSystemObject を使う際のデメリットであるともいえますが、一度設定してしまえば以降は設定の必要はありません。
' 使用ライブラリ
' - Microsoft Scripting Runtime
これはコードの一部ではありませんが、この コードを実行するために必要なライブラリをコメントとして記載しています。このMicrosoft Scripting Runtime
を使用することで、FileSystemObject
というオブジェクトを操作することができるようになります。つまり、ファイルやフォルダに関する情報を取得したり操作したりすることができるようになります。
' 変数宣言
Dim folder_path As String ' インプットファイルのフォルダパス
Dim file_path As String ' 現在処理中のファイルのフルパス
Dim file_count As Long ' フォルダ内のファイル数
Dim src_wb As Workbook ' 処理対象のブックオブジェクト
Dim fso As FileSystemObject ' FileSystemObject
Dim Folder As Folder ' フォルダオブジェクト
Dim file As file ' ファイルオブジェクト
ここでは、コード内で使用する変数が宣言されています。変数は Dim 変数名 As データ型
の構文で宣言します。これにより、各変数は As
以降で指定したデータ型のデータを格納できるようになります。
なお、各データ型の意味は下表の通りです。
データ型 | 意味 |
---|---|
String |
文字列を扱うデータ型です。フォルダパスやファイル名などのテキスト情報を格納します。 |
Long |
整数を扱うデータ型です。-2,147,483,648 から 2,147,483,647 までの範囲の値を格納できます。 |
Workbook |
Excelのワークブック(ファイル)を表すオブジェクト型です。開いたファイルを管理します。 |
FileSystemObject |
ファイルやフォルダの操作を行うオブジェクト型です。フォルダ内のファイル情報を取得したり、管理したりする際に使用します。 |
Folder |
特定のフォルダを表すオブジェクト型です。フォルダ内のファイル情報やプロパティを取得できます。 |
File |
特定のファイルを表すオブジェクト型です。ファイルのパスや名前などの詳細情報を操作できます。 |
' FileSystemObject の初期化
Set fso = New FileSystemObject
ここでは、FileSystemObject
のインスタンス(実体)を作成しています。これにより、フォルダやファイルの操作を柔軟に行えるようになります。
なお、「インスタンス」とは、プログラムで使用するために作成された「実体」を指します。ここでは、FileSystemObject
という設計図から実際に動作する道具を作り出すイメージです。この道具を使って、フォルダ内のファイル情報を取得したり、操作を行ったりできます。
' フォルダパスの設定
folder_path = ThisWorkbook.Path & "\01_インプットするファイル\"
Set Folder = fso.GetFolder(folder_path)
ここでは、インプット用ファイルが保存されているフォルダのパスを設定し、そのフォルダを操作できるようにしています。
ThisWorkbook.Path
は、このコードを実行しているExcelファイル(自分自身)の保存場所を意味します。それに "\01_インプットするファイル\"
をつなげて、インプット用フォルダの完全なパスを作成しています。
次に、fso.GetFolder(folder_path)
を使用して、そのパスに対応するフォルダオブジェクトを取得し、Folder
変数に格納しています。これにより、このフォルダ内のファイルやプロパティを操作する準備が整います。
' フォルダ内のファイル確認
file_count = 0
For Each file In Folder.Files
If fso.GetExtensionName(file.Name) = "xlsx" Then
file_count = file_count + 1
file_path = file.Path ' 最後に見つかったファイルのパスを保存
End If
Next file
ここでは、フォルダ内のファイルを1つずつ確認し、.xlsx
ファイルの数をカウントしています。
For Each file In Folder.Files
は、指定したフォルダ内のすべてのファイルを順番に処理する構文です。フォルダ内の各ファイルが file
変数に格納され、1つずつ処理されます。
拡張子の判定には fso.GetExtensionName
を使用し、条件に一致する場合にカウントを増やします。また、file_path
には、最後に見つかった .xlsx
ファイルのフルパスを保存しています。
なお、For...Each ループに関してはこちらの記事で解説しております。もしよろしければ、合わせてご覧ください。
' ファイル数の検証
If file_count <> 1 Then
MsgBox "「01_インプットするファイル」フォルダには1つだけファイルを配置してください。" & vbCrLf & _
"現在のファイル数: " & file_count, vbExclamation
Exit Sub '条件を満たさない場合、これ以上処理を続けないために終了
End If
ここでは、フォルダ内のファイルが「1」でなかった場合の処理を設定しています。具体的には、メッセージボックスに警告文を表示し、処理を終了しています。この状態になると、これ以降のコードは実行されません。
' 対象ファイルを開く
Set src_wb = Workbooks.Open(file_path)
' ここに処理したい内容を書く
ここでは、file_path
に格納されたフルパスを使用して、対象ファイルを開いています。Set
を使うことで、開いたファイルを src_wb
という変数に格納し、以降の処理でこの変数を通じてファイルを操作できるようにしています。
なお、Set
キーワードに関しては、Dir関数のセクションにて解説しております。
その後、「ここに処理したい内容を書く」のところに、実際に行いたい処理を記述することで、開いたファイルに対する具体的な操作を追加できます。

以上で、FileSystemObjectを使用した方法の解説は終了です。ありがとうございました!
おわりに


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