• ベストアンサー

ExcelVBA ADO接続でデータ追加と上書きについて

Win2000SP-4、Office2000SP-3使用しております。 7,050件入力したExcelデータがあり(Aファイル)、入力用Excelファイル(Bファイル)に入力したデータをAファイルへ追加、上書きしたいと考えております。 Aファイルには既に46列7,050行のデータが入力されております。(中には入力されていないセルもあります。) 解説書やネットで、ADO接続、SQL「insert into」「update」文使用でAファイルをExcelで起動しなくても追加、上書きが可能と知り後述の通り組んでみました。 しかし、「実行時エラー’-2147217913(80040e07)': [Microsoft][ODBC Excel Driver]抽出条件でデータ型が一致しません。」というエラーが返ってきます。 「insert into」文の項目を1つずつ実行したところ、数量や日付などの列に文字が入力されているからのようで、A、B両方のデータをすべて文字列に変更し実行してみましたが同じエラーが返ってきました。 本来であれば入力されているデータの見直しをすることが先決なのですが、項目件数が多いこと、入力されている文字列がバラバラでコード化することもかなわずどうしたら良いのか煮詰まっております。 どなたかお知恵をお貸し下さい。 Sub DataTsuika() Dim objADOCon As Object Dim strDBPath As String Dim strSQL As Variant strDBPath = ThisWorkbook.Path strDBPath = strDBPath & "\Aデータ.xls" Set objADOCon = CreateObject("ADODB.Connection") objADOCon.Open "Driver={Microsoft Excel Driver (*.xls)};" & _ "DBQ=" & strDBPath & ";" & "ReadOnly=0"  'AファイルmyTextシートへ追加 strSQL = "insert into [myText$]" _ & "(kome,整理番号,許可区分,申請日,許可番号,許可日,前許可番号,前許可日,連絡先郵便番号,連絡先住所,連絡先担当,連絡先電話" _ & ",占用物件1名称,占用物件1寸法規格,占用物件1数量,占用物件1単位,占用物件2名称,占用物件2寸法規格,占用物件2数量,占用物件2単位" _ & ",許可期間自,許可期間至,占用料数量,占用料単位",占用料月単価,占用料年単価,占用料月数,占用料金額,占用料年額,分類,備考,更新送付日,更新申請日,登録日) " _ & "values ('" & Range("A2").Value & "','" & Range("B2").Value & "','" & Range("C2").Value & "','" & Range("D2").Value & "'" _ & ",'" & Range("E2").Value & "','" & Range("F2").Value & "','" & Range("G2").Value & "','" & Range("H2").Value & "'" _ & ",'" & Range("L2").Value & "','" & Range("M2").Value & "','" & Range("N2").Value & "','" & Range("O2").Value & "','" _ & ",'" & Range("U2").Value & "','" & Range("V2").Value & "','" & Range("W2").Value & "','" & Range("X2").Value & "'" _ & ",'" & Range("Y2").Value & "','" & Range("Z2").Value & "','" & Range("AA2").Value & "','" & Range("AB2").Value & "'" _ & ",'" & Range("AH2").Value & "','" & Range("AI2").Value & "','" & Range("AJ2").Value & "'" _ & ",'" & Range("AK2").Value & "','" & Range("AL2").Value & "','" & Range("AM2").Value & "','" & Range("AN2").Value & "'" _ & ",'" & Range("AO2").Value & "','" & Range("AP2").Value & "','" & Range("AQ2").Value & "','" & Range("AR2").Value & "'" _ & ",'" & Range("AS2").Value & "','" & Range("AT2").Value & "','" & Range("AU2").Value & "')" objADOCon.Execute strSQL objADOCon.Close Set objADOCon = Nothing End Sub 補足説明等必要でしたらお知らせ下さいませ。 文字数制限のため「insert into」文の途中と「update」文のコードは割愛させていただきました。回答いただけましたら補足させていただきます。よろしくお願いいたします。

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんにちは。 最初のError の 80040e07 のコードは、ODBC から発せられたものですね。私としては、VBAから受ける印象は、補足のお話を読んでみても、最初の発言とは考えが変わらないのですが、開くのに時間が掛かるのは、別の要因かもしれません。私の今使っているファイルは8MB近くありますが、何のストレスも感じておりません。ただし、VBA中心です。そうしなければ、とても使えたものではありません。 >strSQL = "insert into [bufDaityo$]" _ > & "(kome,整理番号,許可区分,申請日,許可番号,許可日,前許可番号,前許可日) " _ > & "values ('" & Range("A2").Resize(, 8).Value & "')" >うまくお伝えできたか不安ですが、引き続きよろしくお願いいたします。 > Range("A2").Resize(, 8).Value これは、2次元ですから、これは、1次元に変えないといけません。 順序よく文字列に変えると言うのなら、 テストパターンですが、以下でためしてください。 文字列が取れているはずです。 Sub Test() Dim strTxt As String Dim r As Range Dim c As Variant Set r = Union(Range("A2").Resize(, 8), Range("L2").Resize(, 4), Range("U2").Resize(, 8), Range("AH2").Resize(, 14)).Cells For Each c In r    strTxt = strTxt & "','" & c.Value Next c strTxt = Mid$(strTxt, 3) & "'" 'Debug.Print strTxt 'これで中身を確認 Set r = Nothing End Sub

urban-hon
質問者

お礼

おはようございます。たびたびのご回答ありがとうございます。 教えていただいたコードを流用し文字列を取り出すことができ、エラーが起きることなく追加、更新ができました。 ファイルを2つにしたことにより、個々のファイルサイズは作業前よりは軽くなっていますが、ユーザー書式や名前の定義、VB用のコマンドボタン等たくさんのオブジェクトがありますので、そのせいで動作が重くなってしまっているようですね。 当初よりおっしゃられていたご意見を参考にその辺りの見直しと改良を行っていこうと思います。 「Union」「Resize」は今回初めて知りましたが、これは他の場面でも活用できそうです。 本格的にVBAを使うのは今回が初めてでわからないことだらけでした。 なかなか目当ての解説が見つけられず、解説書の山が高くなって行くばかりです。 またわからない所が出てくると思いますが、その際はどうぞよろしくお願いいたします。 ありがとうございました。

その他の回答 (2)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんばんは。 >7,050件入力したExcelデータがあり(Aファイル)、入力用Excelファイル(Bファイル)に入力したデータをAファイルへ追加、上書きしたいと考えております。 ものすごく基本的なことですが、なぜ、上書きや追加するデータにADOが必要なのでしょうか。 私の記憶に間違いなければ、そのコード自体の問題ですが、VBEdiotr に、いわゆる「生きたオブジェクト」を大量に埋め込むと、その分のメモリを割り引いてしまって、思ったようにはいかなくなるように思います。 なんとなく、論理的エラーではなく、物理的なエラーが出てきているような気がします。 一度でも動いたことがあるのでしょうか。ざっと見た感じでは、そのコードは、使えないと思います。 >AファイルをExcelで起動しなくても追加、上書きが可能と知り後述の通り組んでみました。 そのまま、ファイルをオープンしたほうがずっと楽だと思います。もしも、Excel自体がないとか、一つのこだわりがあれば別ですが、そのコードを書くぐらいなら、xls は、xls ファイルのまま扱えばよいと思いますね。仮に、4万行だとしても、そのほうが楽です。 今見た限りでは、単に、4つのエリアしかないのだと思います。 Range("A2").Resize(,8) Range("L2").Resize(,4) Range("U2").Resize(,8) Range("AH2").Resize(,13) この付けたしや上書きのマクロぐらいは、初歩的な内容だと思います。ただし、上書きというか、UpDate 自体の位置関係があまりはっきりしませんが。

urban-hon
質問者

お礼

間違えて補足へ書き込みしてしまいました。 ご回答ありがとうございます。 引き続きよろしくお願いいたします。

urban-hon
質問者

補足

ご回答ありがとうございます。 もともとはABとも1つのファイルだったものでして、入力用シートで新規データ追加・整理番号でデータ抽出後変更更新(上書き)、7,050行データのあるシートでオートフィルタを使用してデータ検索後、印刷用シートで帳票印刷等を行っていたのですがファイルサイズが増大し(8MB超)、ファイルを開くのに非常に時間がかかっていました。客先のパソコンでは4~5分かかってしまうのです。 客先の要望がなるべく現在の操作手順を変えず、早く開くようにできないかということで、まず7,050行入力されているシートを切り離してA、Bというファイルにしました。それでもAファイルが4MBありましてファイルオープンに時間がかかってしまい、色々な方法(mdbやテキストファイルを使用する等)を試して現在のADOという形に行き着いたのです。 質問時に掲載したコードにつきましては作成当初の確認時は追加更新できておりました。ですが昨日いきなりエラーが出てしまいまして… 現在は全ての項目を文字列にできないか方法を検討中です。(セルの表示形式を文字列にしただけでは駄目なようでエラーが返ってきました。) 書き込みしていただいたコードを試してみましたが、同様のエラーが返ってきてしまいました。 strSQL = "insert into [bufDaityo$]" _  & "(kome,整理番号,許可区分,申請日,許可番号,許可日,前許可番号,前許可日) " _  & "values ('" & Range("A2").Resize(, 8).Value & "')" うまくお伝えできたか不安ですが、引き続きよろしくお願いいたします。

回答No.1

まったくもってトンチンカンな回答かも知れませんが? AファイルにBファイルを追加したいだけですよね。 当然、レイアウトは同じで項目数も同じですよね。 ADO接続でデータ追加をしないといけませんか? 定例作業となるのですか? 僕でしたら、 A.xlsファイルをCSV形式で落として、 B.xlsファイルをCSV形式で落として、 A.csvファイルをワードパッドで開いて、 B.csvファイルをワードパッドで開いて、 ワードパッドのB.csvファイルのタイトル行以外をコピーして、 ワードパッドのA.csvファイルの最終行の後ろに貼り付ける、 ワードパッドのA.csvファイルを名前を付けて(C.csv)保存、 C.csvをダブルクリックで読み込み、 エクセル形式でC.xlsとして保存 これで、C.xlsは2つが合わさったファイルとなります。 テストデータ46列7,050行のデータを2つ作って、くっつけました。 テレビを見ながら(ディープインパクト)出来ましたよ。(笑) 外していたらごめん。

urban-hon
質問者

お礼

ご回答ありがとうございます。 もともとはABとも1つのファイルだったものでして、入力用シートで新規データ入力し、7,050行データのあるシート(データシート)へ追加・整理番号でデータ抽出後変更してデータシートへ更新(上書き)、データシートでオートフィルタを使用してデータ検索後、印刷用シートで帳票印刷等を行っていたのですがファイルサイズが増大し(8MB超)、ファイルを開くのに非常に時間がかかっていました。客先のパソコンでは4~5分かかってしまうのです。 客先の要望がなるべく現在の操作手順を変えず、早く開くようにできないかということで、まずデータシートを切り離してA、Bというファイルにしました。それでもAファイルが4MBありましてファイルオープンに時間がかかってしまい、色々な方法(mdbやテキストファイルを読み込む等)を試して現在のADOという形に行き着いたのです。 書き込みしていただいた一連の手順を自動化する方法がすぐには思いつきませんが、OpenTextやOpen~Input~等は既に試しておりまして、ファイル読み込み時や抽出時にデータの欠損が見られたため、テキストファイルを読み込む方法は諦めたのです。 (数量や日付の列に文字が入力されているデータを読み込むと、そのセルが空白になって読み込まれてしまうのです。) かれこれ2週間程この件にかかりきりで頭が混乱しています。 最悪、ファイルオープンで作業をしていただくしかないかと。(開くのに時間はかかりますがコピペなので貼付先さえ間違わなければ一番確実と思いますので。) 何か良い方法がございましたら引き続きよろしくお願いいたします。

関連するQ&A

  • ExcelVBA Accessにデータ書き込み

    VBAでコマンドボタンを押した際に特定のセルの値をAccessDBに入力するプログラムを作りたいのですが、上手くいきません...。 実行した際に「実行時エラー '21472179000 (80040e 14)': オートメーションエラーです。」と表示されます。 また、ステップインで実行してみるとEnd Withのところでエラーが発生します。 恐らくインサート文が間違っていると思うのですが、試行錯誤しても解決できませんでしたので教えて頂きたいです。 以下プログラムです。 Private Sub CommandButton1_Click() Dim cn As ADODB.Connection Dim cmd As ADODB.Command Dim rs As ADODB.Recordset Dim constr As String Dim strSQL1 As String Dim a As String a = Range("A1").Value Dim b As String b = Range("A2").Value Dim c As String c = Range("A3").Value constr = "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=~.accdb strSQL1 = "insert into " & _ "TableName (1,2,3) " & _ "values ('" + Range("A1").Value + "','" + Range("A2").Value + "','" + Range("A3").Value + "')" Set cn = New ADODB.Connection cn.ConnectionString = constr cn.Open Set cmd = New ADODB.Command With cmd .ActiveConnection = cn .CommandText = strSQL1 .Execute End With Set cmd = Nothing Set rs = Nothing cn.Close Set cn = Nothing End Sub 以上、宜しくお願い致します。

  • ACCESSでレコード数の取得の仕方

    Aテーブルのレコード数を取得しようと思い、次のPGを考えました。(Aテーブルには10件のデータが入っています。)ですが、「-1」という数値が返ってきます。なぜでしょうか? Dim objADOCON As ADODB.Connection Dim objADORS As ADODB.Recordset Dim strSQL As String Set objADOCON = Application.CurrentProject.Connection strSQL = "SELECT * FROM Aテーブル" Set objADORS = objADOCON.Execute(strSQL) MsgBox objADORS.RecordCount , vbOKOnly, "レコード数"

  • ExcelVBAマクロでのデータの受け渡し

    Sheet1「元データ」                  A   B    C   D     1  0001 みかん  A店  3/1  2 0200  りんご B店  3 0311 いちご B店  3/10 4    いちじく C店 5 0360 メロン  D店 6 かき   P店 7  0312 キウイ  D店 Sheet2「最新データ」   A   B    C   D 1  0001 みかん  A店  3/1 2 0190 3 0200  4 0311 いちご B店  3/10 5 0422  洋ナシ C店 6 0250 7 0500 すいか  P店  8  0312 キウイ       とあった時に最新データのA列の番号と元データの番号を見て同じ物があったら、最新データに元データの内容をうつし込むというデータがあります。 Dim Sh1 As Worksheet Dim Sh3 As Worksheet Dim myR As Range Dim N_D As Long Dim i As Long Set Sh1 = Worksheets("元データ") Set Sh3 = Worksheets("最新データ") With Sh3 For i = 5 To .Range("A65536").End(xlUp).Row N_D = .Range("E" & i).Value Set myR = Sh1.Range("A:A").Find(What:=N_D, LookIn:=xlValues, _ MatchCase:=False) If Not myR Is Nothing Then .Range("B" & i & ":D" & i).Value = _ myR.Offset(, 2).Resize(, 3).Value End If Next End With Set Sh1 = Nothing Set Sh3 = Nothing ここで、値は普通にコピーされてくるのですが、 フォントに色がついていたら、その色もつけたいのですが、どうすれば良いのか分らず困っています。 方法がありましたら、教えてください。 よろしくお願いします。

  • データ検索後の上書き

    データシートに記載がある社員番号を入力フォームに入力し特定の社員データを検索するマクロを下記にて組みました。検索抽出された社員データを直接一部修正入力してもとの社員データヘ上書き処理をする(データによって修正しないこともあり)場合のマクロをご教示願います。 Sub ボタン1_Click() Dim tmpInt As Integer, motoHani(), myRng As Range, i As Integer tmpInt = Worksheets("入力フォーム").Range("C4").Value motoHani = Array("C6", "C7", "C8", "F8", "C10", "C11") Set myRng = Range("社員テーブル").Columns(1).Find(tmpInt, LookAt:=xlWhole) If myRng Is Nothing Then MsgBox "該当する事案はありません" Exit Sub End If For i = 0 To UBound(motoHani) Range(motoHani(i)).Value = myRng.Offset(0, i + 1) Next End Sub

  • 変数に入った値を追加したい

    Access97を使用しています。SQLで変数に入った値を追加したいのです。 Dim strSQL, NO3, NO2 As String Dim i As Integer Dim db As DATABASE Dim SN As Variant If (C_Flag = 0) Then SN = 0 Else SN = 1 End If strSQL = "INSERT INTO 連続印刷 (Nフラグ" strSQL = strSQL & ") VALUES (" strSQL = strSQL & "', 'SN'" strSQL = strSQL & ")" Set db = CurrentDb() db.Execute strSQL Set db = Nothing End Sub 上記のようにすると、"SN"のデータが入ります。 'SN'をSNのようにすると、パラメータが少なすぎますと出てきます。 どうすれば、上記 0や1の値を取得することができるのでしょうか?

  • Accessデータ抽出から追加

    やりたいことを上手く伝えられず、何度もお手数をお掛けし申し訳ありません。 1と2の文を統合して1つのデータとして欲しいです。 どの様に統合したら宜しいのでしょうか? 教えて下さい。(読みづらく申し訳ありません。) 'ワークデータ作成(指定期間のデータを抽出) 1. StrSql = "INSERT INTO " StrSql = StrSql & "TW_在庫テーブルFoma ( " StrSql = StrSql & "販売店コード, " StrSql = StrSql & "キャリアコード, " StrSql = StrSql & "機種コード, " StrSql = StrSql & "数量) " StrSql = StrSql & "SELECT " StrSql = StrSql & "TTCOM_TZIK_TBL.TZIK_HOKNCD, " StrSql = StrSql & "TTCOM_TZIK_TBL.TZIK_CARRCD, " StrSql = StrSql & "TTCOM_TZIK_TBL.TZIK_SHINCD, " StrSql = StrSql & "COUNT(TTCOM_TZIK_TBL.TZIK_CARRCD) As SUURYO " StrSql = StrSql & "FROM TTCOM_TZIK_TBL " StrSql = StrSql & "INNER JOIN T_販売店マスタGeo " StrSql = StrSql & "ON TTCOM_TZIK_TBL.TZIK_HOKNCD = T_販売店マスタGeo.販売店コード " StrSql = StrSql & "WHERE TTCOM_TZIK_TBL.TZIK_CARRCD = '10' " StrSql = StrSql & "AND TTCOM_TZIK_TBL.TZIK_TZDKBN = '2' " StrSql = StrSql & "AND TTCOM_TZIK_TBL.TZIK_ZKTKBN = '0' " StrSql = StrSql & "AND TTCOM_TZIK_TBL.TZIK_SHINKB IN ('5','6') " StrSql = StrSql & "AND TTCOM_TZIK_TBL.TZIK_URIYMD <= " & "#" & CStr(Forms![FAMAIN]![TxtTO日付]) & "#" & " " StrSql = StrSql & "GROUP BY " StrSql = StrSql & "TTCOM_TZIK_TBL.TZIK_HOKNCD, " StrSql = StrSql & "TTCOM_TZIK_TBL.TZIK_CARRCD, " StrSql = StrSql & "TTCOM_TZIK_TBL.TZIK_SHINCD;" CurrentDb.Execute StrSql 2. StrSql = "INSERT INTO " StrSql = StrSql & "TW_在庫テーブルFoma ( " StrSql = StrSql & "販売店コード, " StrSql = StrSql & "キャリアコード, " StrSql = StrSql & "機種コード, " StrSql = StrSql & "数量) " StrSql = StrSql & "SELECT " StrSql = StrSql & "TTCOM_TZIK_TBL.TZIK_HOKNCD, " StrSql = StrSql & "TTCOM_TZIK_TBL.TZIK_CARRCD, " StrSql = StrSql & "TTCOM_TZIK_TBL.TZIK_SHINCD, " StrSql = StrSql & "COUNT(TTCOM_TZIK_TBL.TZIK_CARRCD) As SUURYO " StrSql = StrSql & "FROM TTCOM_TZIK_TBL " StrSql = StrSql & "INNER JOIN T_販売店マスタGeo " StrSql = StrSql & "ON TTCOM_TZIK_TBL.TZIK_HOKNCD = T_販売店マスタGeo.販売店コード " StrSql = StrSql & "WHERE TTCOM_TZIK_TBL.TZIK_CARRCD = '10' " StrSql = StrSql & "AND TTCOM_TZIK_TBL.TZIK_TZDKBN = '2' " StrSql = StrSql & "AND TTCOM_TZIK_TBL.TZIK_ZKTKBN = '0' " StrSql = StrSql & "AND TTCOM_TZIK_TBL.TZIK_ROMSYU = '1' " StrSql = StrSql & "AND TTCOM_TZIK_TBL.TZIK_SHINKB IN ('5','6') " StrSql = StrSql & "AND TTCOM_TZIK_TBL.TZIK_URIYMD <= " & "#" & CStr(Forms![FAMAIN]![TxtTO日付]) & "#" & " ") StrSql = StrSql & "GROUP BY " StrSql = StrSql & "TTCOM_TZIK_TBL.TZIK_HOKNCD, " StrSql = StrSql & "TTCOM_TZIK_TBL.TZIK_CARRCD, " StrSql = StrSql & "TTCOM_TZIK_TBL.TZIK_SHINCD;" CurrentDb.Execute StrSql

  • ExcelVBAでデータ不一致のものの抽出

    Sheet1「元データ」                  A   B    C   D     1  0001 みかん  A店  3/1  2 0200  りんご B店  3 0311 いちご B店  3/10 4    いちじく C店 5 0360 メロン  D店 6 かき   P店 7  0312 キウイ  D店 99 0333 くり C店 Sheet2「最新データ」   A   B    C   D 1  0001 みかん  A店  3/1 2 0190 3 0200  4 0311 いちご B店  3/10 5 0422  洋ナシ C店 6 0250 7 0500 すいか  P店  8  0312 キウイ       とあった時に最新データのA列の番号と元データの番号を見て同じ物があったら、最新データに元データの内容をうつし込むというデータがあります。 Dim Sh1 As Worksheet Dim Sh2 As Worksheet Dim Sh3 As Worksheet Dim myR As Range Dim N_D As Long Dim i As Long Set Sh1 = Worksheets("元データ") Set Sh2 = Worksheets("新規データ") Set Sh3 = Worksheets("最新データ") With Sh3 For i = 5 To .Range("A65536").End(xlUp).Row N_D = .Range("E" & i).Value Set myR = Sh1.Range("A:A").Find(What:=N_D, LookIn:=xlValues, _ MatchCase:=False) If Not myR Is Nothing Then myR.Offset(, 2).Resize(, 3).Copy _ Destination:=.Range("B" & i & ":D" & i) End If Next End With Set Sh1 = Nothing Set Sh2= Nothing Set Sh3 = Nothing ここで、もし、最新データA列の番号と元データの番号を見て一致しないもの、元データにしかないものや最新データにしかないものがあったら、新規データとして、別シートに行ごと書き写したい場合はどのようにすれば良いのでしょうか?

  • ExcelVBAでSQLServerに追加するには。

    教えてください! ExcelVBAの[intNo]と[strNamse]を ADOでSQLServerにレコード追加するにはどうしたらいいのですか? [ExcelVBA] Dim intNo as Integer = Range("A2")の値 Dim strName as String = Range("B2")の値 [SQLServer] Data Source= NetworkPC1 Initial Catalog= DataBase1 ID=aa Password=123456 テーブル= Syain 列1= No 列2= Name

  • ExcelVBA データのコピー範囲について

    あけましておめでとうございます。今年もよろしくお願いします。 Sub Test() Dim myTarget As Range, r As Range, f Set myTarget = Sheets("Sheet1"). _    Range("B2", Sheets("Sheet1").Range("B65536").End(xlUp)) For Each r In myTarget  Set f = Sheets("Sheet2").Columns(1). _    Find(r.Value, Sheets("Sheet2").Range("A1"), Lookat:=xlWhole)  If Not f Is Nothing Then    If r.Offset(0, 3).Value <> f.Offset(0, 3).Value Then      f.Resize(1, 4).Copy Destination:= _      Sheets("Sheet3").Range("A65536").End(xlUp).Offset(1, 0)    End If  End If Next r End Sub 前回の質問で教えていただいたコードなのですが、現時点では、B列のデータを元にして二つのSheetのデータを比較して別Sheetへコピーしているのですが、そのときに、B列以降の(たとえば、B列からX列まで)データはコピーできますが、A列もコピーしたい時はどうすればよいのかで、悩んでいます。どの様に変更すればよいのでしょうか?

  • ExcelVBAでACCESSのクエリに接続したい

    Excel、ACCESSの2003を使用しています。 Excelで、指定した期間の情報をmdb上よりExcel側に出力する処理を考えています。 mdbファイルの接続先がテーブルならうまく処理できます。 しかし今回の接続先がクエリの為か、処理を動かしてもエラーは出ないのですが値が無い扱いになっています。 mdbのテーブルにはリンクテーブルで2つのテーブルがあります。 クエリ側で2つのテーブルをリレーションしており、クエリで表示している内容をExcel側に返したいのです。 下記の処理はクエリに接続をしていないのでしょうか? Option Explicit Const cnsADO_CONNECT1 = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" Dim dbCon As New ADODB.Connection Dim dbRes As New ADODB.Recordset Dim dbCol As ADODB.Field Dim strSQL As String, strStartDate As String, strEndDate As String Dim lngGyo As Long, lngCol As Long Dim strRootPath As String, strFileName As String, strPath As String Dim intField As Integer, i As Integer, j As Integer Public Sub ACCESS接続() strRootPath = "\\11.111.11.1\00_テストフォルダ\"  'IPアドレスとフォルダ選択 strPath = "00_環境設定\01_テスト用\" 'パス先 strFileName "テスト.mdb" 'mdb名 dbCon.Open cnsADO_CONNECT1 & strRootPath & strPath & strFileName  'mdb接続 strStartDate = "#09/01/2014# AND " strEndDate = "#09/23/2014#)" '''''SQLビューの内容をそのまま''''' strSQL = "SELECT テーブルA.年月日, テーブルA.実績No., テーブルB.依頼数, テーブルA.略号, テーブルA.作成No., テーブルA.数値No., テーブルA.名称, テーブルA.CD, テーブルA.長さ, テーブルA.場所, テーブルA.フラグ, " strSQL = strSQL & "Format([年月日],""yyyy/mm/dd"") AS 作成年月日" strSQL = strSQL & vbNewLine & "FROM テーブルB INNER JOIN テーブルA ON テーブルB.依頼No.=テーブルA.実績No." strSQL = strSQL & vbNewLine & "WHERE (((テーブルA.年月日) Between " strSQL = strSQL & strStartDate strSQL = strSQL & strEndDate strSQL = strSQL & " AND ((テーブルA.CD) Not Like ""%KN%"") AND ((テーブルA.場所) Like ""*IO*"") AND ((テーブルA.フラグ) Is Null))" strSQL = strSQL & vbNewLine & "ORDER BY テーブルA.年月日;" '''''SQLビューの内容をそのまま''''' dbRes.Open strZisseki_SQL, dbCon, adOpenKeyset, adLockReadOnly 'レコードセット intField = dbRes.Fields.Count lngGyo = 1 dbRes.MoveFirst Do Until dbRes.EOF lngGyo = lngGyo + 1 lngCol = 0 For Each dbCol In dbRes.Fields lngCol = lngCol + 1 Cells(lngGyo, lngCol) = dbCol.Value Next dbCol dbRes.MoveNext Loop dbRes.Close: Set dbRes = Nothing End Sub

専門家に質問してみよう