• ベストアンサー

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

TAGOSAKU7の回答

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.2

ODBCじゃなきゃダメですか? DAOで普通にCSVファイルに接続できるので、その方法のサンプルを載せておきます。 ※注意点1.普通はRs.Recordcountとするとレコード件数がわかりますが、テキストに接続した場合はRs.Recordcountは常に[1]を返します。 ※注意点2.DB名/テーブル名はテキストの場合は扱いが特別です。 たとえば [c:\test.mdb] ← DB名 [TBL_商品] ← TABLE名 こういった扱いが普通ですが、テキストファイルの場合は c:\Folder1\dmy\test.csvを分解して [c:\Folder1\dmy\] ← DB名 [test#csv] ← TABLE名 となります。 注意すべきはテーブル名は、ピリオドが含む場合シャープ記号に変換して使用することです。 注意点3.GetRowsメソッドを使うとレコードセットのポインタが破棄されるため、使用不可能です。 当然ですが、ツールの参照設定で [Microsoft Excel x.0 Object Library] [Microsoft DAO x.x Object Library] を指定してくださいね Sub Main()   'CSVファイルのフルパス(任意です)   Const FileFullPath As String = "c:\Folder1\dmy\test.csv"      'エクセルに貼り付ける時の開始行(任意です)   Const lngPasteRow  As Long = 2      Dim Ws As    DAO.Workspace   Dim Db As    DAO.Database   Dim Rs As    DAO.Recordset   Dim strSQL As  String      Dim strDbName  As String   Dim strTblName As String      Dim xlsApp   As Excel.Application   Dim xlsBook   As Excel.Workbook   Dim xlsSheet  As Excel.Worksheet      Dim i  As Long   Dim j  As Long      Dim cntFld As Long      'DB名とTABLE名を取得する   Call getDbTbl_for_File(FileFullPath, strDbName, strTblName)      'テーブルオープン   Set Ws = DBEngine.Workspaces(0)   Set Db = Ws.OpenDatabase(strDbName, True, False, "Text;")   strSQL = "select * from [" & strTblName & "] where Field1='hoge'"   Set Rs = Db.OpenRecordset(strSQL)         'エクセル起動   Set xlsApp = New Excel.Application   Set xlsBook = xlsApp.Workbooks.Add   Set xlsSheet = xlsBook.Worksheets(1)   xlsApp.Visible = True      '書き込み   With xlsSheet     'フィールド数取得     cntFld = Rs.Fields.Count        'フィールド名の書き込み     For i = 0 To cntFld - 1       .Cells(lngPasteRow, i + 1).Value = Rs.Fields(i).Name     Next i          '各値の書き込み     i = 0     Do Until Rs.EOF       For j = 0 To cntFld - 1         .Cells(lngPasteRow + 1 + i, j + 1).Value = Rs(j).Value       Next j       i = i + 1       Rs.MoveNext     Loop   End With   xlsBook.Saved = True  '更新情報を破棄する(閉じるときの「保存しますか?」のダイアログを表示させない)   Set xlsSheet = Nothing   Set xlsBook = Nothing   Set xlsApp = Nothing      Rs.Close   Db.Close   Ws.Close   Set Rs = Nothing   Set Db = Nothing   Set Ws = Nothing End Sub 'テキストのファイルパスを分解して、データベース名(パス)とテーブル名(ファイル名)に分ける。 Private Sub getDbTbl_for_File(inFilepath As String, outDbName As String, outTblName As String)   Dim wkVal  As Variant   wkVal = Split(inFilepath, "\")   outTblName = wkVal(UBound(wkVal))      outDbName = Left(inFilepath, Len(inFilepath) - Len(outTblName))   outTblName = Replace(outTblName, ".", "#") End Sub

hooma
質問者

お礼

ありがとうございます。 実際に試してみます。 わからないことがありましたら補足に追加いたしますので よろしくおねがいします。

hooma
質問者

補足

まだ試してませんが、 細かいことですが、ひとつ確認させていただきます。 'エクセル起動   Set xlsApp = New Excel.Application 上記の記述ですと、VBAでなくて、VBからの実行ということになるのでしょうか。 希望としましては、VBAからの実行をしたいのですが。

関連する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に明るい方よろしくお願いいたします。