2015-07-24 13 views
0

Мне нужно экспортировать содержимое таблицы для добавления в таблицу базы данных доступа (оба 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 
+0

Вы пробовали переходить через свой код с помощью отладчика, чтобы узнать, введен ли цикл и итерации, как вы ожидали? Вместо того, чтобы работать с набором записей, вы можете попробовать выполнить quiries SQL для добавления данных. – Evan

+0

@Evan Спасибо за ответ. Извините за поздний ответ, но это были выходные. Я попробую то, что вы предлагаете – AJF

+0

@Evan Спасибо. Я решил это. Ваш совет работал, поскольку я обнаружил, что это была глупая ошибка, и мой код для вычисления последней строки возвращал значение 1, и поэтому внешний цикл for не запускался один раз. – AJF

ответ

1

Вы можете проверить это поле, чтобы узнать, является ли оно полем автоматического приращения, прежде чем пытаться записать значение для него. Попробуйте следующий код, который работает хорошо для меня (Excel 2007, но Access 2010)

For i = 2 To lastRow 

    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 

Использования TRUE/FALSE для последней колонки листа Excel отлично работает для меня.

+0

Спасибо. Извините за поздний ответ, но это были выходные. Я пробовал то, что вы предложили, но результат тот же – AJF

+0

Спасибо. Я решил это. Мой код для вычисления последней строки был неправильным, и внешний цикл for не работал один раз в результате. Ваш «ISAUTOINCREMENT» тоже помог, так как теперь он также обрабатывает номер авто. Я обновлю вопрос, чтобы показать мои изменения – AJF

Смежные вопросы