Excel VBA DAOでデータ取得する方法

このQ&Aのポイント
  • Excel VBAを使用してDAOを利用してデータを取得する方法について説明します。
  • DAOライブラリのバージョンによって、「DAO.DBEngine36」の部分を変更することで、PCにインストールされているDAOのバージョンに合わせた設定が可能です。
  • 「■DBを開く」の部分でCreateObject内で宣言しているDAO.DBEngine36の部分を変更することで、PCのDAOライブラリのバージョンに合わせた設定ができます。
回答を見る
  • ベストアンサー

Excel VBA DAO について

いつもお世話になっております。 現在Excel2007でマクロを組みました。 下記ソースのような形で、マクロを実行するブック内にあるシートから、データを取得するのですが・・・・ ~ソース例~ dim dbEngine as object Dim db as object Dim rs as object Dim sql as object '■SQL格納 sql = sql & "Select 社員名 " sql = sql & " ,Sum(月収) as 年収 " sql = sql & " From 月収一覧 " sql = sql & "Group By 社員名,月収; " '■DBを開く Set dbEngine = CreateObject("DAO.DBEngine36") Set db = dbEngine.OpenDatabase("C:\社員月収.xls", False, False, "Excel8.0;") '■SQL実行後レコードセットへ格納 Set rs = db.Openrecordset(sql) としていますが「■DBを開く」の部分でCreateObject内で宣言している”DAO.DBEngine36”の部分をそのPCのDAOライブラリのバージョンによって変更したいのですが、可能なのでしょうか?? 以上です><よろしくお願いいたします!!

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

  • ベストアンサー
  • DOUGLAS_
  • ベストアンサー率74% (397/534)
回答No.1

'一例) Dim dbEngine As Object Dim dllver As String dllver = Mid(Dir("C:\Program Files\Common Files\Microsoft Shared\DAO\Dao3*.dll"), 5, 1) If dllver = "" Then  MsgBox "Dao360.dll を インストール してください" Else  Set dbEngine = CreateObject("DAO.DBEngine.3" & dllver)  MsgBox "DAO " & dbEngine.Version End If

liberty01
質問者

お礼

回答ありがとうございました。 参考になりました^^ でも、どんなDAOでも変更できるようにして、インストール不要にしたかったので、DAOライブラリをしようするやり方は今回諦めました。

関連するQ&A

  • Excel VBA DAO バージョン 一覧

    いつもお世話になっております。 現在Excel2007でマクロを組みました。 下記ソースのような形で、マクロを実行するブック内にあるシートから、データを取得するのですが・・・・ ~ソース例~ dim dbEngine as object Dim db as object Dim rs as object Dim sql as object '■SQL格納 sql = sql & "Select 社員名 " sql = sql & " ,Sum(月収) as 年収 " sql = sql & " From 月収一覧 " sql = sql & "Group By 社員名,月収; " '■DBを開く Set dbEngine = CreateObject("DAO.DBEngine36") Set db = dbEngine.OpenDatabase("C:\社員月収.xls", False, False, "Excel8.0;") '■SQL実行後レコードセットへ格納 Set rs = db.Openrecordset(sql) としていますが「■DBを開く」の部分でCreateObject内で宣言している”DAO.DBEngine36”の部分がありますが、バージョンによって表記が違うかと思います。そこで、バージョンによる表記のしかたの一覧がほしいのです・・・・ <例> Microsoft DAO 2.5/3.0 Compatibility Microsoft DAO 3.0 Object Library Microsoft DAO 3.5 Object Library Microsoft DAO 3.6 Object Library → "DBEngine36" 以上です><よろしくお願いいたします!!

  • DAO エクセルvbaからアクセスのレコードの件数

    DAOで、エクセルvbaからアクセスのレコードの件数を取得したいのですが Dim ac As Object Dim db As DAO.Database Dim rs As DAO.Recordset Set ac = CreateObject("Access.Application") Set db = ac.DBEngine.OpenDatabase("D:\あああ.accdb", False, True) Set rs = db.OpenRecordset("SELECT * FROM Tマスタ WHERE masterkey like '*四*';") i = rs.RecordCount Debug.Print rs("masterkey") rs.Close: Set rs = Nothing db.Close: Set db = Nothing ac.Quit: Set ac = Nothing をすると、抽出するレコードが1000件でも、必ず1が返ります。 masterkeyフィールドは文字列型です。 なぜ実際はたくさんのレコードがあるのに、1が返るのでしょうか?

  • 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 フィルターをかけたい エクセルです

    昨日も http://oshiete.coneco.net/qa8283354.html で質問し、nicotinism様にご回答いただいたのですが またわからなくなったので教えてください。 エクセルからアクセスでDAOで接続した時に、 フィルタをかけて該当のレコードの他のフィールドの値を返すにはどうすればいいでしょうか? ------------------------- Sub test() Dim ac As Object Dim db As DAO.database Dim DAOrs As DAO.Recordset Set ac = CreateObject("Access.Application") Set db = ac.DBEngine.OpenDatabase("PW.accdb", False, True, ";pwd=0000") Set DAOrs = db.OpenRecordset("select * from TPW") DAOrs.Filter = "サイト名 = " & "'nanaco'" MsgBox DAOrs("Password") DAOrs.Close: Set DAOrs = Nothing db.Close: Set db = Nothing ac.Quit: Set ac = Nothing End Sub ------------------------- これだとエラーにもならないけどフィルタがかかってない為、全然関係ないレコードの値を取得してしまいます。 再度ご回答いただければ助かります。 ご教授よろしくお願いします。

  • 初歩的なSQLですが・・・

    私の環境はOS:Xp      ACCESS2000です。 宜しくお願いします 今AccessVBAで作業をしているのですが、 Dim ws As DAO.Workspace Dim DB As DAO.Database Dim rs As DAO.Recordset Dim sql As String Set ws = DBEngine.Workspaces(0) Set DB = ws.Databases(0) sql = "select MAX(銀行コード) from 銀行テーブル ;" Set rs = DB.OpenRecordset(sql) Me.合計 = rs このSQL文で銀行テーブルに入っている銀行コードの最大値を取得したいのですが、取得した後どのように記述したら「rs」から値を引っ張り出せるのでしょうか? 宜しくお願いします。

  • DAOでデータベースを二つ開くには?

    環境 Windows2000 VB6 DAOで同じデータベースを開くためのやり方がわかりません。 下記のようにマスタのキーを使用して他のテーブルの 内容を更新したいのですが よろしくお願いします。m(__)m Dim ws As Workspace Dim db As Database Dim qd As QueryDef Dim rs As Recordset Dim STRSQL As String dim strsql2 as string Set ws = DBEngine.Workspaces(0) Set db = ws.Databases(0) STRSQL = "SELECT KEY FROM マスタ" Set qd = db.CreateQueryDef("", STRSQL) Set rs = qd.OpenRecordset() Do While Not rs.EOF strsql2 = "Update data from マスタ where key = " & rs!key ???? rs.MoveNext Loop rs.Close qd.Close db.Close

  • ACCESS VBAからDAOを使ってのExcelファイル読み込みについて

    以前もお世話になりました。またよろしくお願いできますでしょうか。(OS: XP , Access 2003) 今回はACCESS VBA からDAOを使ってのExcelファイルの読み込みを試みています。 最初はTransferSpreadsheetを使ってうまく行っている様に見えたのですが、Quit及びSet XLApp=Nothingをちゃんとしていても、タスクマネージャーを開けると裏でEXCELが走っている状態でした。 他サイトで同じ現象の解決でAddNewが提案されており、そのサイトの例と他のDAOを使っている例を自分用にアレンジしてみました。 (他サイトのURL張っていいのかわからないので外しておきます) エラー1)Import元のファイルを開けていないと"External table is not in the expected format" でOpenDatabaseの行で止まります。これは仕様でしょうか?わざわざ Excel.Applicationなどで開けないと行けないということですか? エラー2)"Run-time error 1004. Method 'Range' of object '_Global' failed"。ファイルを開けて実行した場合Rangeの所で止まります。Public subにしたりしましたが関係なかったようです。 申し訳ありませんが、アドバイスお願い致します。 ------- Sub loadToDB() Dim rs, rs2 As DAO.Recordset Dim db As DAO.Database Dim SheetName As String Set db = OpenDatabase("U:\projects\ABC\TestFile.xls", False, False, "Excel 8.0;")   ’ファイルを開けていないとまずここで SheetName = db.TableDefs(0).Name Set rs = db.OpenRecordset(SheetName) Set rs2 = CurrentDb.OpenRecordset("TableA") Do Until rs.EOF rs2.AddNew rs!F1 = Range("A1").Value   ’ファイル開けているとここで駄目です rs!F2 = Range("B1").Value rs!F3 = Range("C1").Value rs!F4 = Range("D1").Value rs2.Update rs.MoveNext Loop rs.Close Set rs = Nothing db.Close Set db = Nothing rs2.Close Set rs2 = Nothing End Sub

  • 【Access VBAからExcelを閉じたい】

    【Access VBAからExcelを閉じたい】 以下のコマンドを書いて、 クエリ結果をExcelに貼りつけました。 ですが、Excelを保存して閉じることができず、、、。 (自動起動・終了を目的としています) 具体的には、 objApp.Save を実行すると、 『この場所に"RESUME.XLW"という名前のファイルが既にあります。置き換えますか?』 とメッセージボックスが出てきます。 何もメッセージを出さずに、上書き保存→Excelを閉じるには、どのように書けばよろしいでしょうか? 以下ソース - - - - - - - - - - - - - - - - Private Sub XLS_Paste_1() On Error GoTo Err_XLS_Paste_1 Dim DB As DAO.Database Dim RS As DAO.Recordset Dim objApp As Object Dim ExeName As String Dim SheetName As String ExeName = "\\FileServer01\Share\Excel_Base.xls" SheetName = "Report" Set DB = CurrentDb Set RS = DB.OpenRecordset("qry_sel_DAILY_DATA") On Error Resume Next Set objApp = CreateObject("Excel.Application") '変数にExcelオブジェクトを格納 objApp.Visible = True 'Excelを画面に表示させる With OBJEXE objApp.Workbooks.Open (ExeName) With objApp.Sheets(SheetName) .Range("B53:G83").ClearContents '転記エリアのクリア .Cells(53, 2).CopyFromRecordset RS 'B53基準で出力 End With objApp.Visible = True objApp.Save objApp.Quit Set objApp = Nothing Set RS = Nothing Set DB = Nothing Set OBJEXE = Nothing Exit Sub End With Exit_XLS_Paste_1: Exit Sub Err_XLS_Paste_1: MsgBox Err.Description Resume Exit_XLS_Paste_1 End Sub

  • 【Access VBA クエリ結果をExcelに貼り付けたい】

    【Access VBA クエリ結果をExcelに貼り付けたい】 以下のコマンドを書いて、 クエリ結果をExcelに貼りつけました。 この記述ですと、クエリのヘッダー部が貼りつけされません。 ヘッダー部も合わせて貼りつけるには、どのように記述すればよろしいでしょうか? 以下ソース - - - - - - - - - - - - - - - - Private Sub XLS_Paste_1() On Error GoTo Err_XLS_Paste_1 Dim DB As DAO.Database Dim RS As DAO.Recordset Dim objApp As Object Dim ExeName As String Dim SheetName As String ExeName = "\\FileServer01\Share\Excel_Base.xls" SheetName = "Report" Set DB = CurrentDb Set RS = DB.OpenRecordset("qry_sel_DAILY_DATA") On Error Resume Next Set objApp = CreateObject("Excel.Application") '変数にExcelオブジェクトを格納 objApp.Visible = True 'Excelを画面に表示させる With OBJEXE objApp.Workbooks.Open (ExeName) With objApp.Sheets(SheetName) .Range("B53:G83").ClearContents '転記エリアのクリア .Cells(53, 2).CopyFromRecordset RS 'B53基準で出力 End With objApp.Visible = True objApp.DisplayAlerts = False objApp.Save objApp.DisplayAlerts = True objApp.Quit Set objApp = Nothing Set RS = Nothing Set DB = Nothing Set OBJEXE = Nothing Exit Sub End With Exit_XLS_Paste_1: Exit Sub Err_XLS_Paste_1: MsgBox Err.Description Resume Exit_XLS_Paste_1 End Sub

  • Accessで、DAOでAddnew

    参照はDAOで、Addnewでデータの追加をしたいのですが、記述が悪いのか、上手くできません。 どなたか、教えて下さい! テーブル:スケジュールソース フィールド:日付 Private Cur_Db As DAO.Connection Private rs As DAO.Recordset Private sql As String Dim str_date As String str_date = Me!日付 Set Cur_Db = CurrentDb rs.Open "スケジュールソース", Cur_Db, dOpenKeyset, adLockOptimistic rs.AddNew rs("日付").Value = str_date rs.Update

専門家に質問してみよう