
Accessでファイル入力・出力用のダイアログボックを実装する時にWizHookというものがあります。この記事ではその使用目的と実装方法をご紹介します。ダイアログボックスが他のアプリケーションの裏に表示され困った経験がある場合はお役に立つ情報です。
Excelファイルのエクスポート・インポート
AccessでExcelファイルのエクスポート・インポートは以下のようにDocmd.TransfreSpredSheetを使ってボタンに組み込んだりしますが、
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, “T-顧客”, “ディレクトリ”
DoCmd.TransferSpreadsheet acImport, Excelのバージョン指定, インポート先テーブル名, Excelファイルパス, 先頭行を列名にする時はtrue, 取り込みシート名
完全な定型業務なら上記のコマンドをボタンに組み込めばOKですが、出力先や入力元をダイアログボックスを使って指定したいですよね。この記事ではそれをWizhookという機能で実装していきます。
Wizhook使わないやり方
まずはWizhookを使わないやり方をご紹介します。


エクスポート時はMicrosoft Excel16.0 Object Libraryを参照設定で追加し、GetSaveAsFilenameを使って出力先ダイアログを表示します。
インポート時はMicrosoft Access 16.0 ObjectLibraryを参照設定で追加し、FileDialogをつかってダイアログを表示します。
詳細は省きますが、ここで問題がエクスポート時のダイアログボックスウィンドウの表示がAccessのウィンドウ裏に回ってしまうことが多いことです。おそらくアプリケーションがExcelとなってダイアログが表示されるので最前面のアプリケーションとして認識されないためだとは思いますが、実務では結構致命的です。ユーザーはダイアログボックスが表示されずAccessも反応しなくなるので「あれ?Accessフリーズした??」となってしまいます。
そこでWizHookを使ってみよう
不要な参照設定を入れなくても使えるし、画面裏にまわることもないので使いやすいです。
マイクロソフトでは非推奨扱いなのは少々難ありですが使ってみましょう。非推奨なだけあって
公式情報での説明等は一切ない代わりに、ネット上にはいろいろ情報がころがっています。
検索してみると引数が時折変更になってるとかなってないとか・・・
オブジェクトブラウザで非表示項目を表示するとこんな感じで隠してあります。
引数もここで確認できるといえばできますね。


実装 標準モジュールへ
参考になるのがこちらのSE Life Log – VBAを中心にその他IT備忘録さんの記事。
https://selifelog.com/blog-entry-53.html
まずは、標準モジュールにWizHookをFunctionとして記述し保存します。
Function GetFileName(OpenOrSaveFlg As Boolean, strFilter As String, strTitle As String, defaultFileName 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, "", defaultFileName, "", _
strFilter, _
0, 0, 0, OpenOrSaveFlg _
)
WizHook.Key = 0 ' WizHook 無効
'returnValueとstrFilePathの2つの値を返す
'returnvalueの値を返すことで[キャンセル]が押されたかを判断するため
GetFileName = Array(returnValue, strFilePath)
End Function
実装 呼び出し側
ダイアログボックス呼び出しが側は以下のように
Private Sub コマンド_エクスポート_Click()
Dim sFina As String
Dim ReturnArray As Variant
ReturnArray = GetFileName(False, "ログファイル (*.xlsx)|*.xlsx|", "ダイアログタイトル", "sample.xlsx")
If ReturnArray(0) = -302 Then
'キャンセルボタンが押されたときの処理を記述
MsgBox "キャンセルが押されました。"
Else
'ファイルが指定されたとこの処理を記述
MsgBox ReturnArray(1)
sFina = ReturnArray(1)
End If
If sFina <> "" Then
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12, "売上テーブル", sFina, True, "シートxxx"
End If
End Sub
実行結果


なお、エクスポート時は保存用のダイアログとして
インポート時は読み取り(ファイルを開く)ダイアログとして使用できます。
使い分けは
ReturnArray = GetFileName(False, “ログファイル (*.xlsx)|*.xlsx|”, “ダイアログタイトル”, “sample.xlsx”)
第一引数 False = 保存用のダイアログ
True = 読み取り用のダイアログ
となります。
まとめ
Accessでの使用は非推奨とマイクロソフトはしていますが、実務では日常的につかわれているWizHookダイアログです。この辺りはマイクロソフトさんにもっと確実な方法を実装してもらいたいところですが現状ではこの方法で実装してみましょう。
広告
↑VBAも学べるそうなので初学者のかたは無料カウンセリングどうですか?
コメント