Добавление данных для доступа из Excel VBA через цикл - PullRequest
0 голосов
/ 25 июня 2018

Интересно, если бы вы могли помочь.Я заполняю таблицу в Excel, которая имеет неопределенную длину (она увеличивается по мере добавления к ней людей).Этот неопределенный объем данных необходимо добавить в базу данных в Access с помощью кнопки в Excel.Я создал следующий код, чтобы попытаться облегчить это, но получил

Ошибка времени выполнения '3709': соединение не может быть использовано для выполнения этой операции.В этом контексте он либо закрыт, либо недействителен.

Когда я открываю отладку, он указывает на эту строку:

rs.Open sqlstr, DBCont

Это можно найти в приведенном ниже коде:

Sub submittoDB()
    Dim DBCont As Variant
    Set DBCont = CreateObject("ADODB.connection")
    Dim StrDBPath As String
    StrDBPath = "PATH Here\Database1.accdb"
    Dim sConn As String
    sConn = "Provider=Microsoft.ACE.OLEDB.12.0;" & _
        "Data Source=" & StrDBPath & ";" & _
        "Jet OLEDB:Engine Type=5;" & _
        "Persist Security Info=False;"
    DBCont.Open sConn
    MsgBox "Open DB"
    Dim rs As Object
    Set rs = CreateObject("ADODB.Recordset")
    Dim sqlstr As String
    Dim endlimit As Integer
    Dim i As Integer
    endlimit = Cells(Rows.Count, "H").End(xlUp).Row + 1
    'need to loop each line and remove test
    For i = 5 To endlimit
        sqlstr = "INSERT INTO DigiFinTracker (ProjectNo, ProjectName, Client, Tool, SuggAct, PercSav,PreDigCost,SuggSave,PropSav) VALUES ('" & Cells(6, 4) & "', '" _
        & Cells(5, 4) & "', '" & Cells(4, 4) & "', '" & Cells(i, 8) & "', '" & Cells(i, 9) & "', '" & Cells(i, 10) _
        & "', '" & Cells(i, 11) & "', '" & Cells(i, 12) & "', '" & Cells(i, 13) & "')"
        rs.Open sqlstr, DBCont
        DBCont.Close
    Next i
    DBCont.Close
End Sub

Извинения, если ответ довольно упрощенный или я что-то упускаю, я не могу понять, что не так, ивозможно ли зацикливание этого типа процесса.

Большое спасибо за ответы заранее!

1 Ответ

0 голосов
/ 25 июня 2018

В цикле вы закрываете соединение на каждой итерации - DBCont.Close.Таким образом, он не работает на второй итерации.

Либо удалите DBCont.Close из цикла (рекомендуется), либо открывайте его каждый раз и удаляйте DBCont.Open sConn перед циклом:

For i = 5 To endlimit
    DBCont.Open sConn   'It would work better if you delete this line
    sqlstr = "INSERT INTO DigiFinTracker (ProjectNo, ProjectName, Client, Tool, SuggAct, PercSav,PreDigCost,SuggSave,PropSav) VALUES ('" & Cells(6, 4) & "', '" _
    & Cells(5, 4) & "', '" & Cells(4, 4) & "', '" & Cells(i, 8) & "', '" & Cells(i, 9) & "', '" & Cells(i, 10) _
    & "', '" & Cells(i, 11) & "', '" & Cells(i, 12) & "', '" & Cells(i, 13) & "')"
    rs.Open sqlstr, DBCont  
    DBCont.Close        'And delete this line as well
Next i

Чтобы увидеть, что является причиной несоответствия данных, попробуйте следующее:

sqlstr = "INSERT INTO DigiFinTracker (ProjectNo, ProjectName, Client, Tool, SuggAct, PercSav,PreDigCost,SuggSave,PropSav) VALUES ('" & Cells(6, 4) & "', '" _
& Cells(5, 4) & "', '" & Cells(4, 4) & "', '" & Cells(i, 8) & "', '" & Cells(i, 9) & "', '" & Cells(i, 10) _
& "', '" & Cells(i, 11) & "', '" & Cells(i, 12) & "', '" & Cells(i, 13) & "')"
 Debug.Print sqlstr
  • взгляните на ближайшее окно ( Ctrl + G , чтобы открыть);
  • скопируйте оттуда инструкцию SQL;
  • вставьте ее в Access и работайте , пока не получите какой-либо результат из запроса;
...