AccessでApplication.GetOpenFileNameのようなダイアログを表示してファイルを選択する方法

スポンサーリンク

GetOpenFileNameはExcelだけの機能

以前からExcelVBAでファイルをダイアログで選択して開く方法として「Application.GetOpenFileName」メソッドを使用していましたが、このメソッドはExcelしか使えなくて、AccessなどでExcelファイルを開くときに使うには非常に面倒で不便なことに気づきました。

今回はAccessでApplication.GetOpenFileNameを使う方法と、より便利な代替方法をご紹介します。

AccessでExcelを操作する応用でApplication.GetOpenFileNameメソッドを使用する

ExcelVBAでしか使えないメソッドなので、Excelを操作する際のように下記コードを記入すれば使えるようになります。

Dim ExApp As Object
Set ExApp = CreateObject(“Excel.Application”)

正しい説明なのかどうかわかりませんが、変数「ExApp」にExcelオブジェクト格納し、そこからプロパティ・メソッドを呼び出す手順だと思います。
コードの全体は下記のような感じになります。

Sub ExcelでGetOpenFileName()

Dim ExApp As Object
Set ExApp = CreateObject(“Excel.Application”)

ExApp.Visible = True

Dim ExBook As Variant ’宣言はString型かVariant型を使う その後の分岐の条件が変わる
ExBook = ExApp.Application.GetOpenFileName(“Microsoft Excelブック,*.xls?”)

If ExBook <> False Then
ExApp.Workbooks.Open ExBook
Else
MsgBox “中止します”
Exit Sub
End If

Set ExBook = Nothing
Set ExApp = Nothing

End Sub

VBAで他のアプリケーションを使う際によく使う手法ですが、Application.GetOpenFileNameの場合、初期表示するフォルダを選択できない致命的な問題が生じます。

通常Application.GetOpenFileNameはカレントフォルダを最初に開く設定になっているので、ChDriveとChDirを使うことで最初に表示するフォルダを指定することができます。

しかし、Accessや他のアプリケーションでExcelを起動してApplication.GetOpenFileNameを使用してもExcel上のカレントフォルダを変更することができないようです。

私の使用しているPCの環境ではOneDriveのドキュメントフォルダが初期表示される設定を変えることができませんでした。

Excel以外のAccessやOutlook、WordのVBAの際は下記のApplication.FileDialogを使用する方が使いやすい環境を作ることができます。

スポンサーリンク

Application.FileDialogオブジェクト

Application.GetOpenFileNameはExcelの環境に依存してしまうためAccessなど他のアプリケーションでは上記の通り使いにくく、操作性に問題が生じてしまいます。

Accessで使いやすい形でファイル選択ダイアログを開くにはApplication.FileDialogオブジェクトを使用する方が便利だと思います。
このApplication.FileDialogメソッドはApplication.GetOpenFileNameと異なり、下記の点が優れています。

  • ①ExcelだけでなくAccessやOutlookなど、どのVBAでも使用できる
  • ②初期フォルダの設定が可能
  • ③ファイルの指定だけでなく、フォルダの指定も可能
  • ④ファイルの指定時、複数ファイルを指定してそれぞれを取得できる
  • ⑤ファイルの選択ではフィルター表示を複数設定できる
  • 逆にデメリットとしては下記の通りです。

  • ①設定項目・プロパティが多いのでコードが複雑になりやすい
  • ②参照設定「Microsoft Office 〇〇 Object Library」をする必要がある(Verの違いでエラーになることがあるので注意)
  • Application.FileDialogオブジェクトのサンプルコード

    Sub フォルダを選択してパスを取得するコード()

    Dim WSH As Object
    Set WSH = CreateObject(“Wscript.Shell”)
    Dim DesktopPath As String
    DesktopPath = WSH.SpecialFolders(“Desktop”)

    With Application.FileDialog(msoFileDialogFolderPicker)
    .InitialFileName = DesktopPath & “¥” ’初期フォルダをデスクトップに 最後の「\」は必要なのか不明
    .AllowMultiSelect = False ’複数選択をしない(フォルダはできない)
    .Title = “フォルダの選択” ’ダイアログのタイトル
    If .Show = True Then
    MsgBox “選択フォルダは” & vbLf & .SelectedItems(1)
    End If
    End With
    Set WSH = Nothing

    End Sub
    Sub ファイルを選択してパスを取得するコード()

    Dim i
    Dim WSH As Object
    Set WSH = CreateObject(“Wscript.Shell”)
    Dim DesktopPath As String
    DesktopPath = WSH.SpecialFolders(“Desktop”)

    With Application.FileDialog(msoFileDialogFilePicker) ’Excel以外は.Executeで開かないのでmsoFileDialogOpenは使わない
    .InitialFileName = DesktopPath & “¥” ’初期フォルダをデスクトップに 最後の「\」は必要なのか不明
    .AllowMultiSelect = True ’複数選択をする
    .Title = “ファイルの選択” ’ダイアログのタイトル
    If .Show = True Then
    For i = 1 To .SelectedItems.Count ’選択したファイルのファイル名をすべて取得する
    MsgBox “選択ファイルは” & vbLf & .SelectedItems(i)
    Next i
    End If
    End With
    Set WSH = Nothing

    End Sub

    初期フォルダをデスクトップにするためにWSHを使用してデスクトップを指定しています。
    私の環境では.InitialFileNameでフォルダパスの最後に「\」を付けないとうまく動作しませんでした。

    コメント