レジストリを使って、バージョンごとの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のところでエラーが発生してしまい、よく分からなくなってしまいました。
どなたか分かる方はご教授お願いします。
そのコードは、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"を編集することも出来てしまいますね)
魔界の仮面弁士さん、レス有り難うございます。
>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インストールパスを修得したいという事です。
私の文章に対して理解しずらい部分があると思いますが、申し訳ありません。
よろしくお願いします。
ツイート | ![]() |