- 締切済み
EXCELVBAでADOにてデータ更新(削除)がうまくいかない。
EXCELファイル(DB.XLS)とEXCELファイル(入力.XLS)を用意し、入力.XLSからデータベース.XLSへ更新処理を行いたいのですが削除処理がうまくいきません。 現状はADOにて表示、追加、修正、削除をしようと考えており下記記述(1)で削除処理を書いているのですが「クエリーが複雑すぎます。」エラーが発生しています。 又、別削除処理としてDim MYCMD As ADODB.CommandからMYCMD.CommandText = "DELETE FROM [データベース$] WHERE 日付 = " & Range("D4")でMYCMD.Executeしても行削除ができません。 これはhttp://support.microsoft.com/default.aspx?scid=kb;ja;257819にも記載があるように仕様なのかもしれませんが・・・ ただ、Worksheets("データベース").Rows(2).Deleteのように同一のブック内にデータベースがあれば削除可能でした。 別ファイル(DB.xls)の行削除はできないのでしょうか?特にADOでなくてもかまいませんが、できるだけOS側の設定は手動設定させたくないです。 OS:WindwsXP SP2 ソフト:Microsoft Excel2003 ※表示(select)、追加(.AddNew)は下記記述(1)と少し異なりますが可能でした。 ''入力.XLSの記述(1) ''**********削除処理2 ADO[Microsoft.Jet.OLEDB.4.0] クエリーが複雑すぎますのエラー Dim strCn As String Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim test_sql As String strCn = "Provider=Microsoft.Jet.OLEDB.4.0;" & _ "Data Source=" & ThisWorkbook.Path & "\DB.xls;" & _ "Extended Properties=Excel 8.0" Set cn = New ADODB.Connection cn.Open strCn Set rs = New ADODB.RecordsetEXCEL With rs .CursorLocation = adUseClient .Open "Select * from [データベース$]", cn, adOpenStatic, adLockOptimistic Do test_sql = "日付 = " & Range("D4") rs.Find test_sql If rs.EOF = True Then Exit Do rs.Delete 'ここでエラー Loop .Update .Close End With Set rs = Nothing cn.Close Set cn = Nothing ''***********
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- onlyrom
- ベストアンサー率59% (228/384)
DB.xlsを表示させたくないということのみであれば ADOを使わなくても以下のようにすれば非表示のように見えます '------------------------------------------------- Sub test() Dim R As Long Dim myDB As Workbook Application.ScreenUpdating = False Set myDB = Workbooks.Open(ThisWorkbook.Path & "\DB.xls") ThisWorkbook.Activate With myDB.Sheets("データベース") For R = .Range("A65536").End(xlUp).Row To 2 Step -1 If .Cells(R, "A").Value = Range("D4").Value Then .Rows(R).Delete xlShiftUp End If Next R End With Application.DisplayAlerts = False myDB.Save myDB.Close Application.DisplayAlerts = True Application.ScreenUpdating = True End Sub '--------------------------------------- どうしてもADOを使いたければ修正はできるわけですから 該当レコードの各フィールドに、Nullをセットしておます こうすると、該当行のセルには値が無いことになりますので 次回(常に)DB.xlsを開くときに、SORTすると その空白行は最後の方へ表示されます。 何れにしろADOを使うより、DB.xlsの非表示の方が簡単です。