GetOpenFileNameはExcelだけの機能
以前からExcelVBAでファイルをダイアログで選択して開く方法として「Application.GetOpenFileName」メソッドを使用していましたが、このメソッドはExcelしか使えなくて、AccessなどでExcelファイルを開くときに使うには非常に面倒で不便なことに気づきました。
今回はAccessでApplication.GetOpenFileNameを使う方法と、より便利な代替方法をご紹介します。
AccessでExcelを操作する応用でApplication.GetOpenFileNameメソッドを使用する
ExcelVBAでしか使えないメソッドなので、Excelを操作する際のように下記コードを記入すれば使えるようになります。
Set ExApp = CreateObject(“Excel.Application”)
正しい説明なのかどうかわかりませんが、変数「ExApp」にExcelオブジェクト格納し、そこからプロパティ・メソッドを呼び出す手順だと思います。
コードの全体は下記のような感じになります。
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と異なり、下記の点が優れています。
逆にデメリットとしては下記の通りです。
Application.FileDialogオブジェクトのサンプルコード
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
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でフォルダパスの最後に「\」を付けないとうまく動作しませんでした。
コメント