指定したフォルダ内のファイルをセルに表示させたい!!
そんなお悩みありませんか?
この記事では、VBAのDir関数を使ってファイル名やパスを取得する方法や、
ワイルドカードを活用して複数のファイルを扱う方法を詳しく説明します。
使用例はすべてコピペするだけで実際に使用できるようにしていますので、初心者でもすぐに実践可能です。
気になる部分だけでもぜひご覧いただければと思います。
基本的な使い方から、実際の業務で役立つ応用例まで、分かりやすく解説していきます。
この記事を読むだけで、あなたもすぐにVBAのDir関数を使いこなせるようになります!
【 この記事の概要 】
よく使う度 | |
難しさ | |
覚えておくと安心度 |
この記事を見てできるようになること
この記事を読むことで、以下のことができるようになります
Dir関数とは?
VBAのDir関数は、特定のフォルダ内にあるファイルやフォルダの名前を取得するために使われます。
指定したパス内のファイル名やフォルダ名を取得するのに非常に便利で、ワイルドカードを使用して条件に合った複数のファイルを検索することもできます。
例えば、「C:\サンプル」フォルダ内のすべてのファイル名を取得したい場合、Dir関数を使って一つ一つのファイル名を取り出し、後続の処理に使うことができます。
特定の拡張子(例えば.xlsxや.pdf)に絞って検索することも可能です。
以下に、Dir関数の基本的な構文とその使用例を紹介します。
Dir関数の構成
Dir関数は、ファイルやフォルダを検索する際に、次の2つの設定を使用します。
- pathname ⇒ 省略可能
- 検索対象のファイルまたはフォルダのパスを指定します。
ワイルドカード ( * や ? ) を使用して特定のパターンに一致するファイルを検索することができます。
- 検索対象のファイルまたはフォルダのパスを指定します。
- attributes ⇒ 省略可能
- 検索するファイルの属性を指定します。
たとえば、隠しファイルや読み取り専用ファイルなどを対象にすることができます。
属性を指定しない場合、すべての通常ファイルが対象になります。
⇒ 詳細は事項で解説します。
- 検索するファイルの属性を指定します。
より詳しい情報は、Microsoft公式 – Dir 関数を参照してみてください。
attributesの属性詳細
Dir関数で指定できるファイルの属性は以下の通りです。
これらの属性を組み合わせて、検索対象をさらに絞り込むことができます。
定数 | 値 | 説明 |
---|---|---|
vbNormal | 0 | (既定値) 属性のないファイル。 |
vbReadOnly | 1 | 属性のないファイルと読み取り専用のファイル。 |
vbHidden | 2 | 属性のないファイルと隠しファイル。 |
vbSystem | 4 | 属性のないファイルとシステムファイル。 Macintoshでは使用できません。 |
vbVolume | 8 | ボリュームラベル。他の属性を指定した場合は、vbVolumeは無視されます。 Macintoshでは使用できません。 |
vbDirectory | 16 | 属性のないファイルとディレクトリまたはフォルダー。 |
vbAlias | 64 | 指定されたファイル名はエイリアスです。 Macintoshでのみ使用できます。 |
Dir関数を使用するにあたっての注意ポイント
Dir関数を使用するうえで、注意ポイントがあります。
まず使用例を記述します。
※このコードは、指定されたフォルダ内のすべてのExcelファイル (.xlsx) の名前を取得します。
Dim filePath As String
Dim fileName As String
filePath = "C:\サンプル\"
fileName = Dir(filePath & ".xlsx", vbNormal)
- フォルダのパスを「」と記述していますが、パソコンによっては「 (バックスラッシュ)」を入力しても「\」と表示されてしまう場合があります。
その場合「\」のままで正常に動作します。 - フォルダのパスを指定する際、最後に「\」と記述するのを忘れないようにしましょう。
※
※ワイルドカードの指定側に記載するのであれば、問題ありません。 - Dir関数は、1回目の呼び出しで指定したファイル名を取得し、2回目以降は引数なしで呼び出します。
このため、複数のディレクトリ検索を同時に行うことはできません。
※詳細は、事項使用例で解説します。 - Dir関数で取得したファイルは、取得時点で存在していたものであり、その後にファイルが削除されたり追加されたりした場合は反映されません。
Dir関数の使用例
それではDir関数の使用例について解説します。
この使用例では、次のフォルダを使用して解説しますね。
使用例1: 指定したフォルダの最初のファイル名を取得する
指定したフォルダの最初のファイル名を取得するには、Dir関数のみを使用します。
Dir関数を使い、フォルダ内の全ファイルを対象に最初の1件をピックアップするシンプルな処理です。
Sub GetFirstFileName()
Dim filePath As String
Dim fileName As String
filePath = "C:\サンプル\"
fileName = Dir(filePath & "*.*")
Debug.Print fileName
End Sub
- STEP1フォルダパスを変数に格納
指定したフォルダ(例: “C:\サンプル\”)のパスを変数filePathに保存します。
- STEP2Dir関数で最初のファイル名を取得
Dir関数を使って、指定したフォルダ内の最初のファイル名を取得し、それをfileNameに格納します。
- STEP3ファイル名を出力
取得したファイル名をDebug.Printを使って出力し、イミディエイトウィンドウに表示します。
処理結果
■ Dir関数の構成解説
- pathname ⇒ filePath & “*.*”
- pathname は 「Dir関数」に渡される最初の引数で、検索対象のファイルまたはフォルダのパスを示します。
※ “*.*” はワイルドカードで、ディレクトリ内のすべてのファイルを意味します。
最初の「*」は「任意の文字列」を表し、「.*」は「任意の拡張子」を意味します。
つまり、フォルダ内の拡張子に関係なく全てのファイルを検索する指示を出しているということです。
- pathname は 「Dir関数」に渡される最初の引数で、検索対象のファイルまたはフォルダのパスを示します。
- attributes ⇒ 省略
- 今回、属性は何も指定していません。
全てのファイルを検索します。
- 今回、属性は何も指定していません。
■ コードの解説
- Sub GetFirstFileName()
- ここでは、Subステートメントを使用して新しいプロシージャ(サブルーチン)を定義しています。
このプロシージャの名前は GetFirstFileName です。
- ここでは、Subステートメントを使用して新しいプロシージャ(サブルーチン)を定義しています。
- Dim filePath As String
- この行では、新しい変数「filePath」を宣言しています。
「filePath」 は「文字列型(String)」の変数として宣言されています。
この変数は、後の行でファイルパス(フォルダの場所)を格納するために使われます。
- この行では、新しい変数「filePath」を宣言しています。
- Dim fileName As String
- この行では、もう一つの変数「fileName」を文字列型(String)として宣言しています。
この変数は、Dir関数で取得したファイル名を格納するために使用されます。
- この行では、もう一つの変数「fileName」を文字列型(String)として宣言しています。
- filePath = “C:\サンプル\”
- ここでは、変数「filePath」にフォルダのパスが代入されています。
この例では、”C:\サンプル\” というフォルダが指定されています。
このパスは、Dir関数で検索対象とするフォルダを示しています。
Windowsのファイルシステムでは、ディレクトリの区切りには「\(バックスラッシュ)」を使用します。
- ここでは、変数「filePath」にフォルダのパスが代入されています。
- fileName = Dir(filePath & “*.*”)
- ここでは、Dir関数を使用して指定したフォルダ内の最初のファイル名を取得しています。
「
filePath & “*.*”」という表記により、変数「filePath」の値( “C:\サンプル\” )にワイルドカード「”*.*”」が追加されます。
ワイルドカード 「”*.*”」は、フォルダ内のすべてのファイルを意味し、拡張子にかかわらずフォルダ内の全ファイルを検索対象にします。
例えば、”C:\サンプル\” フォルダ内に、”サンプル1.xlsx” というファイルが最初にあれば、この最初にあるファイル名が取得され、変数「fileName」に代入されます。
- ここでは、Dir関数を使用して指定したフォルダ内の最初のファイル名を取得しています。
このコードを実行すると、指定されたフォルダ内の最初のファイル名を取得し、Debug.Printで表示することができます。
使用例2: フォルダ内のすべてのファイル名を取得する(隠しファイル等は除く)
フォルダ内のすべてのファイル名を取得するには、Dir関数をDo Whileループと組み合わせます。
隠しファイルや読み取り専用ファイルは対象外です。
Dir関数とDo Whileループを組み合わせることで、フォルダ内の複数のファイルを処理しています。
Sub GetAllFiles()
Dim filePath As String
Dim fileName As String
filePath = "C:\サンプル\"
fileName = Dir(filePath & "*.*")
Do While fileName <> ""
Debug.Print fileName
fileName = Dir()
Loop
End Sub
- STEP1フォルダパスを変数に格納
指定したフォルダ(例: “C:\サンプル\”)のパスを変数filePathに保存します。
- STEP2Dir関数で最初のファイル名を取得
Dir関数を使って、指定したフォルダ内の最初のファイル名を取得し、それをfileNameに格納します。
- STEP3ループ処理でファイル名を順次取得
Do Whileループを使用して、フォルダ内のすべてのファイルを1つずつ取得し、Debug.Printで表示します。
ファイル名が空になるまで繰り返し実行されます。 - STEP4次のファイル名を取得
ループ内でDir関数を再度呼び出し、次のファイル名を取得して処理を続けます。
処理結果
このコードで使用している機能
詳細解説
■ Dir関数の構成解説
- pathname ⇒ filePath & “*.*”
- ファイルパス「C:\サンプル\*.*」のファイルを検索しています。
※「*」はワイルドカードといい、どんな文字でも構わないという意味です。
- ファイルパス「C:\サンプル\*.*」のファイルを検索しています。
- attributes ⇒ 省略
- 今回、属性は何も指定していません。
全てのファイルを検索します。
- 今回、属性は何も指定していません。
■ コードの解説
- Sub GetAllFiles()
- この行では、新しいサブルーチン GetAllFiles が定義されています。
Subステートメントは「Subroutine(サブルーチン)」を意味し、一連の処理をまとめたブロックを作成します。
- この行では、新しいサブルーチン GetAllFiles が定義されています。
- Dim filePath As String
- ここでは、「filePath」という文字列型(String)の変数を宣言しています。
- Dim fileName As String
- この行では、「fileName」という文字列型(String)の変数を宣言しています。
- filePath = “C:\サンプル\”
- こでは、変数「filePath」にフォルダのパス(”C:\サンプル\”)が代入されています。
このパスはWindowsのディレクトリ構造に基づいて指定されており、検索対象となるフォルダを指定します。
- こでは、変数「filePath」にフォルダのパス(”C:\サンプル\”)が代入されています。
- fileName = Dir(filePath & “*.*”)
- Dir関数を使用して、変数「filePath」に指定されたフォルダ内の最初のファイル名を取得し、変数「fileName」に格納します。
「filePath & “*.*”」の部分は、変数「filePath」に格納されたパス(例: “C:\サンプル\”)とワイルドカード「 “*.*”」 を連結したものです。
ワイルドカード「”*.*”」は、フォルダ内のすべてのファイルを検索するために使用されます。
「*」 は任意の文字列を意味し、「. *」は任意の拡張子を意味します。
この行の実行によって、指定されたフォルダ内で最初に見つかったファイルの名前が変数「fileName」 に代入されます。
たとえば、フォルダ内に「サンプル1.xlsx」というファイルがあれば、それが変数「fileName」に格納されます。
- Dir関数を使用して、変数「filePath」に指定されたフォルダ内の最初のファイル名を取得し、変数「fileName」に格納します。
- Do While fileName <> “”
- ここでは、Do Whileループが開始されます。
このループは、変数「fileName」が空(””)でない限り繰り返されます。
言い換えれば、変数「fileName」にファイル名が格納されている限りループが続きます。
初回の「Dir関数」で最初のファイル名が取得され、以降のファイル名が順次取得されていく間、このループが実行され続けます。
フォルダ内のすべてのファイルが処理され、Dir関数が空の文字列を返した時点でループは終了します。
- ここでは、Do Whileループが開始されます。
- Debug.Print fileName
- Debug.Printは、VBAのイミディエイトウィンドウにデータを出力するためのコマンドです。
通常、デバッグ目的で使用されます。
変数「fileName」に格納されているファイル名をイミディエイトウィンドウに表示します。
- Debug.Printは、VBAのイミディエイトウィンドウにデータを出力するためのコマンドです。
- fileName = Dir()
- ここで再び
「
Dir関数」が呼び出されています。
2回目以降の「Dir関数」の呼び出しでは引数を省略します。
これにより、前回の Dir 呼び出しと同じフォルダ内で次のファイル名を取得することができます。
たとえば、前回の「
Dir関数」で「サンプル1.xlsx」が取得された場合、次の呼び出しで「サンプル2.xlsx」など別のファイル名が取得され、再び変数「fileName」に格納されます。
このプロセスがフォルダ内のすべてのファイルが取得されるまで繰り返されます。
- ここで再び
- Loop
- この行は、Do Whileループの終わりを示します。
ループの最後に到達すると、再び Do While の条件に戻り、変数「fileName」 が空でない限りループが継続されます。
ループの中では、ファイル名を出力し、次のファイル名を取得する処理が繰り返されます。
すべてのファイル名が処理されると、「Dir関数」が空文字列を返し、ループが終了します。
- この行は、Do Whileループの終わりを示します。
- End Sub
- ここで、Subステートメントで始まったサブルーチンが終了します。
このループは、フォルダ内のすべてのファイル名を取得し、Debug.Printで出力することができます。
※「サンプル3.xlsx」は、隠しファイルであるため取得できません。
使用例3: フォルダ内のすべてのファイル名を取得する(隠しファイル等も含む)
隠しファイルや読み取り専用ファイルなど、特定の属性を持つファイルを含むすべてのファイルを取得するには、Dir関数の属性を指定を行います。
Sub GetFilesWithAttributes()
Dim filePath As String
Dim fileName As String
filePath = "C:\サンプル\"
fileName = Dir(filePath & "*.*", vbHidden Or vbReadOnly)
Do While fileName <> ""
Debug.Print fileName
fileName = Dir()
Loop
End Sub
- STEP1フォルダパスを変数に格納
指定したフォルダ(例: “C:\サンプル\”)のパスを変数filePathに保存します。
- STEP2Dir関数で最初のファイル名を取得
Dir関数を使って、隠しファイルや読み取り専用ファイルも含めたフォルダ内の最初のファイル名を取得し、変数fileNameに格納します。
- STEP3ループ処理でファイル名を順次取得
Do Whileループを使用して、フォルダ内のすべてのファイルを1つずつ取得し、Debug.Printで表示します。
ファイル名が空になるまで繰り返し実行されます。 - STEP4次のファイル名を取得
ループ内で再度Dir関数を呼び出し、次のファイル名を取得して処理を続けます。
隠しファイルや読み取り専用ファイルも含めてすべて取得されるまで、このプロセスを繰り返します。
処理結果
このコードで使用している機能
詳細解説
■ Dir関数の構成解説
- pathname ⇒ filePath & “*.*”
- ファイルパス「C:\サンプル\*.*」のファイルを検索しています。
※「*」はワイルドカードといい、どんな文字でも構わないという意味です。
- ファイルパス「C:\サンプル\*.*」のファイルを検索しています。
- attributes ⇒ vbHidden Or vbReadOnly
- vbHidden「属性のないファイルと隠しファイル」
vbReadOnly「属性のないファイルと読み取り専用のファイル」
この2つを含む、全てのファイルを検索します。
また、複数指定したい場合は「Or」を使用することもできます。
⇒ もう一度、属性について確認したい方は、こちらを参照
- vbHidden「属性のないファイルと隠しファイル」
■ コードの解説
- Sub GetFilesWithAttributes()
- ここでは、GetFilesWithAttributes というサブルーチンが定義されています。
Sub ステートメントを使用して、一連の操作をまとめた処理を記述します。
- ここでは、GetFilesWithAttributes というサブルーチンが定義されています。
- Dim filePath As String
- この行では、「filePath」という文字列型(String)の変数が宣言されています。
- Dim fileName As String
- ここでは、変数「fileName」という文字列型(String)の変数が宣言されています。
変数「fileName」は、Dir関数を使用して取得したファイル名を一時的に格納します。
ファイル名は順次この変数に格納され、ループの中で処理されます。
- ここでは、変数「fileName」という文字列型(String)の変数が宣言されています。
- filePath = “C:\サンプル\”
- この行では、変数「filePath」に「C:\サンプル\」という具体的なフォルダのパスが代入されています。
Windowsのファイルシステムの「Cドライブ」にある「サンプル」フォルダを指しています。
- この行では、変数「filePath」に「C:\サンプル\」という具体的なフォルダのパスが代入されています。
- fileName = Dir(filePath & “*.*”, vbHidden Or vbReadOnly)
- この行では、「Dir関数」を使用して、変数「filePath」 で指定されたフォルダ内のファイルを検索します。
ここで検索されるファイルは、特定の属性を持つファイル(隠しファイルや読み取り専用ファイル)です。
「filePath & “*.*”」これは、変数「filePath」 (例:”C:\サンプル\”)とワイルドカード「”*.*”」を連結した文字列です。
「”*.*”」は、フォルダ内のすべてのファイルを検索対象にするワイルドカードです。
つまり、フォルダ内のすべてのファイルが検索の対象になります。
「vbHidden Or vbReadOnly」ここで指定しているのは、検索するファイルの属性です。
vbHidden は「隠しファイル」を意味し、vbReadOnly は「読み取り専用ファイル」を意味します。
Or 演算子を使ってこれらを組み合わせることで、隠しファイルまたは読み取り専用ファイル(またはその両方)のいずれかに該当するファイルを検索対象にします。
この行の実行により、指定された属性に一致する最初のファイル名が、変数「fileName」に格納されます。
- この行では、「Dir関数」を使用して、変数「filePath」 で指定されたフォルダ内のファイルを検索します。
- Do While fileName <> “”
- ここでは Do Whileループが開始されます。
このループは、変数「fileName」にファイル名が格納されている限り繰り返されます。
もし、変数「fileName」が空白(””)の場合、ループは終了します。
初回のDir関数で取得された最初のファイル名が変数「fileName」に格納され、次に他のファイル名が順次取得されていきます。
このループは、フォルダ内のすべてのファイルが取得されるまで続きます。
- ここでは Do Whileループが開始されます。
- Debug.Print fileName
- この行では、変数「fileName」に格納されたファイル名をデバッグウィンドウに出力しています。
Debug.Print は、VBAのデバッグ機能であり、コードの実行中に変数の値を確認したり、出力を記録するために使用します。
- この行では、変数「fileName」に格納されたファイル名をデバッグウィンドウに出力しています。
- fileName = Dir()
- Dir関数が再び呼び出されています。
2回目以降の呼び出しでは引数を省略し、前回の検索結果に続く次のファイル名を取得します。
変数「fileName」に次のファイル名が格納されます。
これにより、ループ内で次々にファイル名が取得されて処理されていきます。
フォルダ内のすべての隠しファイルや読み取り専用ファイルが取得されるまで、この処理が繰り返されます。
- Dir関数が再び呼び出されています。
- Loop
- この行は Do While ループの終わりを示します。
ループがここに到達すると、再び Do While の条件に戻り、fileName が空白でない限りループを続けます。
すべてのファイルが処理されると、「Dir関数」が空の文字列を返し、ループが終了します。
- この行は Do While ループの終わりを示します。
- End Sub
- ここで、Subステートメントで始まったサブルーチンが終了します。
このループは、フォルダ内のすべてのファイル名を取得し、Debug.Printで出力することができます。
※隠しファイルである「サンプル3.xlsx」も、取得することができました。
使用例4: 拡張子を指定しファイルを取得する
特定のファイル(例えば、拡張子「.xlsx」のみ)を検索するには、Dir関数で拡張子を指定します。
Sub GetExcelFiles()
Dim filePath As String
Dim fileName As String
filePath = "C:\サンプル\"
fileName = Dir(filePath & "*.xlsx")
Do While fileName <> ""
Debug.Print fileName
fileName = Dir()
Loop
End Sub
- STEP1フォルダパスを変数に格納
指定したフォルダ(例: “C:\サンプル\”)のパスを変数filePathに保存します。
- STEP2Dir関数で最初のファイル名を取得
Dir関数を使って、フォルダ内の最初のExcelファイル(拡張子.xlsx)の名前を取得し、それを変数fileNameに格納します。
- STEP3ループ処理でExcelファイル名を順次取得
Do Whileループを使用して、フォルダ内のすべてのExcelファイル名を1つずつ取得し、Debug.Printで表示します。
ファイル名が空になるまで繰り返し実行されます。 - STEP4次のExcelファイル名を取得
ループ内で再度Dir関数を呼び出し、次のExcelファイル名を取得して処理を続けます。
フォルダ内のすべてのExcelファイルが取得されるまで、このプロセスを繰り返します。
処理結果
このコードで使用している機能
詳細解説
■ Dir関数の構成解説
- pathname ⇒ filePath & “*.xlsx“
- ファイルパス「C:\サンプル\*.xlsx」のファイルを検索しています。
※「*」はワイルドカードといい、どんな文字でも構わないという意味です。
- ファイルパス「C:\サンプル\*.xlsx」のファイルを検索しています。
- attributes ⇒ 省略
- 今回、属性は何も指定していません。
全てのファイルを検索します。
- 今回、属性は何も指定していません。
■ コードの解説
- Sub GetExcelFiles()
- この行では、新しいサブルーチン GetExcelFiles が定義されています。
- Dim filePath As String
- この行では、「filePath」という文字列型(String)の変数を宣言しています。
- Dim fileName As String
- この行では、「fileName」という文字列型(String)の変数を宣言しています。
- filePath = “C:\サンプル\“
- この行では、変数「filePath」に 「C:\サンプル\」というフォルダパスが代入されています。
このフォルダがDir 関数によって検索される対象となります。
- この行では、変数「filePath」に 「C:\サンプル\」というフォルダパスが代入されています。
- fileName = Dir(filePath & “*.xlsx”)
- この行では、Dir 関数を使用して指定されたフォルダ内の最初のExcelファイル(拡張子が .xlsx)を検索し、そのファイル名を変数「fileName」に格納します。
「filePath & “*.xlsx”」ここでは、変数「filePath」に格納されたフォルダパス(例: “C:\サンプル\”)に 「*.xlsx」というワイルドカードを追加しています。
このワイルドカード 「*.xlsx」は、Excelファイル(拡張子が .xlsx)を意味します。
この指定により、フォルダ内の .xlsx 拡張子を持つファイルのみが検索されます。
例えば、フォルダ内に “サンプル1.xlsx” というファイルが存在していれば、それが最初に検索され、変数「fileName」に格納されます。
- この行では、Dir 関数を使用して指定されたフォルダ内の最初のExcelファイル(拡張子が .xlsx)を検索し、そのファイル名を変数「fileName」に格納します。
- Do While fileName <> “”
- ここでは、Do While ループが定義されています。
fileName 変数にファイル名が格納されている間、このループが繰り返し実行されます。
もし、変数「fileName」が空白(””)の場合、ループは終了します。
初回の Dir 関数で取得された最初のExcelファイル名が変数「fileName」に格納されており、このループ内で次々にファイル名が処理されます。
- ここでは、Do While ループが定義されています。
- Debug.Print fileName
- 変数「fileName」に格納されているExcelファイル名をデバッグウィンドウに出力します。
Debug.Print は、デバッグ目的で使用されるコマンドで、イミディエイトウィンドウに出力が表示されます。
- 変数「fileName」に格納されているExcelファイル名をデバッグウィンドウに出力します。
- fileName = Dir()
- この行で再び Dir 関数が呼び出されます。
2回目以降の Dir 関数の呼び出しでは、引数なしで前回の検索結果に続く次のExcelファイル名を取得します。
これにより、変数「fileName」に次のExcelファイル名が格納されます。
フォルダ内のすべてのExcelファイルが処理されるまでこの処理が繰り返されます。
- この行で再び Dir 関数が呼び出されます。
- Loop
- この行は、Do While ループの終わりを示します。
ループがここに到達すると、再び Do While の条件に戻り、fileName が空白でない限りループが継続します。
フォルダ内のすべての「.xlsx」ファイルが処理されるまで、Dir 関数が繰り返し呼び出されます。
すべてのファイルが処理されると、ループは終了します。
- この行は、Do While ループの終わりを示します。
このコードは、指定されたフォルダ内のすべてのExcelファイル(.xlsx)を検索し、その名前を出力します。
使用例5: フォルダ内のすべてのファイルを開く
フォルダ内のすべてのExcelファイルを検索し、それらを一つずつ開くには、Workbooks.Openメソッドを使用します。
Sub OpenMultipleExcelFiles()
Dim filePath As String
Dim fileName As String
filePath = "C:\サンプル\"
fileName = Dir(filePath & "*.*")
Do While fileName <> ""
Workbooks.Open filePath & fileName
fileName = Dir()
Loop
End Sub
- STEP1フォルダパスを変数に格納
指定したフォルダ(例: “C:\サンプル\”)のパスを変数filePathに保存します。
- STEP2Dir関数で最初のファイル名を取得
Dir関数を使って、フォルダ内の最初のファイル名を取得し、それを変数fileNameに格納します。
- STEP3ループ処理でファイルを順次開く
Do Whileループを使用して、フォルダ内のすべてのファイルを順次開きます。
ファイル名が空になるまで繰り返し実行され、すべてのファイルが開かれます。 - STEP4次のファイル名を取得
ループ内で再度Dir関数を呼び出し、次のファイル名を取得して処理を続けます。
すべてのファイルが処理されるまで、このプロセスを繰り返します。
このコードで使用している機能
詳細解説
■ Dir関数の構成解説
- pathname ⇒ filePath & “*.*”
- ファイルパス「C:\サンプル\*.*」のファイルを検索しています。
※「*」はワイルドカードといい、どんな文字でも構わないという意味です。
- ファイルパス「C:\サンプル\*.*」のファイルを検索しています。
- attributes ⇒ 省略
- 今回、属性は何も指定していません。
全てのファイルを検索します。
- 今回、属性は何も指定していません。
■ コードの解説
- Sub OpenMultipleExcelFiles()
- この行では、OpenMultipleExcelFiles というサブルーチンが定義されています。
このサブルーチンの目的は、指定されたフォルダ内にあるすべてのExcelファイルを順番に開くことです。
- この行では、OpenMultipleExcelFiles というサブルーチンが定義されています。
- Dim filePath As String
- この行では、「filePath」という文字列型(String)の変数を宣言しています。
- Dim fileName As String
- この行では、「fileName」という文字列型(String)の変数が宣言されています。
- filePath = “C:\サンプル\”
- この行では、変数「filePath」に 「C:\サンプル\」という具体的なフォルダのパスが代入されています。
このフォルダが検索対象となり、フォルダ内のExcelファイルが次に説明する Dir 関数で検索されます。
- この行では、変数「filePath」に 「C:\サンプル\」という具体的なフォルダのパスが代入されています。
- fileName = Dir(filePath & “*.*”)
- 「Dir 関数」を使用して、指定されたフォルダ内の最初のファイル名を取得し、変数「fileName」に格納します。
「filePath & “*.*”」は、変数「filePath」に格納されたフォルダパス(例:”C:\サンプル\”)にワイルドカード “*.*” を追加しています。
“*.*” は、フォルダ内のすべてのファイルを検索対象にするワイルドカードで、拡張子に関係なくすべてのファイルを取得します。
この行の実行によって、フォルダ内の最初のファイル名(例:”サンプル1.xlsx”)が、変数「fileName」に格納されます。
- 「Dir 関数」を使用して、指定されたフォルダ内の最初のファイル名を取得し、変数「fileName」に格納します。
- Do While fileName <> “”
- ここでは、Do While ループが開始されます。
変数「fileName」にファイル名が格納されている間、つまりファイルが存在する限りこのループは繰り返し実行されます。
fileName が空白(””)になると、すべてのファイルが処理されたことを意味し、ループは終了します。
- ここでは、Do While ループが開始されます。
- Workbooks.Open filePath & fileName
- この行では、「Workbooks.Open() メソッド」を使用して、Excelファイルを開いています。
「filePath & fileName」 ここでは、変数「filePath」に格納されたフォルダのパスと、fileName に格納されたファイル名を結合して、完全なファイルパスを指定しています。
例えば、filePath が「C:\サンプル\」で、変数「fileName」が 「サンプル1.xlsx」であれば、この行は 「C:\サンプル\サンプル1.xlsx」という完全なパスを作成し、そのファイルを開きます。
※「Workbooks.Open() メソッド」については、別記事で解説を行っています。
解説の最後にリンクを記載しておきますので、気になる方は合わせてご覧ください。
- この行では、「Workbooks.Open() メソッド」を使用して、Excelファイルを開いています。
- fileName = Dir()
- 「Dir関数」を再び呼び出して、次のファイル名を取得しています。
2回目以降の Dir 関数の呼び出しでは、引数を省略することで、前回の検索結果に続く次のファイルを取得します。
この行の実行により、次のファイル名が、変数「fileName」に格納され、ループ内で処理が続行されます。
フォルダ内のすべてのファイルが処理されるまで、このプロセスが繰り返されます。
- 「Dir関数」を再び呼び出して、次のファイル名を取得しています。
- Loop
- ここで、Do While ループが終了します。
ループの最後に到達すると、再び Do While の条件に戻り、fileName が空白でない限りループを継続します。
すべてのファイルが処理されるまで、ループは繰り返されます。
すべてのファイルが処理されると、Dir 関数は空白を返し、ループが終了します。
- ここで、Do While ループが終了します。
- End Sub
- この行で、Sub ステートメントで始まったサブルーチンが終了します。
Workbooks.Openメソッドについては、別記事で解説を行っています。
合わせてご覧ください。
このコードは、指定されたフォルダ内のすべてのExcelファイルを順次開きます。
使用例6: フォルダ内のすべてのファイル名を取得しセルに記載する(ハイパーリンクも設定)
取得したファイル名を、セルに転記することもできます。
さらに、ハイパーリンクも合わせて設定します。
これにより、クリックするとファイルを開くことができます。
Sub ListFilesWithHyperlinks()
Dim Ws As Worksheet
Dim filePath As String
Dim fileName As String
Dim i As Long
filePath = "C:\サンプル\"
Set Ws = ThisWorkbook.Sheets(1) '// 結果を表示するシート
i = 1 '//行番号を初期化
fileName = Dir(filePath & "*.*", vbHidden Or vbReadOnly)
Do While fileName <> ""
'// ハイパーリンクの設定
Ws.Hyperlinks.Add _
Anchor:=Ws.Cells(i, 1), _
Address:=filePath & fileName, _
TextToDisplay:=fileName
i = i + 1
fileName = Dir()
Loop
End Sub
- STEP1フォルダパスを変数に格納
指定したフォルダ(例: “C:\サンプル\”)のパスを変数filePathに保存します。
- STEP2Dir関数で最初のファイル名を取得
Dir関数を使用して、フォルダ内の最初のファイル名(隠しファイルや読み取り専用ファイルも含む)を取得し、変数fileNameに格納します。
- STEP3ループ処理でファイル名を順次セルに記載し、ハイパーリンクを設定
Do Whileループを使い、すべてのファイル名を1つずつ取得し、それをExcelシートのセルに表示するとともに、そのファイルにリンクするハイパーリンクを設定します。
- STEP4次のファイル名を取得し、繰り返す
ループ内で再びDir関数を呼び出し、次のファイル名を取得して処理を続けます。
フォルダ内のすべてのファイルが処理されるまで、このプロセスが繰り返されます。
処理結果
このコードで使用している機能
解説
■ Dir関数の構成解説
- pathname ⇒ filePath & “*.*”
- ファイルパス「C:\サンプル\*.*」のファイルを検索しています。
※「*」はワイルドカードといい、どんな文字でも構わないという意味です。
- ファイルパス「C:\サンプル\*.*」のファイルを検索しています。
- attributes ⇒ vbHidden Or vbReadOnly
- vbHidden「属性のないファイルと隠しファイル」
vbReadOnly「属性のないファイルと読み取り専用のファイル」
この2つを含む、全てのファイルを検索します。
また、複数指定したい場合は「Or」を使用することもできます。
⇒ もう一度、属性について確認したい方は、こちらを参照
- vbHidden「属性のないファイルと隠しファイル」
■ コードの解説
- Sub ListFilesWithHyperlinks()
- この行では、ListFilesWithHyperlinks というサブルーチンが定義されています。
Sub ステートメントはVBAのサブルーチン(複数のコード行をまとめて処理する)を定義するために使用されます。
- この行では、ListFilesWithHyperlinks というサブルーチンが定義されています。
- Dim Ws As Worksheet:
- 「Ws」は Worksheet 型のオブジェクト変数として宣言されています。
Worksheet はExcelのシートオブジェクトを表し、この変数に操作対象のシートを代入することで、指定されたシート上で処理を行うことができます。
- 「Ws」は Worksheet 型のオブジェクト変数として宣言されています。
- Dim filePath As String:
- 「filePath」は文字列型(String)の変数で、フォルダのパスを格納します。
- Dim fileName As String:
- 「fileName」は文字列型(String)の変数で、「Dir関数」で取得したファイル名を格納します。
- Dim i As Long:
- 「i」は長整数型(Long)の変数で、シート上の行番号を保持します。
結果のファイル名とハイパーリンクを表示する行を決定するために使用されます。
長整数型は大きな数値でも扱えるため、行番号が大きくなっても対応可能です。
- 「i」は長整数型(Long)の変数で、シート上の行番号を保持します。
- filePath = “C:\サンプル\”
- 変数「filePath」にフォルダパス「C:\サンプル\」が代入されています。
このパスは、「Dir関数」が検索するフォルダを示しています。
ファイルを検索する対象のディレクトリです。
- 変数「filePath」にフォルダパス「C:\サンプル\」が代入されています。
- Set Ws = ThisWorkbook.Sheets(1)
- オブジェクト変数「Ws」に現在のワークブック(ThisWorkbook)の最初のシート(Sheets(1))がセットされています。
「Setステートメント」はオブジェクト型変数に値を代入するために使用されます。
このシートにファイル名とハイパーリンクが表示されます。
- オブジェクト変数「Ws」に現在のワークブック(ThisWorkbook)の最初のシート(Sheets(1))がセットされています。
- i = 1
- 「i」に「1」を代入し、シート上の表示を開始する行番号を初期化しています。
ファイル名とハイパーリンクを1行目から表示し始めます。
- 「i」に「1」を代入し、シート上の表示を開始する行番号を初期化しています。
- fileName = Dir(filePath & “*.*”, vbHidden Or vbReadOnly)
- 「Dir関数」を使用して、変数「filePath」で指定されたフォルダ内の最初のファイル名を取得し、変数「fileName」に格納します。
“*.*” はワイルドカードで、拡張子に関わらずすべてのファイルを検索対象とします。
「vbHidden Or vbReadOnly」 により、隠しファイルや読み取り専用ファイルも検索対象に含まれます。
- 「Dir関数」を使用して、変数「filePath」で指定されたフォルダ内の最初のファイル名を取得し、変数「fileName」に格納します。
- Do While fileName <> “”
- Do While ループの開始です。
変数「fileName」が空でない限り(つまり、フォルダにファイルが存在する限り)、ループが実行されます。
フォルダ内のすべてのファイルが処理されるまでループが続きます。
- Do While ループの開始です。
- Ws.Hyperlinks.Add
Anchor:=Ws.Cells(i, 1), _
Address:=filePath & fileName, _
TextToDisplay:=fileName- ハイパーリンクの設定です。
- Ws.Hyperlinks.Add:
- オブジェクト変数「Ws」にセットされたシートに対してハイパーリンクを追加します。
- Anchor:=Ws.Cells(i, 1):
- Anchor は、ハイパーリンクを挿入するセルを指定します。
ここでは i 行目の1列目のセル(Ws.Cells(i, 1))が指定されています。
- Anchor は、ハイパーリンクを挿入するセルを指定します。
- Address:=filePath & fileName:
- Address にはリンク先のアドレスを指定します。
変数「filePath」と変数「fileName」を結合しフルパスとすることで、クリックするとそのファイルが開くリンクが設定されます。
- Address にはリンク先のアドレスを指定します。
- TextToDisplay:=fileName:
- TextToDisplay にはセルに表示されるリンクテキストを指定します。
ここではファイル名をリンクテキストとして表示します。
- TextToDisplay にはセルに表示されるリンクテキストを指定します。
- Ws.Hyperlinks.Add:
- ハイパーリンクの設定です。
- i = i + 1
- 「i」の値を「1」増加させます。
これにより、次のファイル名とハイパーリンクがシートの次の行に表示されます。
行を下にずらして表示するための処理です。
- 「i」の値を「1」増加させます。
- fileName = Dir()
- 「Dir関数」を再度呼び出し、次のファイル名を取得します。
2回目以降の Dir 関数の呼び出しでは、引数を省略することで前回の検索結果に続くファイルを取得できます。
このプロセスを繰り返し、フォルダ内のすべてのファイルを処理します。
- 「Dir関数」を再度呼び出し、次のファイル名を取得します。
- Loop
- ここで Do While ループが終了します。
ループはフォルダ内のすべてのファイルが処理されるまで繰り返されます。
すべてのファイルが処理されると、変数「fileName」が空になりループが終了します。
- ここで Do While ループが終了します。
- End Sub
- サブルーチンの終了を意味します。
このコードは、指定されたフォルダ内のすべてのExcelファイルを取得し、そのファイル名をセルにハイパーリンクとして設定します。
ユーザーはハイパーリンクをクリックすることで、直接ファイルを開くことができます。
他の関数や方法との比較
ファイル名やパスの取得に特化した他の方法
- FileSystemObject
- VBAのFileSystemObjectを使うと、Dir関数以上に高度なファイル操作が可能です。
例えば、ファイルの作成日やサイズを取得する場合に便利です。
- VBAのFileSystemObjectを使うと、Dir関数以上に高度なファイル操作が可能です。
- Shellオブジェクト
- Shellオブジェクトを使うことで、システムの特定の機能を操作したり、ファイルを開いたりすることができます。
まとめ
この記事では、VBAのDir関数を使って、フォルダ内のファイルを効率的に操作する方法について学びました。
Dir関数を活用することで、ファイル名の取得や自動化が可能になり、業務効率化に役立てることができます。
ポイントのおさらい
さらに学ぶために
Dir関数の使い方に慣れてきたら、VBAのFileSystemObjectやShellオブジェクトを活用して、さらに高度なファイル操作に挑戦してみましょう。
それぞれが持つ特定の用途と利点を理解することで、VBAの操作がさらに効率的になります。