たま氏の覚え書き

KNIME・AccessVBA・Swift等、学習したことを覚え書き

AccessVBA_Microsoft Object Libraryその1【FileDialogオブジェクト】ファイル/フォルダ選択ダイアログボックスの利用

FileDialogオブジェクトについての説明と、その利用例

【FileDialog】オブジェクトとは

ライブラリMicrosoft Office (バージョン) Object Library」ファイルに格納されているオブジェクト
フォルダ・ファイルを参照するためのダイアログボックスを表示し、選択対象のパスを取得することができる

事前バインディングで参照

参照設定で「MicrosoftOffice (バージョン) Object Library」を選択

実行時(遅延)バインディングで参照

事前バインディングで参照すれば、エラーの確認・メンバ表示などを利用できるという利点があるが
VBA作成者のPCのofficeオブジェクトライブラリのバージョンと、その他のユーザ側のバージョンの違いにより動かないケースがありうる
それを避けるためには、実行時バインディングを採用するほうが安全なのやもしれない
※実行時バインディングを利用することによる処理のスピードの違いというのはそこまでないらしい
 …であれば、構文までは事前バインディングで行って、みんなで使うとなったときに実行時バインディングに変更したらよいのかな

当記事では事前バインディングでオブジェクトを参照するが、実行時バインディングを利用する場合の記述例は以下のページ
▼よくわかる解説▼
参照設定を使用せずにアクセスでファイル選択ダイアログを使うには | 旅馬

【FileDialog】オブジェクトの取得

オブジェクト変数にFileDialogオブジェクトへの参照を格納

フォルダを参照するダイアログボックス

書式:
Dim オブジェクト変数 As FileDialog
Set オブジェクト変数 = Application.FileDialog(msoFileDialogFolderPicker)

▼記述例▼

  Dim FolderDialogInfo As FileDialog '外部のオブジェクトの参照を格納
  Set FolderDialogInfo = Application.FileDialog(msoFileDialogFolderPicker) 'ダイアログボックスの表示指定


ファイルを参照するダイアログボックス

書式:
Dim オブジェクト変数 As FileDialog
Set オブジェクト変数 = Application.FileDialog(msoFileDialogFilePicker)

▼記述例▼

  DimFileDialogInfo As FileDialog '外部のオブジェクトの参照を格納
  Set FileDialogInfo = Application.FileDialog(msoFileDialogFilePicker) 'ダイアログボックスの表示指定


【FileDialog】オブジェクトのプロパティ

ダイアログボックスのみための設定

Title ダイアログボックスの左上に表示される文字列(タイトル)の指定
ButtonName ダイアログボックス内のボタンに表示される文字列の指定
InitialView ダイアログボックスの表示方法をMsoFileDialogViewクラスにより指定※後述
 他

ダイアログボックスに表示するファイル/フォルダの設定

FilterIndex 表示されるファイルの種類を設定
Filters 選択可能なファイルの種類を設定
InitialFileName 初期表示ファイル(フォルダ)を指定
 他

ダイアログボックスでユーザが行うことに関する設定

AllowMultiSelect 複数ファイルの選択を可能とするかどうか
SelectedItems 選択したパスの取得
 他

MsoFileDialogViewクラスの定数によるダイアログボックスの表示設定

msoFileDialogViewDetails 詳細表示モード
msoFileDialogViewList 一覧表示モード
msoFileDialogThumbnail 縮小表示モード

msoFileDialogViewLargeIcons 大きなアイコンで表示
msoFileDialogViewLargeSmallIcons 小さなアイコンで表示

msoFileDialogViewPreview プレビューの表示
msoFileDialogViewProperties プロパティの表示


【FileDialog】オブジェクトのメソッド

Show ダイアログボックスの表示
 →OKボタン:「0」 / キャンセルボタン:「-1」  
 他

【実践】ファイル選択用ダイアログボックス表示の記述例

・FileDialogオブジェクトのメソッドを使用して、ファイル選択用のダイアログボックスを表示
・初期表示される場所は「"C:\Users\user\Desktop\tama-shi"」、拡張子が「.xlsx」のファイルのみをダイアログボックスに表示
・選択できるファイルの種類は「.xlsx」またはすべてのファイルのどちらかを選べるようにする
・ファイルを選択してOKボタンを押したらメッセージボックスにパスを表示
・キャンセルボタンを押した場合には「キャンセルしました」というメッセージを表示する
▼記述例▼

Sub Test_FileDialog()

  Dim FileDialogInfo As FileDialog '外部のオブジェクトの参照を格納
  Set FileDialogInfo = Application.FileDialog(msoFileDialogFilePicker) 'ダイアログボックスの表示指定
  Dim FPath As String '初期表示
  FPath = "C:\Users\user\Desktop\tama-shi"

  FileDialogInfo.InitialFileName = FPath '初期表示する場所
  FileDialogInfo.Title = "Excelファイルを選んでください"

  FileDialogInfo.Filters.Clear '既定の設定をクリア
  FileDialogInfo.Filters.Add "Excel", "*.xlsx", 1  '表示可能なファイルの選択肢のひとつめに.xlsxを設定
  FileDialogInfo.Filters.Add "すべてのファイル", "*.*", 2  '表示可能なファイルの選択肢のふたつめにすべてのファイルを設定
  FileDialogInfo.FilterIndex = 1 'ダイアログボックスを表示したときに表示されるファイルをどれにするか、フィルタの中から選択

  If FileDialogInfo.Show Then
    MsgBox "選択したファイルのパスは" & vbCrLf & FileDialogInfo.SelectedItems(1)
  Else
    MsgBox "キャンセルしました"
  End If

  Set FileDialogInfo = Nothing '念のため参照を解除

End Sub


▼処理結果_ダイアログボックスの表示▼
タイトルや最初に表示するファイルの種類等、設定できた


▼処理結果_ファイルを選択してOKボタンを押した場合▼


▼処理結果_キャンセルボタンを押した場合▼


【番外編】Shell.Applicaionでフォルダ選択ダイアログボックスを表示

ファイルではなくフォルダを選択するだけのダイアログボックスは、以下の記述でも表示できる
この場合、設定するのはタイトルくらいなので手軽につかえる
ちなみに「&H0」Hのあとは英語のオーではなく数字のゼロ、なぜ数字なのかは以下の記事を読むとおおかた理解できる

▼参考記事▼
[VBA]フォルダ選択ダイアログの使い方・使い分け

▼記述例▼

Sub Test_FileDialogShell()

  Dim Shell_Info As Object
  Set Shell_Info = CreateObject("Shell.Application")

  Set Shell_Info = Shell_Info.BrowseForFolder(&H0, "フォルダを選択してください", &H0)

  If Not Shell_Info Is Nothing Then
    MsgBox Shell_Info.Items.Item.Path

    Set Shell_Info = Nothing
  End If

End Sub


▼処理結果▼


Shell.Applicationのほうが手軽だけれど、あれこれ手法があると混乱するからいまは「そういう手法もあるんだな」程度でいいや…