和風スパゲティのレシピ

日本語でコーディングするExcelVBA

ダイアログボックスでファイルを指定・選択する

ダイアログボックスを開いてユーザーにファイルを選択してもらう方法を解説します。

GetOpenFilenameメソッドを使用する方法と、
FileDialogオブジェクトを使用する方法の2種類があります。

GetOpenFilenameメソッド

基本コード

' ユーザーにファイルを指定してもらう(返り値はファイルパス)
Dim ユーザー指定ファイルパス As String
ユーザー指定ファイルパス = Application.GetOpenFilename

' 指定されたファイルを開く
Workbooks.Open ユーザー指定ファイルパス
' Excelファイルだけを対象とし、ダイアログのタイトルを変更する場合 
ユーザー指定ファイルパス = Application.GetOpenFilename( _
    FileFilter:="Excelファイル,*.xls*", _
    Title:="処理ブックを選択してください。")

引数の種類

Application.GetOpenFilename(FileFilter, FilterIndex, Title, ButtonText, MultiSelect)
引数 内容
FileFilter ファイルの種類を指定する文字列("Excelファイル,*.xls*"など)
FilterIndex 複数のファイル種類を指定した場合に何番目を規定とするか
Title ダイアログボックスのタイトルを指定します。
この引数を省略すると「ファイルを開く」になります。
ButtonText MacPC限定の設定です。
MultiSelect Trueを指定すると複数のファイルを選択できます。
この場合は結果は配列として返されます。

解説

ダイアログボックスを表示してユーザーにファイルを選択してもらうには、
GetOpenFilenameメソッドを使用するのが一番簡単です。

サンプルの通り1行コードで実行することができ、
特に指定がない場合は引数も0個で動かすことができます。


結果値はファイルパスの文字列(String)が返ります。

ただし「キャンセル」時は""ではなくFalseが返る点に注意してください。
※ この仕様のためメソッドの返り値はStringではなくVariantになっています。


また「Open」と銘打っていますが、実際にはファイルは開かれません。

ファイルへの処理はそのあとにWorkbooks.Openなどを書く必要があり、
逆に言えば必ずしもファイルを開く必要はありません。


「Open」というメソッド名が反映されているのはタイトルだけで、

GetOpenFilenameメソッドの実行サンプル
このようにダイアログタイトルが「ファイルを開く」になるだけです。

ファイルを開かない用途で使用する際は、
Titleを指定してダイアログの用途を表示しておきましょう。


なおGetOpenFilenameメソッドは複数のファイルを選択させることもでき
この場合は配列が返り値として返ります。

詳細はこちらの記事をご覧ください。

[準備中]

初期フォルダの指定

GetOpenFilenameメソッドは初期表示フォルダを指定する機能がなく、
カレントディレクトリ(現在使用中のフォルダ)が開かれます。

カレントディレクトリは下記コードで変更ができるため、
この方法で疑似的に初期表示フォルダを変更することは可能です。

' カレントディレクトリを変更
ChDir 初期表示フォルダのパス

 そのあとでGetOpenFilenameメソッドを実行
ユーザー指定ファイルパス = Application.GetOpenFilename

 
ただしカレントディレクトリを変更すると、
ユーザー操作や他プロセスへの影響が発生してしまいます。
これを回避したい場合は、初期表示フォルダの指定引数を持つ、
後述のFileDialogオブジェクトを使用してください。

FileDialogオブジェクト

ファイルをダイアログボックスから選択する方法には、
FileDialogオブジェクトを使用する方法もあります。

こちらの方が高機能ですが、コードが多少複雑です。

基本コード

Dim FileDialogオブジェクト As FileDialog
Set FileDialogオブジェクト = Application.FileDialog(msoFileDialogFilePicker)
    
' 初期表示フォルダ
FileDialogオブジェクト.InitialFileName = ThisWorkbook.Path

' ファイルの種類
FileDialogオブジェクト.Filters.Add "Excelファイル", "*.xlsx"
FileDialogオブジェクト.Filters.Add "Excelファイル", "*.xls"
FileDialogオブジェクト.Filters.Add "Excelファイル", "*.xlsm"

' ダイアログのタイトル
FileDialogオブジェクト.Title = "処理するファイルを選択してください。"

' 単独のファイル指定しかできないように制御
FileDialogオブジェクト.AllowMultiSelect = False

' ダイアログを表示して選択されたファイルパスを取得
Dim ユーザー指定ファイルパス As String
If FileDialogオブジェクト.Show = True Then
    ユーザー指定ファイルパス = FileDialogオブジェクト.SelectedItems(1)
End If

ダイアログを表示・実行するプロパティ

メソッド 内容
Show ダイアログボックスを表示してユーザーから選択ファイルを受け取ります。受け取ったファイルはSelectedItemsに格納されます。このメソッド自体はファイル選択が実行された/キャンセルされたかどうかをTrue/Falseで返します。
Execute ダイアログごとのファイルへの処理が実行されます。msoFileDialogFilePickerでファイルを選択するダイアログを指定している場合は「ファイルを開く」が実行されます。

ダイアログの表示設定を行うプロパティ

プロパティ 内容
Title FileDialog オブジェクトを使用して表示されるファイルのダイアログ ボックスのタイトルを取得または設定します。
ButtonName ダイアログボックスの実行ボタンのテキストを設定できます。
InitialView フォルダの表示状態(詳細やプレビュー、大アイコンなど)を指定できます。
InitialFileName 初期表示するフォルダパス・ファイル名を指定します。
Filters 表示するファイルの種類をAddメソッドで追加できます。
FilterIndex 表示するファイルの種類が複数ある場合に何番目を規定とするか指定します。
AllowMultiSelect Tureを指定すると複数ファイルを選択できるようになります。
規定値はTrueです。

値・状態を取得するプロパティ

ユーザーが選択したパスを取得するために使用するSelectedItemsが重要ですが、
それ以外はほぼ使用しないと思います。

プロパティ 内容
SelectedItems FileDialogSelectedItems コレクションを取得します。
Application 指定したFileDialogオブジェクトのコンテナーアプリケーションを表すApplication オブジェクトを取得します。
Creator FileDialogオブジェクトが作成されたアプリケーションを示す32 ビットの整数を取得します。
DialogType ダイアログボックスの種類を表すMsoFileDialogTypeの定数を取得します。
Item 指定したオブジェクトに関連付けられたテキストを取得します。
Parent FileDialogオブジェクトの親オブジェクトを取得します。

解説

ファイルをダイアログボックスから選択する方法には、
FileDialogオブジェクトを使用する方法もあります。

上記の通りかなり高機能なオブジェクトで、
様々な設定のもとでダイアログを表示することが可能です。


FileDialogはメソッドではなく「オブジェクト」ですので、
基本コードの通り引数ではなくプロパティへの代入で設定を変更します。

' GetOpenFilenameメソッドでタイトルを指定する場合
選択パス = Application.GetOpenFilename(Title:="処理するファイルを選択してください。)

' FileDialogオブジェクトでタイトルを指定する場合
FileDialogオブジェクト.Title = "処理するファイルを選択してください。"

各種設定が終わったのち、ダイアログを表示する場合はShowメソッドを実行します。

受け取ったファイルはSelectedItemsに格納されますので、
実際のファイルパスはこちらを読み取って取得します。


Showメソッド自体が選択/キャンセルをTrue/Falseで返すため、
以下のようなコードで選択ファイルパスを取得することになります。

Dim ユーザー指定ファイルパス As String
If FileDialogオブジェクト.Show = True Then
    ユーザー指定ファイルパス = FileDialogオブジェクト.SelectedItems(1)
End If

 
このオブジェクト操作は一連の流れで実行されることが多いため、
オブジェクト変数ではなくWithステートメントを使うのも便利です。

With Application.FileDialog(msoFileDialogFilePicker)
    
    ' 初期表示フォルダ
    .InitialFileName = ThisWorkbook.Path
    
    ' ファイルの種類
    .Filters.Clear
    .Filters.Add "Excelファイル", "*.xlsx"
    .Filters.Add "Excelファイル", "*.xls"
    .Filters.Add "Excelファイル", "*.xlsm"
    
    ' ダイアログのタイトル
    .Title = "処理するファイルを選択してください。"
    
    ' 単独のファイル指定しかできないように制御
    .AllowMultiSelect = False
    
    ' ダイアログを表示して選択されたファイルパスを取得
    Dim ユーザー指定ファイルパス As String
    If .Show = True Then
        ユーザー指定ファイルパス = .SelectedItems(1)
    End If
    
End With

こちらの書き方も覚えておいてください。