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

アフィリエイト広告を利用しています。
QRコード
【QRコード】PC<-->スマホの切り替えにご利用ください
アイキャッチ画像
運営者・ポテ

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

ノンプログラマー向け「Excel VBA マクロ ワンポイントテクニック解説シリーズ」へようこそ!

本稿では「フォルダ内のファイルをひとつだけ開く方法」を解説します!

Information
  • ノンプログラマー
    プログラミングを専門にしていない人たちのことです。
  • VBAとマクロの違い
    VBAは、Visusal Basic for Application の略で、プログラミング言語のことです。マクロは、VBAを使って作成される「機能」のことです。

「え?そんな状況ある?」と思ったあなた。意外とあるんですよ、これが。

VBAでファイル操作をする際、プログラムへの「入力」としてファイルを開くことはよくあります。でも、「ファイル名を指定して開く方法」でコードを実装すると、毎回ユーザーに指定したファイル名に変更してもらう必要が出てきます。正直、かなり面倒ですよね。作り手としても、こんな作業をユーザーに強いるのは避けたいところです。動的にファイル名が決まるような場合は、最悪です。

Information

動的
状況や条件に応じて自動的に変化・対応することです。

そこで便利なのが、指定したフォルダにファイルを入れておくだけで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 以降で指定したデータ型のデータを格納できるようになります。

Information

変数
「値」や「オブジェクト」を入れておくための「箱」のようなものです。その名の通り、プログラムの中で状況に応じて保持する内容(値やオブジェクト)を変えることができます。例えば、数値や文字列といった値や、Excelのセル、シート、ワークブックといったオブジェクトなど、さまざまなデータを格納するために使われます。

なお、各データ型の意味は下表の通りです。

データ型 種類 意味
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_wbWorkbooks.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を題材としていますが、プログラミングの基本的な知識や思考法、仕事の進め方まで幅広く学べます。


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

QRコード
【QRコード】PC<-->スマホの切り替えにご利用ください

コメントを残す

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