• ベストアンサー

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

TAGOSAKU7の回答

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

田吾作7@38.6度の風邪引きです。。。 返事が遅くなってすいません。昨日ほとんど寝てました。。。 作りなおしました。 質問の仕様が 1.ODBC 2.EXCELに貼り付け とあったので、すでにODBCは無視してますが、EXCELに貼り付けは忠実に守ろうとしていました。 今回のは、完全に仕様を無視したつくりになってます。(スピード重視のため) 作りとしては 1.CSVのデータをAccessにテーブルとして取り込む 2.EXCEL形式でエクスポート&ワークブックを開く もしこれでもいいのであれば、こちらの方が処理が早いと思います。 Sub Main2()   'CSVファイルのフルパス   Const csvFullPath  As String = "c:\Folder1\dmy\test.csv"   'EXCELファイルのパス   Const excelFullPath As String = "c:\test.xls"   'CSVファイルを取り込むテーブル名   Const DmyTbl    As String = "DmyTbl"         'CSVファイルを取り込む   Call inCsv(csvFullPath, DmyTbl)      'EXCEL形式でエクスポート   Call outExcel(DmyTbl, excelFullPath) End Sub Private Sub outExcel(inTblName As String, inXlsFile As String)   Dim xlsApp   As Excel.Application   Dim xlsBook   As Excel.Workbook      'エクセル形式でエクスポート   DoCmd.TransferSpreadsheet acExport, 8, inTblName, inXlsFile, True         'エクセル起動をしてエクスポートされたかを確認   Set xlsApp = New Excel.Application   Set xlsBook = xlsApp.Workbooks.Open(inXlsFile)      xlsBook.Worksheets(inTblName).Select      xlsApp.Visible = True   Set xlsBook = Nothing   Set xlsApp = Nothing End Sub Private Sub inCsv(inFileName As String, inTblName As String)   Dim Db   As DAO.Database   Dim strSQL As String      Dim strFile As String   Dim strPath As String      Dim wkVal  As Variant      Set Db = CurrentDb      'とりあえずダミーを削除   On Error Resume Next   Db.TableDefs.Delete inTblName   On Error GoTo 0      'パスとファイル名に分解   wkVal = Split(inFileName, "\")   strFile = wkVal(UBound(wkVal))   strPath = Left(inFileName, Len(inFileName) - Len(strFile))      'SQL文(テーブル作成用)を作成   strSQL = "select * into " & inTblName & _       " from " & "[Text;DATABASE=" & strPath & "].[" & strFile & "]"   Db.Execute strSQL      Set Db = Nothing End Sub

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