• 締切済み

[Excel ADO]テキストとシートの混在使用法

Excel2007を使っています。 ADOを使ったSQL処理をやっているのですが、 元データ(テーブル)をCSVファイルと、エクセルのシートの両方を使うことはできますか? 例えば、商品コード表とか担当者コード表みたいな比較的小規模かつ動きの少ないものはエクセルシート上の表を参照し、CSVファイルの売上データを処理する、というようなイメージです 小さなテーブルのファイルが増えていくのがイヤで、ひとつのブック内に集約しておけないものでしょうか

みんなの回答

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.3

#1です。 Accessの無い環境で使用するには下記をインストールする必要がありそうです。 Microsoft Access データベース エンジン 2010 再頒布可能コンポーネント http://www.microsoft.com/ja-jp/download/details.aspx?id=13255 2007向けは下記かもしれません。 2007 Office system ドライバ: データ接続コンポーネント https://www.microsoft.com/ja-jp/download/details.aspx?id=23734 ご参考まで。

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.2

#1です。 http://okwave.jp/qa/q9079324.html で嘘をつく結果になってしまいましたが、ワークシート間を結合したクエリは実行可能です。 本質問の#1の回答の、CSVにリンクしたワークシートと、他のワークシート間を結合したクエリも同様に実行できますので、この場をお借りして補足させていただきます。 本題と外れて申し訳ありませんが、12万行のデータから、1000件の値に合致するものを別ワークシートに抽出する課題の実行時間計測結果の一部です。 CSVにリンクしたワークシートに適用すると、Jet4.0はエラーになりました(深く追求して無いです)。ご参考まで。 方法 msec AutoFilter一括(Criteriaに配列指定) 265 ワークシート間で内部結合クエリ(Jet4.0) xlsm形式 655 ワークシート間で内部結合クエリ(ace12.0) xlsm形式 2090 重複対応連想配列 2605 AdvancedFilter一括 29391 両リストをVariant配列に取込み照合(一括貼付) 30467 Find&FindNextを1000回実行 217887 ワークシートでADO(key毎にSELECT文1000回実行) 1539792

hzd00430
質問者

お礼

返事が遅くなり申し訳ございません。 なかなか難解なお話で、まだ全容がつかめておりませんが、 MSのリンク先等も読んでみた限り、 Access DBをHUBにして、CSV、Excelブック、シート他を リンクすることができる、という感じでしょうか。 私の環境にはAccessがないのでどうなるか気がかりですが、 明日にでも実証実験をやってみたいと思います。 ありがとうございました。

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.1

二種類の接続からのクエリという意味でしたら、色々検索してみましたが発見できませんでした。 案1:外部データの取込でワークシートにCSVを接続。売上データのCSVをいつも同じ場所、名前で置けば、手動更新もしくはオープン時に自動更新可。(いちいちファイルの在処を聞いて来ない設定可) 案2:エクセルからアクセスのDBを生成、CSVやエクセルワークシートをリンクテーブルに設定。複数リンクテーブル間のクエリを実行。このDBは中味が無い様なものなので、使用都度生成・削除しても軽いと予想。 案1が現実的ですが、個人的興味だけで案2をやってみました。文字数オーバーでコメント等消さざるを得ませんでしたが、ご参考まで。 ' 参照設定:Microsoft ADO Ext,Active Data Objects Library Sub createLinkedXLws() Dim accdbPath As String Dim xlwsPath As String, mySheetName As String Dim csvPath As String, csvFileName As String Dim destRange As Range Dim objCn As ADODB.Connection Dim objRS As ADODB.Recordset Dim strSQL As String On Error GoTo errHandle accdbPath = GetDesktopPath & "\test.accdb" xlwsPath = ThisWorkbook.FullName csvPath = GetDesktopPath csvFileName = "社員情報.csv" mySheetName = "社員マスタ" If makeAccDB(accdbPath) <> 0 Then Err.Raise 1001, , "create accdb error" End If If Not checkFile(xlwsPath) Then Exit Sub '自ブックへのリンク If CreateLinkedExternalTable( _ accdbPath, _ "Excel 12.0 Xml;DATABASE=" & xlwsPath & ";HDR=YES", mySheetName & "$", mySheetName) <> 0 Then Err.Raise 1002, , "worksheet link error" End If ' CSVへのリンク If CreateLinkedExternalTable( _ accdbPath, _ "text;DATABASE=" & csvPath & ";HDR=YES; FMT=Delimited;", csvFileName, getBaseName(csvFileName)) Then Err.Range 1003, , "csv link error" End If Set destRange = ThisWorkbook.Sheets("Sheet1").Range("A1") Set objCn = New ADODB.Connection With objCn .Provider = "Microsoft.ace.OLEDB.12.0" .ConnectionString = "Data Source=" & accdbPath .Open End With strSQL = "SELECT A.社員コード, A.氏名, B.記事 FROM 社員マスタ AS A INNER JOIN 社員情報 AS B ON A.社員コード = B.社員コード;" Set objRS = New ADODB.Recordset Set objRS = objCn.Execute(strSQL) pasteFieldNames objRS, destRange destRange.Offset(1, 0).CopyFromRecordset objRS errHandle: If Err.Number <> 0 Then MsgBox Err.Number & " : " & Err.Description On Error GoTo 0 On Error Resume Next If Not objRS Is Nothing Then objRS.Close Set objRS = Nothing If Not objCn Is Nothing Then objCn.Close Set objCn = Nothing End Sub Sub pasteFieldNames(rs As ADODB.Recordset, destCell As Range) Dim i As Long For i = 0 To rs.Fields.Count - 1 destCell.Offset(, i).Value = rs.Fields(i).Name Next i End Sub 'https://msdn.microsoft.com/ja-jp/library/cc376276.aspxから借用・改造 Function CreateLinkedExternalTable(strTargetDB As String, _ strProviderString As String, _ strSourceTbl As String, _ strLinkTblName As String) As Boolean Dim catDB As ADOX.Catalog Dim tblLink As ADOX.Table On Error GoTo errHandle Set catDB = New ADOX.Catalog catDB.ActiveConnection = "Provider=Microsoft.ACE.OLEDB.12.0;" & _ "Data Source=" & strTargetDB Set tblLink = New ADOX.Table With tblLink .Name = strLinkTblName Set .ParentCatalog = catDB .Properties("Jet OLEDB:Create Link") = True .Properties("Jet OLEDB:Link Provider String") = strProviderString .Properties("Jet OLEDB:Remote Table Name") = strSourceTbl End With catDB.Tables.Append tblLink Set catDB = Nothing errHandle: CreateLinkedExternalTable = Err.Number End Function Function makeAccDB(accdbFullPath As String) As Long Dim cat As ADOX.Catalog Dim ConnectionString As String On Error GoTo errHandle Set cat = New ADOX.Catalog ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" cat.Create ConnectionString & accdbFullPath & ";" Set cat = Nothing errHandle: makeAccDB = Err.Number End Function Function getBaseName(fileFullPath As String) As String Dim FSO As Object Set FSO = CreateObject("Scripting.FileSystemObject") getBaseName = FSO.getBaseName(fileFullPath) Set FSO = Nothing End Function Private Function GetDesktopPath() As String 'デスクトップのパスを取得する関数。文字数制限から割愛。 End Function

関連するQ&A

  • [Excel ADO]合計額の挿入は可能ですか?

    Excel2007のADOを使ってCSVファイルのデータを集計する方法を習得中です ある業務アプリからエクスポートしたデータなのですが、 売上伝票データ: 伝票日付、伝票番号、取引先名、明細番号、商品名、数量、単価、金額、取引区分、納入先コード 納入先コードテーブル: 納入先コード、納入先名 取引区分が0なら売上、1なら入金(入金伝票の場合納入先コードがNULL) これを集計して売上明細表をつくるとして、 伝票毎に伝票合計額、および納入先名を挿入するようなことが SQL文だけで可能でしょうか?

  • ADOを使用してExcelデータをAccess取込む際のExcelシートの選択について

    表記のとおりADOを使用してExcelデータをAccess取込むのですが、Sheet1のデータを読込んだ後、引続きSheet2のデータを読込む様にVBAコードを書いたつもりですが、Sheet1をアクティブにした状態でExcelデータを保存していたらSheet1のデータを重複して取込み、Sheet2をアクティブにした状態でExcelデータを保存していたらSheet2のデータを重複して取込んでしまいます。どこをどうすればSheet1のデータを読込んだ後、引続きSheet2のデータを読込む様に出来るのでしょうか? ====== VBAコードの抜粋 =========   Dim xlApp As Object       ' Excelのアプリケーション定義   Dim xlBook As Object      ' ExcelのワークブックのフォルダPath+ファイル名を定義   Dim xlSheet As Object      ' Excelの参照するシート名を定義   Dim SheetName As String     ' シート名を代入   Dim SheetCount As Byte     ' シートの選択 For SheetCount = 1 To 2       ' 1回目のループでSheet1から2回目のループでSheet2からデータを取り込む If SheetCount = 1 Then SheetName = "Sheet1" If SheetCount = 2 Then SheetName = "Sheet2" Set xlApp = CreateObject("Excel.Application") Set xlBook = xlApp.Workbooks.Open("ファイルPath+ファイル名") Set xlSheet = xlBook.Worksheets(SheetName) Set Wcell = xlSheet.Range("A1") Set Cn = CurrentProject.Connection Rs.Open "取込みテーブル", Cn, adOpenKeyset, adLockOptimistic xlApp.Application.Visible = True   データを取込むコードあり(省略) xlBook.Close xlApp.Visible = False Set xlSheet = Nothing Set xlBook = Nothing Set xlApp = Nothing Next SheetCount

  • [Excel ADO]条件入力の簡素化

    Excel2007を使い、ADOによるCSVファイルのSQL処理をしています ユーザーフォームで条件を入力し、原則以下のようにSQL文化しています 【売上データから商品名で検索する】 sql = "SELECT * FROM 売上.csv WHERE 商品名='" & 商品名.text & "' (「商品名」はユーザーフォーム上のテキストボックスオブジェクト) この際に、ANDやORなども使えたら便利だと思いますが、 SQLとして正しいものは、 商品名='A' OR 商品名='B' とせねばならず、記述がメンドウです。 入力上は 'A' OR 'B' ('A' AND 'B') OR 'C' などとして、それを内部で正しいSQLに変換するような ライブラリなどはないでしょうか? 機械的に「商品名=」という文字列を挿入するような コードを書こうかとも思いましたが、 もう少し賢いパーサーのようなもの(?)が既に存在しても おかしくない気がしました 何かご存じの方がいらっしゃいましたら教えてください よろしくお願いします

  • ADO使用か構造体等の使用か

    Excelでフォームを作って、そこからデータを吸い上げて保存用兼データ解析アプリケーションのデータ元となるようなCSVファイルへフォーム内容を書き込むというような、よくある操作を行うとします。 今までは、変数を宣言して配列を使ったり構造体を使ったりしていましたがデータベースを独学で学んでいるうちにVBAにもADOを使用したデータ操作が行える方法があることを最近知りました。 まだ、SQL的な書き方でものを作ったことが無いので実感が無いのですが上っ面だけ見ると細かく変数等を管理することが減るように思えるので今頼まれている内容にはADOを使用したものに挑戦してみようかと思っています。 経験者の方がいらっしゃいましたら、ADOを使用することの率直な利点と難点を聞かせてください。

  • [Excel ADO]同じテーブルを複数ファイル化

    Excel2007でExcel ADOによるCSVファイル処理をしています 対象はあるアプリからエクスポートした販売データで、月締め処理後の集計が主な内容です。 その際に、10年分以上ある全期間を対象にエクスポートすると時間がかかるので、 せめて前年度以前の分は年度締め時に一度程度、月締め時は当会計年度分に絞り時短を狙いたいのです そのようにして作った2つの販売データファイルから、全データを対象にした処理をするにはどうしたらよいでしょうか? 一つのファイルに対して SELECT * FROM 全データ.csv AS 元帳 WHERE 諸条件 として動いている状態で、 SELECT * FROM ((SELECT * FROM 当年度データ.csv) UNION (SELECT * FROM 前年度以前データ.csv)) AS 元帳 WHERE 諸条件 のような形でいけないかと思ったのですが、「JOIN操作の構文エラーです」となりました (SELECT * FROM 当年度データ.csv AS 元帳 WHERE 諸条件) UNION (SELECT * FROM 前年度以前データ.csv AS 元帳 WHERE 諸条件) とすると一応は動くのですが、実際はもっと複雑なSQL文となっていることもあり、 対象データ(DB)をまず結合した上で、絞り込みや並べ替え等をやれたらと思っています 何かよい方法があれば教えてください

  • oracleとexcelのADOによる連携について

    お世話になります。 excelからADOでoracleのデータベースにある テーブルの必要なデータのみを抽出してexcelに 書き出そうとしています。 excelのvbaコードで、まず、ADOコネクションの生成として、 「cn.Open "Provider=OraOLEDB.Oracle;Data Source=" & "DB名" & ";User ID=hpsuser;Password=○○○;", "○○○", "○○○"」と書き、 ADOレコードセットの生成で、 「 rs.Open "~(1)~", cn, adOpenDynamic, adLockOptimistic, adCmdText」 と書いていますが、上記「~(1)~」の部分がかなり長いクエリ文になっているからなのか、 エラーがかかってしまいます。 単純なテーブルのデータを呼び出す事しかできないのか、又、 長いクエリ文のデータを抽出したい場合どの様にしたら良いのか、 どなたかご親切な方、ご教示頂けます様、宜しくお願いいたします。

  • Excel2002で新規起動時にシートを開かせないようにしたい

    Excel2002で新規起動時にシートを開かせないようにしたい 宜しくお願いします。 Excel2002で、エクセルを新規起動させると勝手にシートが3枚作られますが、このシートを減らしたり増やしたりする方法は分かったのですが、まったく表示させない様にするには、どうすれば良いのでしょう? 私の使い方の場合、既存のCSVファイルを開かせる事が多く、しかし、CSVファイルはエクセルではなく、秀丸で開くように設定しているので、たまにエクセルで開こうとする時に、エクセルを新規起動させて、その度にシートを消しております。 これが非常にうっとうしいので、最初から新規のシートを全く開かせなくする方法があれば、すごく助かります。

  • CSV形式で編集された項目をVBからEXCELシートへ編集し印刷

    CSV形式で編集したテキスト項目(7項目,300行)を、EXCELファイルへ編集し、印刷する方法を教えて下さい。(VBでEXCELシートへ編集し印刷したが、編集から印字までの処理時間が大きいため、帳票データをCSV形式化し、処理速度を高速化したい)簡単なサンプルがあれば助かります。 処理の概要は、以下の通り。 (1)VBで、CSV形式のテキストファイル作成後、 (2)VBからEXCELファイルを開いて (3)CSVのテキストファイルをEXCELシートへ編集 (4)VBから印刷プレビューを出し (5)印刷指示することで 全て、VBから制御する方法

  • Access2007のレポート作成でExcelシート内容をコピー(インポート)できませんか?

    元々Excelシート上に印刷フォーマットがあり 別シートのデータを差し込み印刷するマクロで データを広い連続印刷しているのですが データをAccessに集約したいと考えています。 レポートを作成する際、Excelからの罫線、文字等の データを利用できませんでしょうか? AccessデータをCSVにエクスポートし Excelで取り込む方法もあるかと思いますが 使用する人がど素人ですのでAccessで 全てを完結したいと考えています。 Excelのテーブルをコピーしてレポートに貼り付ける 方法ですとOLEクラスでExcelが貼り付けられますが、 A3横のサイズを全て選択しコピペしても、途中で切れてしまします。 Access側のレポートサイズはA3横にはしています。

  • 複数のExcelブックから特定シートのセル範囲抽出

    同一フォルダ内にある複数のExcelブックから特定シートの特定セル範囲を抽出して一覧表にまとめるExcel マクロ(VBA)を教えてください。 このサイトで殆どよく似た回答を読んだのですがうまくいきません。VBA初心者です。 よろしくお願いします。 【前提】 ・実行する端末のOSはWindows 10 ExcelはOffice365 ProPlus ・対象フォルダはネットワーク接続フォルダ  この中に、複数のExcelブック(xlsx、xlsm)があります。 ・抽出したい対象は、各ブック内の「台帳」シートの「A3:Cの最終行」で  複数のブックの中には「台帳」シートが含まれていないブックも混在しています。 【抽出一覧作成イメージ】 ・「集約.xlsm」ブックの「集計」シートの2行目から抽出した結果を一覧表示する。 ・「集約.xlsm」ブックにマクロは登録する ・表示はA列に抽出元ブック名(=ファイル名)、B列からD列に抽出元「A3:Cの最終行」セルの値。 ・「A3:Cの最終行」セルの値を「集約.xlsm」ブックの「集計」に貼り付ける際には「値で貼り付ける」が望ましい。

専門家に質問してみよう