• ベストアンサー

ExcelVBAにて外部データ(*.csv)をSQL文を使って抽出する方法

ARCの回答

  • ARC
  • ベストアンサー率46% (643/1383)
回答No.1

とりあえず後半部分だけにお答えします。 前半部分については、他の方にお任せ(^^; (解答がつかなければ、補足とかで催促してください。) >DAOの場合、レコードセットを定義するのに set DB=DBEngine.OpenDatabase("******")があったり、なかったりする理由がわかりません。 いわゆる「オブジェクト指向」ってやつが関係しています。 まず、OpenRecordsetっていうのは、Databaseオブジェクトに対して、レコードセットを作成せよって命令なのです。 顧客DBと売上DBの二つのデータベースがあるとして、 Dim DB_Kokyaku As DAO.Database 'Database型の変数を宣言する Dim DB_Uriage As DAO.Database Dim RS_Kokyaku As DAO.Recordset 'Recordset型の変数を宣言 Dim RS_Uriage as DAO.Recordset Set DB_Kokyaku = DBEngine.OpenDatabase("顧客DB") Set DB_Uriage = DBEngine.OpenDatabase("売上DB") Set RS_Kokyaku = DB_Kokyaku.OpenRecordset("顧客テーブル") Set RS_Uriage = DB_Uriage.OpenRecordset("売上テーブル") RS_Kokyaku.MoveLast Msgbox "顧客テーブルの件数は" & RS_Kokyaku.RecordCount & "件です。" RS_Uriage.MoveLast Msgbox "売上テーブルの件数は" & RS_Uriage.RecordCount & "件です。" 上記のコードを読めば、Set DB =… の意義がわかっていただけると思います。 でも、一々、Database型の変数を宣言して、Set DB = としてデータベースを開くなんて、メンドクサイですよね。開きたいテーブル/クエリ/SQLは「今使ってるデータベース」の中にあるのに… そこで CurrentDBメソッドの登場。 CurrentDBはAccessに最初から組み込まれている関数で、 「Access ウィンドウで現在開かれているデータベース (Databaseオブジェクト) のオブジェクト変数を返します。」(ヘルプより) つまり、CurrentDB.なんたら とするのは Dim DB As Database Set DB = OpenDatabase("現在Accessで開いているDBの名前") DB.なんたら とするのと同じです。加えて動作も高速ですしね。 ってことで、普段はCurrentDBの方を使っとけばいいんです。 で、現在Accessで開いていないDBを使うときだけ、 Set DB = … としてやればいいと。

hooma
質問者

お礼

毎度お世話になっております。 まだ、試しておりませんが使わせていただきます。

関連するQ&A

  • 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を記述する方法が、わかりません   

  • [ACCESS/VBA]動的にSQL文をテーブルから抽出する方法?

    ボロボロです。知恵が足りずとても困っています。どなたか教えてください。 テーブル「T_SQL」の各レコードに、 クエリのSQL文(フィールド名=「strSQL」)と クエリ名(フィールド名=「QName」)と 通しNo.(フィールド名=「No」) をデータとして入力し、アクション等に応じて、「T_SQL」から 抽出したSQL文を、 マクロの「プロシージャの実行」の プロシージャ名 SetSQL("クエリー1",FindSQL(No)) により クエリ「クエリー1」に代入したいのです。 現在以下の通りに作りました。 'データベース定義 Public db As Database 'レコードセット定義 Public rs As Recordset Public Function SetSQL(QName As String, strSQL As String) CurrentDb.QueryDefs("QName").SQL = strSQL End Function Public Function FindSQL(No As String) Set db = CurrentDb() Set rs = db.OpenRecordset("T_SQL", dbopendynaset) strcriteria = "[No]='" & No & "'" rs.FindFirst strcriteria FindSQL = rs!strSQL rs.Close db.Close End Function これで実行すると、 「コンパイルエラー メソッドまたはデータメンバが 見つかりません」 というエラーメッセージが出ます。 ちょこちょこいろんなところを修正してみても、 このメッセージだけでなく他にもいろんな エラーメッセージが出ます。 冒頭に書いたような機能を可能にするには、 どのように記述すればよいのでしょうか?? ほんとにほんとに困っています。どなたか助けてください。

  • 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ライブラリのバージョンによって変更したいのですが、可能なのでしょうか?? 以上です><よろしくお願いいたします!!

  • 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にてJET経由でのODBC接続とODBCDirect経由でのODBC接続の違いについて

    いつもお世話になっております。 VBにてDAO接続する際にJETとODBCDirectとあると思いますが、この2つの違いはどこで判断するのでしょうか。 以下に自分がODBCDirect接続だと思っているロジックを記述します。 -------------プログラムスタート------- _1 Private Sub Form_Load() _2 _3 Dim Mydb As Database _4 Dim wk_str As String _5 Dim Mydata As Recordset _6 Dim str_sql As String _7 _8 'ODBC接続文字列 _9 wk_str = "ODBC;DSN = DataSoce_Name;" 10 wk_str = wk_str & "UID = User_Name;" 11 wk_str = wk_str & "PWD = PassWord" 12 13 'データベースとの接続 14 Set Mydb = DBEngine.OpenDatabase("DataSoce_Name", False, False, wk_str) 15 'SQL文 16 str_sql = "select name from sample" 17 'SQLの実行 18 Set Mydata = Mydb.OpenRecordset(str_sql, dbOpenDynaset) 19 'SQLの結果 20 MsgBox Mydata.Fields("name").Value 21 'レコードセットのクローズ 22 Mydata.Close 23 'データベースのクローズ 24 Mydb.Close 25 End Sub -------------プログラムエンド------- ●Jet経由の場合 上記プログラム9行目のDSNと14行目のOpenDatabaseの"DataSoce_Name"にmdbのパスを設定している場合。 (OpenDatabaseにmdbのパスのみを設定している場合はローカル接続だと思う。) ●ODBCDirect経由の場合 上記プログラム9行目のDSNと14行目のOpenDatabaseの"DataSoce_Name"にODBCデータソース名を設定している場合。 2つの違いはこのような感じではと思いますが間違いであればご指摘いただけないでしょうか。 また、プログラム自体にも間違いがあればご指摘下さい。

  • ODBCデータソースへの接続方法

    はじめまして。よろしくお願いします。 ODBCを利用して、データベースをアクセスしようと思っています。 書籍等を覗いてみると、OpenDatabaseメソッドを使用して、 OpenRecordsetメソッドでレコードセットを作成する。 とかいてあります。 今回、僕が扱うデータベースは2つ(ODBC接続文字列のDATABASE が2個指定するケース)ありまして、その場合の指定方法が分からず 悩んでいます。もちろん、2つのデータベースをSQLでレコードを作成 します。 どのような指定が必要なのでしょうか? 初心者の質問、また言葉足らずの面もあって申し訳ございませんが、 お気づきの方が居られましたらご教授ください。

  • SELECT文を発行して、ACCESSより取得する方法

    既存のプログラムを元に、 以下のようなソースを作成したのですが、 取得出来ませんでした。 参照設定やパスの設定、SQL文は正しいです。 どこがマズイのでしょうか? アドバイスをお願い致します。 Dim db  As DAO.Database Dim rs  As DAO.Recordset Dim SQL As String 'データベース接続 Set db = OpenDatabase("DBのパス") 'データ検索SQL SQL = "" SQL = " SELECT文 " 'ACCESSより取得 Set rs = db.OpenRecordset(SQL) db.Close rs.Close

  • DAOのExcelVBAにてAccessのデータを更新したい

    ExcelVBAよりAccessデータの追記は、AddNewを使用してできたのですが、単純な更新ができません。 strWhere = "Select * From 集計テーブル Where [フィールド1]='001'" Set dbWS = DBEngine.Workspaces(0) Set dbWB = dbWS.OpenDatabase("C:\対象MDB.mdb) 'データベースを呼び出す Set dbRes = dbWB.OpenRecordset(strWhere, dbOpenDynaset) 上記はそもそも更新ステートメントがありません。どのように書けばよいのでしょうか?どうかアドバイスお願いします。

  • DAOでのOpenRecordsetの方法

    SQLServerのDBをDAOを使って更新しようとしていますが、方法がわからず困っています。 ------------------- private Cn as DAO.Database private function fnc1() as integer Dim ws As DAO.Workspace Dim rcdst1 As DAO.Recordset dim strCnct As String dim strSQL As String strCnct = "ODBC;Driver={SQL Server};SERVER=" & g_strSVName & ";DATABASE=" & g_strDBName & ";UID=" & strpUserID & ";PWD=" & strpPassword & ";" 'DB接続 Set Cn = ws.OpenDatabase("", False, False, strCnct) strSQL = "SELECT * FROM Table1" Set rcdst1 = Cn.OpenRecordset(strSQL, dbOpenDynaset, dbDenyWrite, dbOptimistic) ------------------------------------- このOpenRecordsetで ODBC--すべてのレコードをロックできません。(3254) のエラーが出ます。 また、OpenRecordsetを Set rcdst1 = Cn.OpenRecordset(strSQL, dbOpenDynaset) とすると rcdst1.Edit で データベースまたはオブジェクトは読み取り専用なので、更新できません。 のエラーが出ます。 どうしたらいいでしょうか。

  • Access2000VBAにてDAOでカレントにあるテーブルの内容をSQLで抽出して別のテーブルを作成する方法

    こんにちは Access2000VBA初心者です。 現在開いているデーターベースで、フォーム上から抽出条件を入力してそれをSQLに渡し、定義させているテーブルから抽出して新しいテーブルを作成する記述がわかりません。 DAOでできそうなのですが、VBA教本を読んでいるとDebug.printで抽出結果を表示して終わっているのでそれ以上のことが書いてありません。 やりたいことは、SQLでテーブルから必要な条件をセットしてそれをrecordsetにいれるのだと思いますが、 そのrecordsetをなんとか新しいテーブルに作成して入れることはできないのでしょうか。 AccessVBAに明るい方よろしくお願いいたします。