VBAにおけるWizHookオブジェクト?とGetfileNameメソッドについて


今、以下のリンク先のような関数が、あるAccessのシステムのVBAに出てきたのですが。
https://gist.github.com/AuroraNorthernQuarter/ccf834341654075ec22fde88e2534db2
一体、何をやっているのか、わかりかねます。
wizhookやgetfilenameについて、手元のaccessの本には記載が見当たらず。

ググって調べると、getfilenameメソッドは「パス名からファイル名部分を取り出す」メソッドのようです。
getfilenameの方は、()内になぜ、たくさん引数が出てくるのか…。
「"Microsoft Excel (*.xls)|*.xls"」という引数も、何をしているのかわからない状態です。

wizhookの方は、ここが詳しかったのですが。

裏技的な非公開ライブラリ「WizHook」はかなりオススメ(ただし自己責任) - 人生は失敗と反省の連続
https://racchie.hatenablog.com/entry/2019/06/08/183000

筆者が述べている「参照設定を行わなくていい、というのは(個人的な考えですが)大きなメリットです。」というのが、自分ではピンときていない状態でして。

この関数がやろうとしていること、wizhookを用いると何が良いのか、もう少し詳しい内容についてお教えいただけますと助かります。

よろしくお願い致します。

回答の条件
  • 1人20回まで
  • 登録:
  • 終了:2021/04/09 20:21:34
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:a-kuma3 No.1

回答回数4973ベストアンサー獲得回数2154

ポイント1500pt

この関数がやろうとしていること

まずは、ここから。

やろうとしていることは、Excel で「名前を付けて保存」のようなダイアログを表示して、ファイル名を取得することです。

何かのデータをファイルに保存するとして、その保存先のフォルダとファイル名を対話的にマクロで取得したい。

それが、そのコードです。



ググって調べると、getfilenameメソッドは「パス名からファイル名部分を取り出す」メソッドのようです。

これは、違うものを検索してます。

メソッドというのは、クラスの持ち物です。

同じ名前がついているメソッドでも、対象のクラス(オブジェクト)が違うと別の動作をすることが往々にしてあります。


メソッド名でググった結果で出てきた GetFilename は「パス名からファイル名部分を取り出す」の動作をするものだったのでしょうけれど、質問にあるコードが期待している動作は違います。


「名前を付けて保存」のダイアログの状態を色々と制御したいこともあるので、メソッドのパラメータは増えます。

「"Microsoft Excel (*.xls)|*.xls"」という引数も、何をしているのかわからない状態です。

↑は、「名前を付けて保存」のダイアログに出てくる「ファイルの種類」の指定です。


wizhookやgetfilenameについて、手元のaccessの本には記載が見当たらず。

WizHook オブジェクトは、結構 昔からあるオブジェクトなのですけれど、公式のドキュメントがありません。

本を書いた人次第ではありますけれど、公式のドキュメントがない以上、仕様が変わったり、なくなったり、ということがいつ起きても不思議ではないので、寿命が長い本では触れないのが安全かも、とか思ったりします。


wizhookを用いると何が良いのか

質問で張られてるリンクのメリットはあると思います。



データを保存したいときに、ファイル名を操作してる人に指定して欲しいケースがあると思います。

Excel の VBA だと、「名前を付けて保存」のダイアログを表示するメソッドがあるのですが、Access の VBA にはありません。

やろうと思うと、Access 以外のライブラリを使う必要があるのですが、そのためにはオブジェクトの参照設定、という行為が必要です。



VBA って、それを分かっていない人が使う、というケースが往々にしてあります。

そういう人に、リボンに「開発」の項目を表示させて、更に妙なツールのメニューからいろいろな手順を経てライブラリを組み込む、という操作が正しく実行してもらえる、という期待はあまりできません。



「参照設定」をしなくて良い、ということは、Access の mdb を配るだけで、もともと Access が持っている機能以上のことが提供できるので、トラブルが少ないことが期待できます。



後半、ちょっと分かりにくいかもしれませんが、VBA が分からない人も同じです。

その VBA が組み込まれた .mdb なファイルを使うのは、そういう人たちかもしれないので、動かすために必要な手順は少ないに越したことがない。

それが「参照設定を行わなくて良い」がメリットになるということです。

他1件のコメントを見る
id:a-kuma3

今回のコードで利用されているGetFilenameメソッドは、a-kuma3さんが仰るように「対象のクラス(オブジェクト)が違う」ということでしたので。「利用されているのはWizHook オブジェクトのGetfilenameメソッドである」という認識で、よろしいでしょうか?

そうです。たまたまメソッド名が同じなだけで、別物です。


また、a-kuma3さんが仰る「 mdbx を配る」「b .mdbx なファイルを使う」ということについて、もう少し教えていただけないでしょうか。

mdbx、について、自分で調べても見つからず。

いや、お恥ずかしい。間違えました

.mdbx じゃなくて、.mdb もしくは .accdb です。

2021/04/06 17:31:33
id:moon-fondu

ありがとうございます、勉強になりました!

2021/04/09 20:21:17

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません