- ベストアンサー
Access2000でオブジェクトが存在するか確認したい
VBAについては初心者です。 Access2000で,あるクエリーが存在すれば削除して,存在しなければ何も実行しないというコードを組むことは出来るのでしょうか? 具体的には, 数百名いるユーザーに対して新しいクエリーを追加したいのです。 ユーザーがフォームであるボタンを押すとサーバーからクエリーをインポートするところまではうまくいくのですが,既に1度追加したユーザーが再度そのボタンを押すたびに,別名(クエリー名1・・・)が作成されてしまいます。マクロの条件式で判断できれば一番よいのですが,それらしいものは見つかりません。 どうぞよろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
私はマクロが苦手なので、VBA(しかも使っているのが Access97 なので、DAOを利用)になってしまいますが、お許しください。 For Each...Next ステートメント を使うのが、一番すっきりした方法ではないでしょうか?(まず、For Each...Next のHELPを確認してみてください。) 具体的なコードは、以下のようになります。 ‘dbs をDatabase オブジェクト、qdf を QueryDef オブジェクト変数として宣言 Dim dbs As Database, qdf As QueryDef ‘カレント データベースへの参照を取得 Set dbs = CurrentDb ‘QueryDefs コレクションを更新 dbs.QueryDefs.Refresh ‘QueryDefs コレクションの各 QueryDef オブジェクトに対してループ For Each qdf in dbs.QueryDefs ‘もし QueryDefs コレクションの中に「クエリー名」というクエリーがあれば、次の行を実行 If qdf.Name = “クエリー名” Then ‘上記の名前のクエリーを削除 dbs.QueryDefs.Delete qdf.Name End If Next qdf HELPで、QueryDef オブジェクト、QueryDefs コレクションの使用例 (Microsoft Access) を確認してみてください。 なお、DAOを使いますので、VBAのモジュールウィンドウを開いた状態で、ツール→参照設定で、 Microsoft DAO *.*(Access2000 だと 3.6 かな?) Object Library にチェックが入っていることを確認しておいてください。 なにか疑問等ありましたら、補足でコメントをお願いします。 (土日は不在ですので、再回答が必要な場合お答えが遅れてしまうかもしれませんことをあらかじめご了承ください。)
その他の回答 (3)
- yoisho
- ベストアンサー率64% (331/516)
別の方法を考えましたので、またお邪魔します。 On Error Resume Next DoCmd.DeleteObject acQuery, "クエリー名" これだけでOKです。(参照設定も不要です。) On Error~は、削除しようとした名前のクエリーが無かっ た場合にも、エラーメッセージを出さないための記述で す。 (ということで、マクロではエラー処理ができないんで、 やはりどうしてもVBAになってしまいます。) 「これで済むんだったら、難しいことごちゃごちゃ提案す る前に初めから言えよ!」って・・・どうもスミマセン (^ ^; ただし、これをその他の処理(例えばクエリーのインポー トとか)をするプロシージャの中に記述した場合、もし別 のエラーが発生してもエラーを無視して処理が進んでしま いますので、注意が必要です。 (実はこれが面倒なんで、私は DeleteObject メソッド ではなくDAOの Delete メソッド を普段使っているもん で、つい小難しい提案をしちゃったんですね。・・・苦し い言い訳) 他のエラーと分けるエラー処理の方法とか、あるいはその 他疑問などがありましたら、また質問を出してください。 (MSアプリケーション カテゴリーの Access がらみの質 問は、できるだけチェックするようにしてますので、たぶ ん回答させていただけると思います。)
- yoisho
- ベストアンサー率64% (331/516)
すいません、早とちりしてました。 「数百名いらっしゃるユーザーさんに対して、それぞれのマシンについて」ということですね。 (さて Access2000 の場合、標準インストールだと DAO の参照設定はどうだったかな?) 確実に参照設定を行うなら、AutoExec マクロで Access を起動するときに以下のプロシージャ(標準モジュールに記述してください。)を実行させて、VBAで設定してしまうのはいかがでしょうか? Public Function funcBeforeStart() On Error GoTo Err_funcBeforeStart Dim strDAO36 As String, ref As Reference strDAO36 = "C:\Program Files\Common Files\Microsoft Shared\DAO\dao360.dll" Set ref = References.AddFromFile(strDAO36) Exit Function Err_funcBeforeStart: ‘すでに参照設定済の時にさらに設定した場合のエラー(エラーナンバー32813)処理 If Err.Number = 32813 Then Exit Function Else MsgBox Err.Description End If End Function また、(私は ADO のことはよくわからないので自信なしで、もしかしたらこのままでもいいのかもしれませんが、)安全を見て、前回お示ししたコードの1行目を Dim dbs As DAO.Database, qdf As DAO.QueryDef と直しておいてください。
お礼
DAOの参照設定のチェックは外れていましたので,DAO3.6をチェックして動きました。 今回のyoishoさんにコード難しいのでお手上げです。 こんなに細かく書いて頂いて本当に申し訳ないのですが,数百台のPCの環境を考えると厳しいので別の方法を考えます。 でもとても勉強になりましたし,このテクニックを別の機会で使用したいと思っています。 どうもありがとうございました。
- yoisho
- ベストアンサー率64% (331/516)
>ユーザーに「ツール→参照設定で、Object Library にチェックする」という部分をさせないといけないのですね。 いえいえ、そうではなくて、そのマシンで一度設定しておけばそれでOKです。 (Acsessを再インストールしたりした場合は、再度確認が必要です。)
補足
早速にありがとうございます。 教えていただいた通りに実行しましたら,問題なく動きました。 ただ,ユーザーに「ツール→参照設定で、 Microsoft DAO *.*(Access2000 だと 3.6 かな?) Object Library にチェックする」という部分をさせないといけないのですね。 難しい問題です。