AccessのVBAでWizHookオブジェクトを使用して[ファイルを開く]もしくは、[名前をつけて保存]ダイアログボックスを表示する際に選択される初期フォルダを任意のフォルダに指定する方法についての覚書です。
記事の概要
以前作成した以下の記事を任意のフォルダを選択させた状態で開くことができるように改版したサンプルプログラムです。
こちらの記事を読んでからのほうが理解が深まると思います。
また記事の最後にデスクトップフォルダやテンポラリフォルダなど、Windowsの特殊フォルダをデフォルトフォルダに指定するサンプルプログラムも紹介しています。
WizHookオブジェクトを使用した[ファイルを開く]、[名前をつけて保存]ダイアログボックスを表示するサンプルユーザー定義関数
サンプルとして紹介するユーザー定義関数は、以下の4つの引数を持ちます。
- [ファイルを開く](True)ダイアログボックスか[名前をつけて保存](False)かを表すBoolean型の引数
- ファイルの種類を指定するフィルタ文字列
- ダイアログボックスのタイトルを表す文字列
- カレントディレクトリを指定する文字列
ユーザー定義関数のサンプルプログラム
以下のサンプルプログラムをVBAの標準モジュールにコピー&ペーストしてください。
Function GetFileName(OpenOrSaveFlg As Boolean, strFilter As String, strTitle As String, strCDir As String) As Variant
Dim returnValue As Integer
Dim strFilePath As String
If strFilter = "" Then
strFilter = "全てのファイル (*.*)|*.*"
End If
WizHook.Key = 51488399 'WIZHOOK有効
returnValue = WizHook.GetFileName(0, "", strTitle, "", strFilePath, strCDir, strFilter, 0, 0, 0, OpenOrSaveFlg)
WizHook.Key = 0 ' WizHook 無効
GetFileName = Array(returnValue, strFilePath)
End Function
上記ユーザー定義関数を呼び出すサンプルプログラム
以下に上記ユーザー定義関数をプログラム中で呼び出して使用するサンプルプログラムを記述します。
初期フォルダに"C:\"を指定して呼び出す際のプログラムは以下のようになります。
Sub procOpenDialog1()
Dim ReturnArray As Variant
ReturnArray = GetFileName(True, "ログファイル (*.txt,*.csv,*.tab)|*.txt|*.csv|*.tab", "ログファイルを開く", "c:¥")
If ReturnArray(0) = -302 Then
'キャンセルボタンが押されたときの処理を記述
MsgBox "キャンセルが押されました。"
Else
'ファイルが指定されたときの処理を記述
MsgBox ReturnArray(1)
End If
End Sub
[デスクトップ]フォルダや[Windows]フォルダなどの特殊フォルダを初期フォルダにする方法
ちなみに、デスクトップフォルダやテンポラリフォルダなど、Windowsの特殊フォルダを指定したい場合は、少しめんどくさくなります。
ログインしているユーザーごとにパス文字列が異なる[デスクトップ]フォルダや、Windowsセットアップ時に指定するディレクトリ名によってパスが変わってしまうWindowsの特殊([Windows]フォルダや[System32]フォルダなど)フォルダをカレントディレクトリに指定したい場合は、"WScript.Shell"オブジェクトや"FileSystem"オブジェクトを利用します。
これらのオブジェクトを利用して特殊フォルダのパスを取得してからユーザー定義関数を呼び出します。
Windowsの特殊フォルダやWindowsをセットアップしたフォルダ(Windowsフォルダ)、System32フォルダなどの特殊フォルダのパスを取得する詳細については、以下の記事を参考にしてください。
[デスクトップ]フォルダを初期フォルダを指定するサンプルプログラム
以下のサンプルは、"WScript.Shell"オブジェクトを利用してデスクトップフォルダのパスを取得ユーザー定義関数を呼び出しています。
Sub procOpenDialog2()
Dim wScriptHost As Object, strInitDir As String
Dim ReturnArray As Variant
'デスクトップフォルダのパスを取得
Set wScriptHost = CreateObject("WScript.Shell")
strInitDir = wScriptHost.SpecialFolders("Desktop")
ReturnArray = GetFileName(True, "ログファイル (*.txt,*.csv,*.tab)|*.txt|*.csv|*.tab", "ログファイルを開く", strInitDir)
If ReturnArray(0) = -302 Then
'キャンセルボタンが押されたときの処理を記述
MsgBox "キャンセルが押されました。"
Else
'ファイルが指定されたときの処理を記述
MsgBox ReturnArray(1)
End If
End Sub
指定できる特殊フォルダと指定する際の文字列一覧
以下は、上記サンプルプログラムの"SpecialFolders"で指定できる各特殊フォルダを表す文字列の一覧です。
デスクトップフォルダ以外の特殊フォルダのパスを取得したい際の参考にしてください。
指定文字列 | 取得できるフォルダのパス |
---|---|
Desktop | デスクトップフォルダ |
Favorites | お気に入りフォルダ |
Fonts | フォントフォルダ |
MyDocuments | マイドキュメントフォルダ |
Programs | プログラムフォルダ |
Recent | 最近開いたファイルフォルダ |
SendTo | 送るフォルダ |
StartMenu | スタートアップメニューフォルダ |
StartUp | スタートアップフォルダ |
AccessのVBAで[ファイルを開く]、[名前をつけて保存]ダイアログボックスを表示する方法についての記事
AccessのVBAで[ファイルを開く]、[名前をつけて保存]ダイアログボックスを開く方法については、結構色々な記事を作ってあるので参考にしてください。
コメント