• ベストアンサー

ACCESS2007でのDAO(?)につきまして

お世話になっております。 ACCESSの件で色々教えて頂き、とても感謝しております。 つきましては、ACCESS2007で疑問に思える点がありましたので 以下に記述いたします。 あるACCESS2007のVBAの記述で Dim myDB As Database Dim myQueryDef As QueryDef なる変数定義がされているのを見たのですが 質問があります <質問1> 上記の定義はDAOを使用しているという事になるのでしょうか? <質問2> DAOであるならば Dim myDB As DAO.Database Dim myQueryDef As DAO.QueryDef と記述するのが正しいのではないでしょうか? (Option Explicitは記述してあります) 私には謝った記述に見えるのですが、動作 している理由がわかりません。 質問が変かもしれませんが、どなたか教えて 頂けるありがたいです。

質問者が選んだベストアンサー

  • ベストアンサー
  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.1

> 上記の定義はDAOを使用しているという事になるのでしょうか? 参照設定されている項目や、その優先順によるかと思いますが、他に 同名のオブジェクト等をもつものがなければ、「DAOを使用」との判断で よいかと思います。 (外部DLLや自身で作成したMDBなどを新たに参照設定に追加して、  そこでも「Database」や「QueryDef」という名前のオブジェクトなどが  宣言されていれば、DAOとどちらが優先順が高いかによって、  どちらが使用されているかは変わる、と) なお、Access2003までのDAOに対し、Access2007のそれはバージョンが 上がっているとのことです: http://isawseashell.blogspot.com/2007/02/attachment-dao-access2007-dao-dao-3.html > Dim myDB As DAO.Database > Dim myQueryDef As DAO.QueryDef > と記述するのが正しいのではないでしょうか? 参照設定されているライブラリ内で、同名のオブジェクト等がある場合、 ご質問のように「DAO.~」と明示することが【推奨】されると思います。 (加えて、(他人に見せる際などの)コードの読みやすさの観点からも) 例えば、DAOとADOの双方に参照設定がある状態で、単に 「Dim objRS As Recordset」と宣言した場合、参照設定で DAOとADOのどちらがより上位になっているかによって、 「DAO.Recordset」と「ADODB.Recordset」のどちらとして扱われるかが 変わってしまうことになります。 (結果として、DAOのつもりで「objRS.Edit」と記述した箇所が、何かの  拍子でADOの方が参照設定の優先順が上げられた場合、  ADODBにはEditメソッドはありませんので、「メソッド又はデータ メンバ  が見つかりません」というエラーも発生し得る、と) ただ、逆に、同名のオブジェクト等が存在しなければ(→今回のご質問で 挙げられているQueryDefなど)、上位オブジェクトの宣言はなくても動作は しますので、上位オブジェクトまでつけて宣言しないことを、誤りということ まではできないように思います。 (例えば、DoCmdオブジェクトは厳密にはAccessの配下にありますので、  同じ理屈でいくとこれは「Access.DoCmd.OpenForm」として  呼び出さなければ、ということになってしまうのではないでしょうか)

gamera2950
質問者

お礼

うおーー とてつもなくよく理解できました。 ADOは「ADODB.Recordset」 があること理解できただけでも感謝です。 参照設定での以降この辺もちゃんと記述したいと考えております。 ありがとうございました。

その他の回答 (1)

  • iryuza
  • ベストアンサー率57% (16/28)
回答No.2

VBAを動作させる環境が手元に無いので確認が取れないのですが、VB6や.net以降では、名前空間を事前に宣言できるImportsステートメントという物があります。 そこで、DAOを宣言されているのだと思います。 その場合、 Dim myDB As DAO.Database を Dim myDB As Database と書くことができるようになります。 Importsステートメントのい使用は、プログラムの先頭に宣言する必要があります。 プログラムの先頭(ソースコードの先頭行付近)に 「Imports DAO」の宣言があると思われます。

gamera2950
質問者

お礼

早々の御回答ありがとうございます Importsステートメント なるものがあるのですね チェックしていみます ありがとうございます

関連するQ&A

  • AccessでのSQL文

    AccessでSQL文を使おうと思うのですが、 Dim mydb as Database とすると、ユーザ定義型は定義されていません とエラーになります。 また、mydb as と打つと変数の方の一覧が出ますがその中にもDataBaseがありません。 サンプルの家計簿を開いてみるとSQL文を使っているのにエラーは出ません。 ヘルプを見てみるとDAOが関係しているようなのですが良くわかりません。 AccessでDatabase型を使うにはどうすればいいのでしょう。 教えてください。 Access2000です。

  • アクセス2000VBA DAOをADOに書き換えてください

    アクセス2000VBA DAOをADOに書き換えてください 下記プログラムをADOに書き換えてください。(DAT1、DAT2はモジュールにて定義してあります) Option Compare Database Dim DBS As Database Dim QDF As QueryDef Dim RST As DAO.Recordset Dim COUNT1 Private Sub Form_Load() On Error Resume Next DAT2 = [Forms]![伝票]![HAKKOU1] Set DBS = CurrentDb Set QDF = DBS.QueryDefs("発行") With QDF .Parameters("DAT1") = DAT2 ’もしかしたら DAT2 ではエラーがでるかもしれません。 Set RST = .OpenRecordset() ’正しい記述を教えてください .Close End With With RST COUNT1 = !指示書 .Close End With

  • エクセルからアクセスへ

    お世話になります。 エクセルからVBAでアクセスのテーブルに レコードを追加させたいのですが、 下記の記述でいきなり mydb as database の所が 青く塗られ 「コンパイルエラー:ユーザー定義型は定義されていません」 とエラーになってしまします。 また、databaseのdが小文字なのも気になります。 参照設定での項目チェックが必要なんだと思うのですが どこにチェックしたら良いのか、またそれだけではダメなのか 分かりません。 どなたかご教授下さい。     記 Dim mydb As database Dim myrs As Recordset Dim myrnge As Range Dim myrow As Long

  • アクセス97のVBAが2000で使えません。

    ACCESS97で問題なく動いていたVBAなのですが、ACCESS2000では「ユーザー定義型は定義されていません。」というエラーとなって動きません。 ソースで言うと、 Dim DB As Database というような変数宣言の部分でいきなり出てきます。 Database型がユーザー定義型と認識されているようですが、何故こうなってしまうのでしょう? またどのようにすればこの問題を解消できるでしょうか? また97と2000でのコーディング上の変更点などは、どこで調べるのが分り易いでしょうか?

  • Access2000のVBAでコンパイルエラー

    Access2000のVBAで初歩的な質問があります。 「tblShi」というテーブルがあります。 フォームにボタン「btn1」を作り、 デザインビューでボタンのプロパティを開いて イベントのクリック時のところで、 「ビルダの選択」をコードビルダにしました。 そして「Private Sub btn1_Click()」の中に、最初に   Dim db As Database という記述をしています。 このフォームを開いてボタンを押すと、なぜか   コンパイルエラー   ユーザ定義型は定義されていません というエラーが表示されてしまいます。 たしかにコードを書いているときに、   Dim db As のところまで入れると、小さいウィンドウの中に たくさん候補が表されますが、 その中に「Database」というのがないです。 「QueryDef」とか「Workspace」とかもありませんでした。 (「Recordset」はありまして、それはコンパイルが通ります) いろいろな解説を見ても、やはり最初はどれも 「Database」型を宣言しているようなんですが… 何がよくないのでしょうか。 もしわかる方がいらっしゃったら教えてください。

  • DAOでフィールドの値を変更する

    MDBファイルにDAOでアクセスし、フィールド(今回の場合Fields(4))の値をTextBox内の値に変更する方法がわかりません。 Dim WS As DAO.Workspace Dim DB As DAO.Database Dim RS As DAO.Recordset 'レコードを特定する処理 RS.Fields(4).Value = TextBox.Text RS.Update どのように直せばいいのでしょうか??

  • VB2008からAccess2007へのDAO接続でエラーになります。

    VB2008からAccess2007へのDAO接続でエラーになります。 VB2008EEからDAO3.6を利用し、Access2007(*.accdb)に接続しようとしていますが、 エラーが発生してしまい、接続できません。 エラーの内容は下記のとおりです。 実行時エラー '3343': データベースの形式 'XXX' を認識できません。 Access2000のデータベース(*.mdb)には普通に接続できています。 Accessのバージョンを問わずに接続したい場合、どうすればよいのでしょうか? 参考までに現在のコードを記載しておきます。 ※DAO3.6に参照設定してあります。 Imports dao Module modConnectDb Public Function DaoConnect(ByVal strDb As String) As Boolean 'strDb:データベースのファイルパス Dim Ws As dao.Workspace Dim DbE As dao.DBEngine Dim Db As dao.Database Dim strMsg As String Try DbE = New dao.DBEngine Ws = DbE.Workspaces(0) Db = Ws.OpenDatabase(strDb) Catch ex As Exception strMsg = "エラー番号 " & Str(Err.Number) & vbCrLf & _ Err.Source & " でエラーが発生しました。" & vbCrLf & Err.Description MsgBox(strMsg, vbExclamation, "エラー") End Try End Function End Module

  • DAOでODBC経由のRDBに接続し、SQLでアクセスしたい。

    Dim ws As DAO.Workspace, db As DAO.Database Dim rs As DAO.Recordset ' デフォルトのワークスペースを定義する Set ws = DBEngine.Workspaces(0) ' ODBC接続文字列を指定してデータベースを開く Set db = ws.OpenDatabase("", False, False, _ "DSN=SQL_K;ODBC;Driver={SQK_K};" & _ "SERVER=(local);DATABASE=pubs;" & _ "UID=*****;PWD=*****;" ' SQLステートメントを指定してレコードセットを作成する Set rs = db.OpenRecordset("select * from TWSQLK1",dbOpenDynaset, dbSeeChanges)   このレコードセットは正常に行きますが   直接SQLを記述する方法が、わかりません   

  • DAOでテーブルの内容を検索したいのですが…

    DAOでテーブルの内容を検索したいのですが… アクセス初心者です。 フォームで取得した値をテーブルで検索して命令するために,次のようなことをしてみましたが,FindFirstのところでエラーがでます。 どうしたらよいのかご指導ください。 コマンドボタンのイベントプロシージャで Private Sub テストテーブル作成_Click() Dim gakki As Integer Dim test As Integer Me.学期 = gakki Me.テスト = test Call testテーブル作成 End Sub として,標準モジュールに Sub testテーブル作成() Dim myDB As DAO.Database Dim myRS As DAO.Recordset Set myDB = CurrentDb Set myRS = myDB.OpenRecordset("T_生徒テスト") myRS.FindFirst "学期ID=" & "" & "gakki" & "" & "AND テストID =" & "" & "test" & "" If myRS.NoMatch = False Then DoCmd.OpenQuery "Q_TSテストA" DoCmd.OpenForm "F_テスト" DoCmd.Close Else DoCmd.OpenQuery "Q_TSテスト" DoCmd.OpenQuery "Q_テスト" DoCmd.Close DoCmd.OpenForm "F_テスト" End If myRS.Close: Set myRS = Nothing myDB.Close: Set myDB = Nothing End Sub としました。よろしくお願いします。

  • access2002 DAOのデータ読込投入

    今access2002のアプリケーションを作っています。 そのデータをエクセルから、テーブルにインポートする作業を仕様としています。 今考えているのは、EXCELのデータを、 ほぼそのままテーブルAとしてインポートし、 そのテーブルを読み込んで編集&項目追加をして、 テーブルBに書き込みます。 その際、のコーディングは、 Private Sub sample_click() DIM dbDAO AS DAO.DATABASE DIM rsDAO AS DAO.RRECORDSET DIM rsDAO2 AS DAO.RRECORDSET set rsDAO = dbDAO.OPENrecordset("テーブルA",dbOpenTable) Do Until rsDAO.EOF = true rsDAO2.AddNew rsDAO2.項目B1 = rsDAO.項目A1+変数A1 rsDAO2.項目B2 = rsDAO.項目A2*変数A2 rsDAO2.項目B3 = rsDAO.項目A3/変数A3 rsDAO2.項目B4 = rsDAO.項目A4-変数A4 rsDAO2.Update rsDAO.MoveNext loop rsDAO.Close: Set rsDAO = Nothin rsDAO2.Close: Set rsDAO2 = Nothin End Sub 上記のように記述すると、テーブルAの全レコードを、 すべて自動編集し、テーブルBに追加できますでしょうか? やりたいことは単純なのですが、クエリーでも僕のレベルでは、 うまくできそうにないので、質問させていただきました。 どうかよろしくお願いします。