アクセステーブルをExcelから更新しようとするとかなりの時間がかかります。私はADOB Connectionを使用しており、更新があるスプレッドシートをループしています。これは、200レコードから1000レコードまでです。Excel 2010からテーブルをExcel VBAから更新する1レコードのみを更新する
次のコードを実行すると、テストデータから1047レコードが更新されているにもかかわらず、アクセステーブルのレコードが1つだけ更新されます。
62個の列を持つ販売記録を更新しています。カラム「BI」は、引用の際に生成される固有のIDである。更新が指定しているのは、列BI(sQID)のIDに基づいて、QorB列のデータをQからBに変更することです。
モジュールが実行された後、アクセスDBはレコードが1つしか変わっていないことを示しています。私は迷っています。
誰もが以下のコードで何か劇的に間違っているのを見ることができますか? Excelから大量のデータを使ってアクセスを更新するより良い方法はありますか?
Sub updatedbtest2()
Dim cn As ADODB.Connection, rs As ADODB.Recordset
Dim rng As Range
Dim lngRow As Long
Dim lngID, LR, Upd
Dim sSQL As String
'Get Last Row of range used
LR = Range("BI" & Rows.Count).End(xlUp).Row
Upd = LR - 1
lngRow = 2
Do While lngRow <= LR
lngID = Cells(lngRow, 61).Value
Set cn = New ADODB.Connection
cn.Open "Provider = Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=C:\Database\sales.accdb;"
sQID = Cells(2, 61).Value
Set rs = New ADODB.Recordset
sSQL = "SELECT * FROM P&R WHERE QuoteID ='" & sQID & "';"
rs.Open Source:=sSQL, ActiveConnection:=cn, LockType:=adLockOptimistic
' update fields within table with values from spreadsheet.
With rs
.Fields("QorB") = Cells(lngRow, 60).Value
.Fields("BDate") = Cells(lngRow, 62).Value
.update
End With
rs.update
'Next rng
lngRow = lngRow + 1
rs.Close
Set rs = Nothing
cn.Close
Set cn = Nothing
Loop
MsgBox "You just updated " & Upd & " records"
End Sub
ありがとうございます。
私は、同じ正確な結果を持つ提案から次のコードに変更を加えました。
Snip of Access showing records
Sub updatedbtest2()
Dim cn As ADODB.Connection, rs As ADODB.Recordset
Dim rng As Range
Dim lngRow As Long
Dim sQID, LR
Dim sSQL As String
LR = Range("A" & Rows.Count).End(xlUp).Row
Debug.Print LR
Upd = LR - 1
lngRow = 2
sQID = Cells(lngRow, 61).Value
'Do While lngRow <= LR
Set cn = New ADODB.Connection
cn.Open "Provider = Microsoft.ACE.OLEDB.12.0;" & _
"Data Source=C:\Database\sales.accdb;"
Set rs = New ADODB.Recordset
sSQL = "SELECT * FROM PandR WHERE QID ='" & sQID & "';"
rs.Open Source:=sSQL, ActiveConnection:=cn, LockType:=adLockOptimistic
Do While lngRow <= LR
With rs
.Fields("QorB") = Cells(lngRow, 60).Value
.Fields("BDate") = Cells(lngRow, 62).Value
.update
End With
'Next rng
lngRow = lngRow + 1
Loop
rs.Close
Set rs = Nothing
cn.Close
Set cn = Nothing
End Sub
が、それは文字通り一つだけ変更されたレコードを示しているのですか?あなたが文字通り各反復でデータベースを開いたり閉じたりするので、1レコードが変更されたということだけです(これは必要ではなく、おそらくコードの速度が遅くなります)。 ADODB内のデータをExcelから取得してID列に結合した「UPDATE QUERY」を書く方法はありませんか?もっと簡単になり、何千もの行をループするだろうと私は思う。 –
メッセージボックスに更新されたレコードが1047件表示されます。私がアクセステーブルに行き、最初のレコードが値を更新した唯一のレコードであることを確認します。 – cb122
私は今あなたの問題を見ると思います。この行は 'sQID = Cells(2,61).Value'は' sQID = Cells(lngRow、61).Value'でなければなりません。今は各ループで同じ 'sQID'を設定しています。そのため、最初のレコードだけが更新されています。 'lngID = Cells(lngRow、61).Value'と 'Upd'変数は決して何の値も設定されていないので、 'Msgbox'は' You just updated records'を返すと思います。 –