今、以下のリンク先のような関数が、ある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を用いると何が良いのか、もう少し詳しい内容についてお教えいただけますと助かります。
よろしくお願い致します。
この関数がやろうとしていること
まずは、ここから。
やろうとしていることは、Excel で「名前を付けて保存」のようなダイアログを表示して、ファイル名を取得することです。
何かのデータをファイルに保存するとして、その保存先のフォルダとファイル名を対話的にマクロで取得したい。
それが、そのコードです。
ググって調べると、getfilenameメソッドは「パス名からファイル名部分を取り出す」メソッドのようです。
これは、違うものを検索してます。
メソッドというのは、クラスの持ち物です。
同じ名前がついているメソッドでも、対象のクラス(オブジェクト)が違うと別の動作をすることが往々にしてあります。
メソッド名でググった結果で出てきた GetFilename は「パス名からファイル名部分を取り出す」の動作をするものだったのでしょうけれど、質問にあるコードが期待している動作は違います。
「名前を付けて保存」のダイアログの状態を色々と制御したいこともあるので、メソッドのパラメータは増えます。
「"Microsoft Excel (*.xls)|*.xls"」という引数も、何をしているのかわからない状態です。
↑は、「名前を付けて保存」のダイアログに出てくる「ファイルの種類」の指定です。
wizhookやgetfilenameについて、手元のaccessの本には記載が見当たらず。
WizHook オブジェクトは、結構 昔からあるオブジェクトなのですけれど、公式のドキュメントがありません。
本を書いた人次第ではありますけれど、公式のドキュメントがない以上、仕様が変わったり、なくなったり、ということがいつ起きても不思議ではないので、寿命が長い本では触れないのが安全かも、とか思ったりします。
wizhookを用いると何が良いのか
質問で張られてるリンクのメリットはあると思います。
データを保存したいときに、ファイル名を操作してる人に指定して欲しいケースがあると思います。
Excel の VBA だと、「名前を付けて保存」のダイアログを表示するメソッドがあるのですが、Access の VBA にはありません。
やろうと思うと、Access 以外のライブラリを使う必要があるのですが、そのためにはオブジェクトの参照設定、という行為が必要です。
VBA って、それを分かっていない人が使う、というケースが往々にしてあります。
そういう人に、リボンに「開発」の項目を表示させて、更に妙なツールのメニューからいろいろな手順を経てライブラリを組み込む、という操作が正しく実行してもらえる、という期待はあまりできません。
「参照設定」をしなくて良い、ということは、Access の mdb を配るだけで、もともと Access が持っている機能以上のことが提供できるので、トラブルが少ないことが期待できます。
後半、ちょっと分かりにくいかもしれませんが、VBA が分からない人も同じです。
その VBA が組み込まれた .mdb なファイルを使うのは、そういう人たちかもしれないので、動かすために必要な手順は少ないに越したことがない。
それが「参照設定を行わなくて良い」がメリットになるということです。
そうです。たまたまメソッド名が同じなだけで、別物です。
いや、お恥ずかしい。間違えました
.mdbx じゃなくて、.mdb もしくは .accdb です。
ありがとうございます、勉強になりました!