エクセル ダイアログボックスからフォルダ選択してフォルダ内のファイル全てを取得(Excel VBA)

【本日のミッション】

Excel ダイアログボックスからフォルダを選択し、フォルダ内全てのファイルを取得せよ。

ミッションの概要

エクセル ダイアログボックスからフォルダを選択し、フォルダ内全てのファイルを取得せよ、というのが今回のミッションです。

フォルダ選択のためのダイアログボックスを表示させ、選択したフォルダ内のファイルを順に開いて閉じる・・・という処理にチャレンジします。

エクセル ダイアログボックスからフォルダ選択してフォルダ内のファイル全てを取得(Excel VBA)

エクセル ダイアログボックスからフォルダ選択してフォルダ内のファイル全てを取得(Excel VBA)

プロシージャ

Sub ダイアログボックスからフォルダ選択してファイルを開く()

    '【変数】
    Dim pt As Variant       'フォルダパス
    Dim fn As Variant       '取込ファイル名

    '■画面更新STOP
    Application.ScreenUpdating = False

    '■フォルダの選択
    With Application.FileDialog(msoFileDialogFolderPicker)
    
        .InitialFileName = "C:\"    '初期表示パス
        .AllowMultiSelect = False   '複数選択不可
        .Title = "フォルダの選択"    'ダイアログボックスタイトル
    
        If .Show = 0 Then
            Exit Sub                'フォルダ選択されなかった場合は終了
        End If
        
        'フォルダパスを変数ptにセット
        pt = .SelectedItems(1)
    End With
  
    '■変数fnに1個目のファイル名を格納
    fn = Dir(pt & "\*.*")
    
    '■フォルダ内のファイルを順に開く
    Do While fn <> ""               '変数fnが空欄になるまでDo While内の処理を続ける
    
        Workbooks.Open Filename:=pt & "\" & fn
        
        '■ファイルを閉じる
        ActiveWorkbook.Close SaveChanges:=False

        '■変数fnに次のファイル名を格納(ファイルが無い場合は空欄になる)
        fn = Dir()
    Loop

    '■画面更新STOP解除
    Application.ScreenUpdating = True
End Sub

FileDialogオブジェクト

ファイルを開いたり保存する標準的な [ファイルを開く] および [保存] ダイアログ ボックスに類似する、ダイアログボックスの機能を提供します。

Application.FileDialog(fileDialogType)

「fileDialogType」には、下記定数のいずれかを指定します。

定数内容
msoFileDialogFilePickerファイルを選択
msoFileDialogFolderPickerフォルダを選択
msoFileDialogOpenファイルを開く
msoFileDialogSaveAsファイルを保存

今回はフォルダを選択するため、「msoFileDialogFolderPicker」を指定しています。

Application.FileDialog(msoFileDialogFolderPicker)

FileDialogオブジェクトには、色々なプロパティやメソッドがあります。その中で、今回使用しているプロパティ、メソッドをご紹介しておきます。

FileDialogオブジェクト.InitialFileName

ダイアログボックスに最初に表示するパスやファイル名を、設定または返します。
文字列型 (String) の値を使用します。

今回は、Cドライブが最初に表示されるように設定しています。

FileDialogオブジェクト.InitialFileName = "C:\"

エクセル ダイアログボックスからフォルダ選択してフォルダ内のファイル全てを取得(Excel VBA)

FileDialogオブジェクト.AllowMultiSelect

複数ファイル選択の可・不可を指定します。

内容
True複数選択可能
False複数選択不可

今回は、複数選択不可とするために「False」を指定しています。

FileDialogオブジェクト.AllowMultiSelect = False

FileDialogオブジェクト.Showメソッド

ダイアログボックスを表示し、[OK][開く][保存]がクリックされた場合は「-1」を、「キャンセル」がクリックされた場合は「0」を返します。

FileDialogオブジェクト.Show

今回は、「キャンセル」(0)がクリックされたら、マクロ処理を終了するようにしています。

If .Show = 0 Then
    Exit Sub 
End If

FileDialogオブジェクト.SelectedItems(インデックス番号)

FileDialogSelectedItemsコレクションを取得します。
このコレクションには、上記 Showメソッドによって表示されたダイアログボックスで、ユーザーが選択したファイル・フォルダパスの一覧が含まれます。 値の取得のみ可能です。

今回は「AllowMultiSelect = False」として、複数ファイル選択を不可としているため、インデックス番号は「1」になります。また、Cドライブの中の「csv」フォルダを選択したため、変数ptには「C:\csv」が入ります。

pt = .SelectedItems(1)

エクセル ダイアログボックスからフォルダ選択してフォルダ内のファイル全てを取得(Excel VBA)

Dir関数

Dir関数は、第1引数に指定したファイル・フォルダが存在する場合、パスを除いたファイル名・フォルダ名を返します。存在しない場合は長さ0の文字列 ”” (空欄)を返します。

Dir(ファイル・フォルダのパス,ファイル・フォルダの属性)

第1引数にはワイルドカードを使用することができるので、取得したいファイル名・フォルダ名の幅を広げることができます。

参考:ワイルドカードとは。使い方いろいろ。(Excel)

Dir(“C:\csv\*.*”) の場合

  • ファイルが存在する場合(ファイル名を返す)→ 202304.csv
  • ファイルが存在しない場合(空欄を返す)      →  ””

エクセル ダイアログボックスからフォルダ選択してフォルダ内のファイル全てを取得(Excel VBA)

第2引数に下記定数(値)を指定することで、特定の属性のオブジェクトのみを取得の対象とすることができます。

定数属性
vbNormal (既定)0標準ファイル
vbReadOnly1読み取り専用ファイル
vbHidden2隠しファイル
vbSystem4システム ファイル
vbVolume8ボリューム ラベル。この値を指定すると、すべての属性は無効になります。
vbDirectory16フォルダ
vbAlias64エイリアスファイル

フォルダ名を取得したい場合は、第2引数に「vbDirectory」を指定します。

Dir関数でのフォルダ名取得は少し複雑ですので、もう少し詳しいことが知りたい方はコチラをご参考ください。→Dir関数の使い方。ファイル名やフォルダ名の取得方法。(Excel VBA)

'■指定したフォルダパスが存在するか確認
If Dir(pt, vbDirectory) = "" Then
    MsgBox "ご指定のフォルダパスは存在しません。"
    Exit Sub
End If

Dir関数は一度引数を指定すると、次に別の引数を指定するまで、同じ引数に対する処理を行います。

fn =Dir("C:\csv\*.*")
fn =Dir()
fn =Dir()

1行目の処理では、変数 fn に「C:\csv\*.*」に一致するファイルが存在すれば、そのファイル名を返します。

2行目以降の「fn=Dir()」では引数を指定していませんが、「C:\csv\*.*」に一致する別のファイル名を返します。

その処理を繰り返し、「C:\csv\*.*」に一致するファイルが無くなった時、長さ0の文字列 ”” 空欄 を返します。

何度も「fn=Dir()」を書くのは面倒だし、どのタイミングでファイルが無くなるかわからないので、Do While ~ Loopを使って繰り返し処理を行います。

'■指定フォルダパス内のファイル名の取得が終わるまでLoop
fn = Dir(pt & "\*.*") '指定フォルダパス内の1個目のファイル名を取得
Do While fn <> ""
    Workbooks.Open Filename:=pt & "\" & fn
    ActiveWorkbook.Close SaveChanges:=False
    fn = Dir()             '指定フォルダパス内の次のファイル名を取得
Loop
■■■スポンサーリンク■■■

【参考】

指定したフォルダ内のファイル名全てを取得(Excel VBA)
変数でよく使われる「buf」「tmp」の意味
Dir関数が取得するファイルの順番
指定したフォルダ内のフォルダ名全てをGetAttrを使って「エラー53 ファイルが見つかりません。」を出さずに取得(Excel VBA)
GetAttrとは?「= vbDirectory」ではなく「And vbDirectory」となるビット演算の疑問
フォルダ名だけを取得したい時に出てくる 「.」 と 「..」 とは?
指定したフォルダ内とサブフォルダ内全てのファイル名を取得(Excel VBA)
CreateObject(“Scripting.FileSystemObject”) を使ってサブフォルダを取得
再帰処理とは?フォルダ内とサブフォルダ内全てのファイル名を取得(Excel VBA)
指定したフォルダ内のサブフォルダのフォルダ名を全部取得(Excel VBA)
再帰処理とは?フォルダ内のサブフォルダのフォルダ名を全部取得(Excel VBA)
参照渡し「ByRef」と値渡し「ByVal」の違い(Excel VBA)
ファイルのフルパスからファイル名のみを取得 InStrRev関数(Excel VBA)
指定したフォルダの全ての階層のフォルダ名・サブフォルダ名・ファイル名を取得(Excel VBA)
FileSystemObjectとは?CreateObject 関数 FolderExists・GetFolderの使い方
FileSystemObject CreateObject関数を使う方法・ 参照設定を使う方法 違いを理解してエラー防止
再帰処理とは?指定したフォルダの全ての階層のフォルダ名・サブフォルダ名・ファイル名を取得(Excel VBA)
ファイルのフルパスからファイル名のみを取得 Split関数(Excel VBA)
Callステートメントとは 引数 括弧()の使い方(Excel VBA)
指定したフォルダ内から「特定の文字を含まないファイル名」を取得(Excel VBA)
ワイルドカードとは。使い方いろいろ。(Excel)
Dir関数の使い方。ファイル名やフォルダ名の取得方法。(Excel VBA)
指定したフォルダのファイル名を取得し、そのファイル名を一括で変換(Excel VBA)
Excel起動時に「コンパイルエラー」。64ビット システムで Declareステートメントに、PtrSafe属性を設定(Excel VBA )
「ファイルを開く」ダイアログボックス から ファイル名を取得(Excel VBA)
「ファイルを開く」ダイアログボックス から 複数 ファイル名を取得(Excel VBA)
指定フォルダ内のサブフォルダ全てをフォルダ構成のみ(空フォルダ)を別フォルダにコピー(Excel VBA)
再帰処理とは?指定フォルダ内のサブフォルダ全てをフォルダ構成のみ(空フォルダ)を別フォルダにコピー(Excel VBA)
エクセル ファイルのフルパスから拡張子のみを取得 Split関数(Excel VBA)
エクセル ファイルのフルパスから拡張子のみを取得 InStr関数(Excel VBA)
Excel VBAダイアログボックスで選択したcsvファイルをエクセルブックとして開いて取込(「,」「”」非対応)
Excel VBAダイアログボックスで選択したcsvファイルをテキストファイルとして取込(ゼロ落ち・日付変換対応)
Excel VBAダイアログボックスで選択したcsvをテキストファイルとして取込(「,」「”」ゼロ落ち・日付変換対応)
Excel VBAダイアログボックスで選択したcsvをQueryTablesで取込(「,」「”」ゼロ落ち・日付変換対応)
エクセル ダイアログボックスからフォルダ選択してフォルダ内のファイル全てを取得(Excel VBA)

■■■スポンサーリンク■■■