Мне нужно экспортировать содержимое таблицы для добавления в таблицу базы данных доступа (оба 2007), и я пытаюсь запустить ее из модуля в электронной таблице Excel. В таблице есть первичный ключ, который является автономерным, и я попытался запустить модуль ниже с и без пустого первого столбца в электронной таблице, чтобы сопоставить столбцы таблицы с столбцами таблицы. Также конечным полем в таблице является флажок Y \ N, и я сделал последний столбец в значениях таблицы ИСТИНА и ЛОЖЬ. Но когда я запускаю модуль, я получаю msgbox «Finished», но таблица не обновляется. Как электронная таблица, так и база данных находятся в местоположении C :. Что я делаю не так?Экспорт из Excel в Access 2007 с помощью Excel VBA
Private Sub AddData()
Dim strMyPath As String, strDBName As String, strDB As String, strSQL
As String
Dim i As Long, n As Long, lastRow As Long, lFieldCount As Long
Dim adoRecSet As New ADODB.Recordset
Dim connDB As New ADODB.Connection
strDBName = "CMDB.mdb"
strMyPath = ThisWorkbook.Path
strDB = strMyPath & "\" & strDBName
"Microsoft.ACE.OLEDB.12.0". The ACE Provider can be used for both the
Access .mdb & .accdb files.
connDB.Open ConnectionString:="Provider = Microsoft.ACE.OLEDB.12.0;
data source=" & strDB
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets(18)
Set adoRecSet = New ADODB.Recordset
strTable = "Asset_Table"
adoRecSet.Open Source:=strTable, ActiveConnection:=connDB,
CursorType:=adOpenStatic, LockType:=adLockOptimistic
lFieldCount = adoRecSet.Fields.Count
'determine last data row in the worksheet:
lastRow = ws.Cells(Rows.Count, "A").End(xlUp).Row
For i = 2 To lastRow
adoRecSet.AddNew
For n = 0 To lFieldCount - 1
adoRecSet.Fields(n).Value = ws.Cells(i, n + 1)
Next n
adoRecSet.Update
Next i
adoRecSet.Close
connDB.Close
Set adoRecSet = Nothing
Set connDB = Nothing
MsgBox "Finished"
End Sub
EDIT: советы Эванса и ChipsLetten ниже помогли и я решить это. Я изменил подсчет количества строк и добавил в If, чтобы иметь дело с автоматическим номером, поскольку Чипы предложили следующее.
Dim b As Long
b = ws.UsedRange.Rows.Count
For i = 2 To b - 1
adoRecSet.AddNew
For n = 0 To lFieldCount - 1
If Not adoRecSet.Fields(n).Properties("ISAUTOINCREMENT") Then
adoRecSet.Fields(n).Value = ws.Cells(i, n + 1).Value
End If
Next n
adoRecSet.Update
Next i
Вы пробовали переходить через свой код с помощью отладчика, чтобы узнать, введен ли цикл и итерации, как вы ожидали? Вместо того, чтобы работать с набором записей, вы можете попробовать выполнить quiries SQL для добавления данных. – Evan
@Evan Спасибо за ответ. Извините за поздний ответ, но это были выходные. Я попробую то, что вы предлагаете – AJF
@Evan Спасибо. Я решил это. Ваш совет работал, поскольку я обнаружил, что это была глупая ошибка, и мой код для вычисления последней строки возвращал значение 1, и поэтому внешний цикл for не запускался один раз. – AJF