AccessでWizHook使ってみよう。

MSACCESS_eyecatch
SBMJOB

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を使ってみよう

不要な参照設定を入れなくても使えるし、画面裏にまわることもないので使いやすいです。
マイクロソフトでは非推奨扱いなのは少々難ありですが使ってみましょう。非推奨なだけあって
公式情報での説明等は一切ない代わりに、ネット上にはいろいろ情報がころがっています。
検索してみると引数が時折変更になってるとかなってないとか・・・

オブジェクトブラウザで非表示項目を表示するとこんな感じで隠してあります。
引数もここで確認できるといえばできますね。

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

実行結果

wizhookダイアログ表示例

なお、エクスポート時は保存用のダイアログとして
インポート時は読み取り(ファイルを開く)ダイアログとして使用できます。
使い分けは
ReturnArray = GetFileName(False, “ログファイル (*.xlsx)|*.xlsx|”, “ダイアログタイトル”, “sample.xlsx”)
第一引数 False = 保存用のダイアログ
True = 読み取り用のダイアログ
となります。

まとめ

Accessでの使用は非推奨とマイクロソフトはしていますが、実務では日常的につかわれているWizHookダイアログです。この辺りはマイクロソフトさんにもっと確実な方法を実装してもらいたいところですが現状ではこの方法で実装してみましょう。

広告

↑VBAも学べるそうなので初学者のかたは無料カウンセリングどうですか?

スポンサーリンク

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

システム開発SE・アプリ開発・デバッガー等々なんでもやる猫の下僕です。現在は凶暴猫にカタカタ動く手を狙われながらキーボードを打っています。かなりゆるい性格なのでコメントやメッセージお気軽に〜お仕事のご依頼もお気軽にぃ〜

スポンサーリンク

コメント

コメントする

CAPTCHA


目次