• 締切済み

Excel VBA ADODB

「Excel VBA ADODB」の本を手元にして、Excelのデータ処理を勉強しております。 以下の2つの例では、旨くいきますが、次の3番目では、エラーとなります。delete は、使えないのでしょうか? Const DATA_SOURCE = "Data Source=人事データ.xls;" Const DATA_SOURCE販売管理データ = "Data Source=販売管理データ.xls;" Const DATA_SOURCE商品マスタ = "Data Source=商品マスタ.xls;" Const ExProperties = "Extended Properties=Excel 8.0;" Sub SELECT文によるテーブル結合() ' 570 Dim myConn As New ADODB.Connection Dim myRS As New ADODB.Recordset Dim myField As Field, i As Long myConn.Open ConnectionString:="Provider=Microsoft.Jet.OLEDB.4.0; " & _ DATA_SOURCE販売管理データ & ExProperties ThisWorkbook.Activate Worksheets("570").Activate myRS.Open Source:="SELECT 売上No, 売上.商品コード, 商品名, 単価, 数量 FROM 売上 INNER JOIN 商品マスタ ON 売上.商品コード=商品マスタ.商品コード;", _ ActiveConnection:=myConn i = 1 For Each myField In myRS.Fields Cells(1, i).Value = myField.Name i = i + 1 Next myField Range(Cells(1, 1), Cells(1, i - 1)).Interior.ColorIndex = 35 Range("A2").CopyFromRecordset Data:=myRS myRS.Close: Set myRS = Nothing myConn.Close: Set myConn = Nothing End Sub Sub INSERT文によるレコード追加() ' 571 Dim myConn As New ADODB.Connection Dim myCmd As New ADODB.Command Dim myField As Field, i As Long myConn.Open ConnectionString:="Provider=Microsoft.Jet.OLEDB.4.0; " & _ DATA_SOURCE & ExProperties ThisWorkbook.Activate With myCmd .ActiveConnection = myConn .CommandText = "INSERT INTO 社員マスタ VALUES(11, '石川俊介', '大阪', 25);" .Execute ''' 追加は、範囲の下にデータがあってはいけない。 ''' 追加後、範囲名は広がらない。 ' .CommandText = "UPDATE 社員マスタ SET 所属支店='東京' WHERE 社員No=5;" End With Set myCmd = Nothing myConn.Close: Set myConn = Nothing End Sub Sub DELETE文によるレコード削除() ' 573 Dim myConn As New ADODB.Connection Dim myCmd As New ADODB.Command myConn.Open ConnectionString:="Provider=Microsoft.Jet.OLEDB.4.0; " & _ DATA_SOURCE & ExProperties ThisWorkbook.Activate With myCmd .ActiveConnection = myConn .CommandText = "DELETE FROM 社員マスタ WHERE 社員No=6;" .Execute End With Set myCmd = Nothing myConn.Close: Set myConn = Nothing End Sub

みんなの回答

  • nicotinism
  • ベストアンサー率70% (1019/1452)
回答No.1

多分できないと思います。下記はVB.NET & ADO.NETの場合ですが http://support.microsoft.com/kb/316934/ja 抜粋 『レコードの削除 Jet OLE DB プロバイダを使用すると、Excel ブックのレコードの挿入および更新はできますが、DELETE の操作を行うことはできません。1 件以上のレコードに対して DELETE 操作を実行しようとすると、次のエラー メッセージが表示されます。 この ISAM では、リンク テーブル内のデータを削除することはできません。 この制限事項は、Excel ブックをデータベースとして扱う場合に固有のものです。 』 当方、Excel2010なので、XLS(JET)、XLSX(ACE)で試しましたが、 『この ISAM では、リンク テーブル内のデータを削除することはできません。』 です。 JET/ACEを使っている時点でダメっぽい?ですね。

関連するQ&A

  • ACCESS VBA

    ACCESSで検索フォームを作りたいと思っています。 VBAを使って行きたいと思うのですが、うまくいきません。 希望としては、該当するレコードのデータを抽出したいです。 よろしくお願いいたします。 ※現段階でのソースを書いてみました。 最終的に行いたい処理とは違うのですが、根本的に間違っているようなので簡略化しました。 /------------------------------------------------/ Private Sub コマンド1_Click() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Dim sql As String '接続 Set cn = CurrentProject.Connection 'レコードセットを取得 Set rs = New ADODB.Recordset sql = "SELECT * FROM 従業員データ " & _ "WHERE 年齢=30" rs.Open sql, cn, adOpenDynamic, adLockReadOnly rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub /------------------------------------------------/

  • Newがどのような役割をしているのかわからない

    エクセルからアクセスの更新クエリを実行する際に エクセル側のコードで Sub ACCESSのアクションクエリを実行する() Dim cn As ADODB.Connection Dim myCmd As ADODB.Command Set cn = New ADODB.Connection Set myCmd = New ADODB.Command cn.Open "Provider = Microsoft.ACE.OLEDB.12.0;Data Source=" & strPath & ".accdb;Jet OLEDB:Database" だとうまくいきませんでしたが、 Dim cn As New ADODB.Connection にしたらうまくいきました。 Newを付けることによって成功したのですが、 Newがどのような役割をしているのかわからないので教えてください。

  • 教えて下さい。m(__)m

    ADODB6.1を使用し"smp2013*.xls"の"Sheet1"の列から"済"の数をカウントしたいのですが 列名に改行コード[ALT+Enter]があり、うまく取得できません。お助け下さい。 下記コードでは"0"と表示されます。(※エラー処理等は記述しておりません。) PC:Win7pro 64bit、Excel2010 32bit Sub smp_1() Dim myCon As New ADODB.Connection, myRS As New ADODB.Recordset, FileName As String Dim j As String, i As Integer Dim val_day As String val_day = "\\share01\12345\" FileName = Dir$("\\share01\12345\smp2013*.xls") myCon.Open "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;" & _ "Data Source=" & val_day & FileName j = "select count(*) from [Sheet1$] where ""H24"" & Chr(10) & ""決済"" = '済';"  '←ここです。 myRS.Open j, myCon Worksheets(1).Range("A1").CopyFromRecordset myRS myRS.Close Set myRS = Nothing myCon.Close Set myCon = Nothing End Sub

  • ADO1とADO2は意味は同じですか?

    Private Sub ADO1() Dim cn As New ADODB.Connection cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source= " & CurrentProject.FullName cn.Close: Set cn = Nothing End Sub Private Sub ADO2() Dim cn As ADODB.Connection Set cn = New ADODB.Connection cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & "Data Source= " & CurrentProject.FullName cn.Close: Set cn = Nothing End Sub は、 Dim cn As ADODB.Connection Set cn = New ADODB.Connection を簡素化したものが Dim cn As New ADODB.Connection になるのでしょうか?

  • アクセスVBA。ADO

    CSVから列を分割してテーブルにしたいかったので 下記のコードを記述しましたが、 Dim cn As ADODB.Connection Dim rs As New ADODB.Recordset Dim datacount As Long Set cn = New ADODB.Connection With cn .ConnectionString = "Provider=Microsoft.jet.OLEDB.4.0;Data Source=" & CurrentProject.Path & "\;" .Properties("Extended Properties").Value = "text;HDR=YES;" .Open End With Set rs = cn.Execute("SELECT * FROM 構成マスタ.csv") datacount = rs.Fields.Count For i = 0 To datacount strsql = "SELECT " & rs.Fields(i).Name & " INTO " & rs.Fields(i).Name & " FROM 構成マスタ.csv;" cn.Execute strsql Next i rs.Close cn.Close Set rs = Nothing Set cn = Nothing SQLを実行するところで、「日付エラー」となってしまいます。 データには特に日付等はないのでエラーになる原因がわかりません。 どなたかご教示いただけますでしょうか。

  • EXCEL→Access ADO接続

    お世話になります 現在ADOにてEXCEL側からAccessDBにアクセスし 値を取得しているのですが 現在下方向に貼り付けしているのですが 横方向に貼り付けさせる方法はありますか? 下記参考(現状VBAです) 現状:日付で絞込みをしています 日付け絞込みをしてヒットしたものに対して下方向に貼り付けています それを横方向に貼り付けさせたいのです Private Sub CommandButton1_Click() Dim myConn As ADODB.Connection Dim myRs As ADODB.Recordset Dim mySQL As String Dim myConstr As String Dim myDBFName As String Dim myPswd As String Dim tableName As String Dim orderDate As String Dim shipDate As String orderDate = Format(DateValue(DTPicker1.Value), "mm/dd/yyyy") shipDate = Format(DateValue(DTPicker2.Value), "mm/dd/yyyy") myDBFName = "Accessパス" myPswd = "" myConstr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" _ & myDBFName & ";Jet OLEDB:Database Password=" & myPswd & ";" mySQL =SQL文 Set myConn = New ADODB.Connection myConn.Open myConstr Set myRs = New ADODB.Recordset myRs.Open mySQL, myConn Worksheets("シート名").Range("開始セル名").CopyFromRecordset myRs myRs.Close Set myRs = Nothing myConn.Close Set myConn = Nothing Unload Me End Sub わかる方ご教授願います

  • VBAでUTF-8文字を読込、Excelに出力する方法

    タイトルの通りです。 簡単なプログラムを作ってみました。 このような事は出来ないのでしょうか。 教えてください。 宜しくお願いします。 ☆サンプルプログラム☆    ↓ Sub test() Dim Stm As Object Dim sText As String Const adCRLF = -1 Const adReadAll = -1 Const adTypeText = 1 sText = "あああ" Set Stm = CreateObject("ADODB.Stream") Stm.Open Stm.Charset = "UTF-8" Stm.WriteText sText ActiveSheet.Range("A1").Value = Stm.ReadText() Stm.Close Set Stm = Nothing End Sub

  • 【VBA】アタッチとデタッチについての認識

    VBAを勉強中の者です。カテ違いならすいません。 ******************************************************* Sub test1() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn = New ADODB.Connection Set rs = New ADODB.Recordset cn.Open "Provider=SQLOLEDB;Data Source=localhost\SQLEXPRESS; " & _ "Initial Catalog=" & データベース名 & ";" & _ "Integrated Security=SSPI" rs.Open "テーブル1", cn, adOpenStatic, adLockOptimistic MsgBox rs.RecordCount rs.Close: Set rs = Nothing cn.Close: Set cn = Nothing End Sub ******************************************************* このコードで アタッチは「Set cn = New ADODB.Connection」、 デタッチは「cn.Close: Set cn = Nothing」 になりますか? ご教授よろしくお願い致します。

  • VBAのfor next で繰り返しが出来ず・・・

    すいません1つ質問があります。 以前質問させて頂きましたが、ExcelのVlookupでACCESSのクエリを参照してレコードを取得したいです。 ADOでAccessのテーブルから持ってくることは出来ました。 が、繰り返しても最初の数字の9999しかもって来ません・・・。 下記が私の書いたコードとなります。 ExcelシートとACCESSテーブルを画像として添付します。 D2には9999、D3には55555・・・・と持ってくるようにしたいです。 原因と修正法を教えて頂ければ幸いです。 何卒よろしくお願いします。 Option Explicit Sub test() Dim db As ADODB.Connection Dim rs As ADODB.Recordset Dim strSQL As String Dim i As Long Dim Maxrow As Long Set db = New ADODB.Connection db.Provider = "Microsoft.ace.oledb.12.0" db.Open "C:\Users\Kei\Desktop\Test\Test.accdb" Set rs = New ADODB.Recordset rs.Open "Ship", db, adOpenStatic Maxrow = Sheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row For i = 2 To Maxrow strSQL = "select * from Ship where 商品名 =" & Cells(i, 1) & ";" Cells(i, 4) = rs!出荷数 Next i rs.Close db.Close Set db = Nothing Set rs = Nothing End Sub

  • ADO 「Set」は使ったほうがいいのでしょうか?

    Sub test1() Dim cn As ADODB.Connection Dim rs As ADODB.Recordset Set cn = New ADODB.Connection Set rs = New ADODB.Recordse End Sub Sub test2() Dim cn As New ADODB.Connection Dim rs As New ADODB.Recordset End Sub この二つは同じ意味ですか? 「Set」は使ったほうがいいのでしょうか? よろしくお願いします。

専門家に質問してみよう