レジストリの値を使ってインストール先を取得するには?


YKK  2004-12-30 21:40:02  No: 87628

レジストリを使って、バージョンごとのMS-Accessのインストール先を取得したいのですが、Googleで検索した所、
------------------------------------------------------------
Dim db As Database

Set db = workspaces(0).opendatabase("c:\xxx\yyy.mdb")
Select Case dbs.Version
  Case "3.0"
    HKEY_CLASSES_ROOT\Access.Application.7\shell\Open\command
    から、パス取得

  Case "3.5"
    HKEY_CLASSES_ROOT\Access.Application.8\shell\Open\command
    から、パス取得

  Case "4.0"
    HKEY_CLASSES_ROOT\Access.Application.9\shell\Open\command
    から、パス取得
End Select
------------------------------------------------------------
と書かれていました。そこでコードに書いて、実行してみるとset dbのところでエラーが発生してしまい、よく分からなくなってしまいました。
どなたか分かる方はご教授お願いします。


魔界の仮面弁士  2004-12-31 01:16:07  No: 87629

そのコードは、DAOのコードですね。(DAOを参照設定して使う方法)
DAOは、どのバージョンをお使いですか?

"DAO 3.6"は、Jet 4.0以下の殆どのmdbを操作できますが、
"DAO 3.5x"は、Jet 3.52以下のmdbしか操作できませんので、
操作対象のmdbファイルとDAOのバージョンの不一致に注意してください。

> Set db = workspaces(0).opendatabase("c:\xxx\yyy.mdb")
> Select Case dbs.Version
上記の「dbs」という変数は、「db」という変数とは別物という事ですか?

---
で、ちょっと確認。

まず、知りたい情報というのは、「Accessのインストール先」との事ですが、
実際には、ひとつのOSに複数のAccess(たとえば、2.0と97と2002)を混在して
インストールさせる事も可能なわけです。そのような環境の場合、いったい、
どのバージョンのAccessの情報が返されれば良いのでしょうか?

もし、「指定されたmdbを開くことができるAccessのバージョン」という
判断であるとしても、各バージョンには、ある程度の下位互換性が
持たされていますので、そのmdbを、(Access 2000,2002,2003などの)
複数のバージョンで開ける場合もありえますよね。

それから、お使いのコードでは、(Accessではなく)DAOを使って mdb を開いて
操作しておられるようですが、そもそも
・Microsoft Accessのバージョン
・Database Engineである「Jet」のバージョン
・DAO (Data Access Object) のバージョン
これらの違いについて、それぞれ明確に把握されていますでしょうか。
(先のコードが、「どれのバージョン」を返すのかを理解しておられますか?)

# バージョン比較に関する参考資料
http://support.microsoft.com/kb/239114/JA/
http://support.microsoft.com/kb/172733/JA/
http://support.microsoft.com/kb/141796/JA/

そもそも、あのコードで使われている Versionプロパティ から返される
値というのは、mdbファイル自身のJetバージョンを返すものであって、
お使いの Access のバージョンとは、「直接的には」関係ありません。

もし、mdbファイルの内容から、「作成元のAccessのバージョン」を知りたい場合は、
以下のように "AccessVersion" というダイナミックプロパティを参照する方法が
ありますので、こちらを利用してみてください。
http://www.ruriplus.com/msaccess/tch/tch_041.html

ただし、「Access以外で作成されたmdbファイル」…すなわち、DAOやJROなどを用いて
ExcelやVBなどから生成されたmdbでは、そもそも、"AccessVersion"プロパティが
存在していない事になりますので、その点には注意してください。

それから、"AccessVersion"に登録されているのは、あくまでも
「そのmdbを作成したAccessのバージョン」という事であって、
「インストールされているAccessのバージョン」ではありません。
ですから、mdbを作成したPCと、そのmdbを開くPCが別物であれば、ここから
Accessのインストールパスを導き出すという行為は、意味が無いかもしれません。
(DAOを使えば、mdb内の "AccessVersion"を編集することも出来てしまいますね)


YKK  2004-12-31 04:25:11  No: 87630

魔界の仮面弁士さん、レス有り難うございます。

>DAOは、どのバージョンをお使いですか?
Microsoft DAO 3.6 Object Libraryを使用しています。

>上記の「dbs」という変数は、「db」という変数とは別物という事ですか?
下記のサイトのコードをコピーしたのでよく分からないのです。すいません。
詳しくはそのサイトに行くと分かると思います。
http://search.acty-net.ne.jp/vb_search/archive/2001-1/msg00834.html

>まず、知りたい情報というのは、「Accessのインストール先」との事ですが、
>実際には、ひとつのOSに複数のAccess(たとえば、2.0と97と2002)を混在して
>インストールさせる事も可能なわけです。そのような環境の場合、いったい、
>どのバージョンのAccessの情報が返されれば良いのでしょうか?
私の知り合いのAccessプログラマーのメインマシンの環境には、Microsoft  Access 97/2000/2002/2003のすべてのバージョンがインストールされています。すべてがデフォルト設定でインストールされているのではなく、単体インストールの場合とOffice統合インストールの場合があるのです。なのですべてのバージョン(97/2000/2002/2003のみ)のAccessのインストール先の情報が返されれば良いというわけです。

>もし、「指定されたmdbを開くことができるAccessのバージョン」という
>判断であるとしても、各バージョンには、ある程度の下位互換性が
>持たされていますので、そのmdbを、(Access 2000,2002,2003などの)
>複数のバージョンで開ける場合もありえますよね。
ええ、そのことに関しては理解しています。しかし、ユーザーの希望するバージョンによって起動したいAccessは違うと思うので、そこは考えを優先したいと思います。

>それから、お使いのコードでは、(Accessではなく)DAOを使って mdb を開いて
>操作しておられるようですが、そもそも
>・Microsoft Accessのバージョン
>・Database Engineである「Jet」のバージョン
>・DAO (Data Access Object) のバージョン
>これらの違いについて、それぞれ明確に把握されていますでしょうか。
>(先のコードが、「どれのバージョン」を返すのかを理解しておられますか?)
大体だと思いますが、正直な所70%しか理解していません。
ほぼ理解した70%はAccessのバージョンについてとjetバージョンです。
理解していない30%はDAOについてです。

>そもそも、あのコードで使われている Versionプロパティ から返される
>値というのは、mdbファイル自身のJetバージョンを返すものであって、
>お使いの Access のバージョンとは、「直接的には」関係ありません。
なるほどそうでしたか、勉強になります。

>もし、mdbファイルの内容から、「作成元のAccessのバージョン」を知りたい場>合は、以下のように "AccessVersion" というダイナミックプロパティを参照す>る方法がありますので、こちらを利用してみてください。
ご親切に有り難うございます。この文章に関してはもうすでにコード理解済みで完成し、テストも成功しております。

>それから、"AccessVersion"に登録されているのは、あくまでも
>「そのmdbを作成したAccessのバージョン」という事であって、
>「インストールされているAccessのバージョン」ではありません。
>ですから、mdbを作成したPCと、そのmdbを開くPCが別物であれば、ここから
>Accessのインストールパスを導き出すという行為は、意味が無いかもしれません。
>(DAOを使えば、mdb内の "AccessVersion"を編集することも出来てしまいます
>ね)
うーん、この文章に関しては私には理解しずらい部分でした。
私の今作っているプログラムは、バージョンを使い分けて仕事をしているAccessプログラマ専用のソフトを作っています。なので無駄ではないと思います。

今、私の知りたいコードは、レジストリの値を使って、個々のAccessインストールパスを修得したいという事です。
私の文章に対して理解しずらい部分があると思いますが、申し訳ありません。
よろしくお願いします。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加