【Excel VBA】FileDialog ボタンクリックだけでファイルを選べるようにする

Excel VBA

アプリっぽい操作感でファイルを選べるマクロを組みたい!

最適屋
最適屋

FileDialogを使ってみましょう!

マクロで処理するファイルは、ユーザーが直感的に選べると親切!

FileDialogを使えば、あなたの組んだExcelマクロがよりアプリっぽい動作をするようになります。

【マクロの完成イメージ】ボタンクリックだけでファイルを選べる

今回紹介するマクロは、こんなことができます。

  • ボタンクリックで、ダイアログを呼び出してファイルを選択する。
  • 選んだファイルのフルパスをセルに書き出す。

イメージはこんな感じ。

ボタンクリックでファイルを選ぶ
  • 1
    [参照]ボタンをクリック
  • 2
    ファイル選択ダイアログが開く
  • 3
    選択したファイルのフルパスをセルに格納する

なぜ、ファイルのフルパスを取得するマクロが必要なのでしょう?

Excelマクロでファイルを操作するには、対象ファイルのフルパスが必須だからです。

フルパスとは?ファイルにたどり着くまでの経路(Path)を示しています。最上流のドライブ名からスタートして、途中のフォルダを経由し、目的のファイルまでたどります。フォルダ名は「¥」マークで区切られます。

最適屋
最適屋

VBAではファイル名だけ指定しても動かないことがほとんどです。

あらかじめ対象ファイルのフルパスを取得しておくと、次のような処理を楽に実装できます。

  • ファイル名のチェック
  • 後から呼び出してファイルを開く
  • ファイルをWorkbookのオブジェクトに格納

では、具体的なFileDialogの使い方を解説します。

FileDialog:ダイアログでファイル操作する

ファイル選択ダイアログは、このような画面を指します。

Windowsのアプリではお馴染みの画面です。

ファイルダイアログの例
ファイル選択ダイアログの例

これもExcelマクロから呼び出せます。

FileDialogの呼び出し方

FileDialogは、次のような書き方で呼び出すのが基本。

    'ファイルを開くダイアログ
    With Application.FileDialog(msoFileDialogFilePicker)
        
        'ダイアログを表示
        If .Show = True Then
          
          'ファイルが選択された場合の処理
        
        Else
          
          'ファイルが選択されなかった場合(キャンセル処理)
        
        End If
    
    End With

With構文でくくり、If文で分岐させています。

後述する細かい設定を追加したり、ファイルを選択しなかった場合の処理を想定しているためです。

FileDialogの機能は4種類

Application.FileDialog()は、引数に記述する内容で機能の使い分けができます。

  1. ファイルを開く
    • msoFileDialogOpen
  2. 名前を付けて保存
    • msoFileDialogSaveAs
  3. ファイルを選択
    • msoFileDialogFilePicker
  4. フォルダを選択
    • msoFileDialogFolderPicker
最適屋
最適屋

先頭の数字は機能に紐づいた「定数」です。

ファイルを選択するダイアログの場合は、こう書きます。

'ファイルを選択するダイアログの指定
With Application.FileDialog(msoFileDialogFilePicker)

あるいは、引数を定数(数字)で指定することもできます。

'ファイルを選択するダイアログを定数で指定
With Application.FileDialog(3)
最適屋
最適屋

「定数」で指定しておくと、

ライブラリの参照設定が不要です。

FileDialogは細かい設定ができる

FileDialogはプロパティが豊富。

最低限、次のプロパティを設定しておけばユーザーに優しいです。

  • Title
    • ダイアログのタイトルを変更
  • InitialFileName
    • ダイアログの初期フォルダを変更
  • Filters
    • 選べるファイルを拡張子で絞り込む

実際の書き方・解説は後述しています。

FileDialogのメソッド/プロパティの全容は、マイクロソフト公式サイトをお読みください。

【実装コード】FileDialogを関数化する

FileDialogを呼び出してファイルのフルパスを取得する関数を自作します。

GetFilePath関数と名付けました。

いろんなPCやExcelマクロで使い回せるように、次のような設計をしています。

  • Public Functionで宣言
  • Application.FileDialog(3) —> ダイアログの種類を定数で指定して、参照設定を不要に。
  • キャンセル処理を記載

Functionに記述するコード

モジュールにそのままコピペして使えます。

'ファイル選択ダイアログ: ファイルパスを取得する
Public Function GetFilePath() As String

    'ファイルを開くダイアログ
    With Application.FileDialog(3)      'msoFileDialogFilePicker: 3
    
        'ダイアログのタイトルを設定
        .Title = "ファイルパスの取得"
        
        '選べるファイルの種類を設定
        .Filters.Clear
        .Filters.Add "Excelファイル", "*.xlsx; *.xlsm"
        
        '初期パス: このマクロブックの場所
        .InitialFileName = ThisWorkbook.Path
        
        'ダイアログを表示: ファイルが選択された場合
        If .Show = True Then
          
          '選択したファイルのフルパスを返す
          GetFilePath = .SelectedItems.Item(1)
        
        Else    'ファイルが選択されなかった場合(キャンセル処理)
          
          '空白を返す
          GetFilePath = ""
        
        End If
    
    End With

End Function

FileDialogプロパティの解説

関数内で使用しているFileDialogのプロパティについて解説します。

Titleプロパティ

'ダイアログのタイトルを設定
.Title = "ファイルパスの取得"        

何のためのダイアログか、タイトルを付けておきましょう。

ファイル選択ダイアログのタイトルを指定しています。

Fitersプロパティ

'選べるファイルの種類を設定
.Filters.Clear
.Filters.Add "Excelファイル", "*.xlsx; *.xlsm"

ダイアログで選択できるファイルの種類を拡張子で絞り込みます。

この場合は、Excelワークブック(xlsx)と、Excelマクロ有効ワークブック(xlsm)のみ表示しています。

最適屋
最適屋

処理に使わないファイルは、

選べないようにしておくのが親切!

InitialFileNameプロパティ

'初期パス: このマクロブックの場所
.InitialFileName = ThisWorkbook.Path

ダイアログを開いたときに表示する最初のフォルダを指定しています。

この場合は、マクロを動かしているブックが入っているフォルダが最初に開きます。

Showプロパティ

'ダイアログを表示: ファイルが選択された場合
If .Show = True Then

.Showでダイアログを開きます。

同時に、[開く]ボタンがクリックされた(True)か、キャンセルされたか(Else)を評価して、処理を分岐させています。

SelectedItemsプロパティ

'選択したファイルのフルパスを返す
GetFilePath = .SelectedItems.Item(1)

選択されたファイルのフルパスは「.SelectedItems.Item(1)」に格納されています。

[開く]ボタンがクリックされた場合、ファイルのフルパスを変数GetFilePathに返します。

'空白を返す
GetFilePath = ""

[キャンセル]ボタンがクリックされた場合は、空白を変数GetFilePathに返します。

以上が、GetFilePath関数のコードです。

次は、GetFilePath関数を呼び出すコードを書いてみましょう。

【実装コード】FileDialogを呼び出してファイルパスを取得

GetFilePath関数を呼び出して、取得したフルパスをセルに書き出すプロシージャを記述します。

Excelワークシートの準備

マクロを正常に動かすには、次のように作成したExcelマクロ有効ワークブックを準備してください。

Excelワークシートの準備
  • シート名:[参照]
  • フルパスの入力欄:セルB3〜セルG3を結合
  • [参照]ボタン名:browse
最適屋
最適屋

[参照]ボタンとプロシージャの紐づけを忘れずに

Subに記述するコード

次のコードをモジュールにコピペしましょう。

'[参照]ボタンでファイルのフルパスを取得する
Sub Browse_Click()

    'フルパスの格納先 変数
    Dim targetFilePath As String
    
    '関数を呼び出して、ファイルパスを取得する
    targetFilePath = GetFilePath()
    
    'ファイルが選択されていたら(変数が空欄でなければ)
    If targetFilePath <> "" Then
    
        'セルにファイルのフルパスを格納
        ThisWorkbook.Worksheets("参照").Range("B3") = targetFilePath
    
    End If

End Sub
最適屋
最適屋

解説はコード内にコメントしています

以上が、FileDialogを使ってフルパスを取得するマクロでした。

〜応用編〜 Workbookオブジェクト変数と組み合わせて、使用するファイルを一括して開く

〜応用編〜 2つのファイルパスを取得して、ファイルを一括して開く

フルパスが取得できるようになったら、いよいよワークブックを開くマクロを組みましょう。

次回の記事は応用編です。

実際の業務にありがちな、2つのファイルを同時に扱うマクロを紹介します。

Excel VBA
\ お友だちにも教えてあげましょう/
プロフィール
最適屋

Excel VBAとAccessを独学で習得。2011年から現在まで株式会社アントレ(旧: 株式会社リクルート アントレユニット)と業務委託契約を結ぶ。Excel/Accessで様々な効果集計ツールや営業支援ツールを開発・提供。
過去、株式会社リクルートスタッフィング アウトソーシング契約社員時代には、 SV、業務フローの設計・改善に従事。
他、WordPressによるWeb制作やSEO対策も。

Follow Me!
川良最適化事務所
タイトルとURLをコピーしました