Страницы: 1
RSS
Обновление базы данных Access (accdb) данными из Excel макросом
 
Привет всем!

Недавно попытался написать код обновления базы данных Access (accdb) данными из Excel макросом, который находится в Excel (примеры во вложенных файлах). Но при выполнении появляется ошибка  Run-time error '3704':Операция не допускается, если объект закрыт. Пробовал добавить SET NOCOUNT ON в SQL-запрос, но получил ошибку синтаксиса SQL.
Как исправить ошибку 3704?
Правильные ли я подключил библиотеки:
Microsoft Access 15.0 Object Libray
Microsoft ActiveX Data Objects 2.8 Library
Microsoft ActiveX Data Objects Recordset 6.0 Library?

Правильный ли выбрал Provider=Microsoft.ACE.OLEDB.12.0?
OC - Windows 7 SP 1 64-bit, Office - 2016.
Подскажите, пожалуйста.

Вот код:
Код
Option Explicit
Dim EA As Excel.Application
Dim WB As Excel.Workbook
Dim WS As Excel.Worksheet
Dim strValue$, idcode&, strSQL$
Dim cn As ADODB.Connection
Dim rs As ADODB.Recordset

Public Sub transferAccPr()

Set EA = Excel.Application

EA.ScreenUpdating = False
EA.DisplayAlerts = False
EA.StatusBar = False

Set EA = Excel.Application
Set WB = EA.Workbooks("TestExcel.xlsm")
Set WS = WB.Worksheets("Лист1")

Set cn = New ADODB.Connection
cn.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\TestAccessBD.accdb;"
cn.Open

strValue = WS.Cells(2, 2).Value
idcode = WS.Cells(2, 1).Value

'strSQL = "SET NOCOUNT ON UPDATE Products SET [Item] = " & " '" & strValue & "'" & " WHERE Products.[CodeId]= 4"
strSQL = "UPDATE Products SET [Item] = " & " '" & strValue & "'" & " WHERE Products.[CodeId]= 4"

Set rs = cn.Execute(strSQL)

rs.Close

cn.Close

EA.ScreenUpdating = True
EA.DisplayAlerts = True

End Sub
Изменено: BretHard120 - 22.02.2017 09:06:25
 
Доброе время суток.
Цитата
BretHard120 написал:
SET NOCOUNT ON в SQL-запрос, но получил ошибку синтаксиса SQL.
А чего вы собственно хотели? Применить диалект T-SQL к диалекту Access SQL :)  
Может стоит проще? Сразу обновить?
Код
Public Sub TestUpdate()
    Const conStr As String = "Provider=Microsoft.ACE.OLEDB.12.0;Mode=16;Data Source=$1;Extended Properties='Excel 12.0;HDR=YES';"
    Dim pConn As New ADODB.Connection
    Dim sSQL As String
    
    sSQL = "Update [;Database=" & ThisWorkbook.Path & "\TestAccessBD.accdb].[Products] TDest"
    sSQL = sSQL & " Inner Join [" & ThisWorkbook.Worksheets(1).Name & "$] TSource"
    sSQL = sSQL & " On (TDest.CodeId = TSource.CodeId)"
    sSQL = sSQL & " Set [TDest].[Item] = [TSource].[Item];"
    pConn.Open Replace$(conStr, "$1", ThisWorkbook.FullName)
    pConn.Execute sSQL, Options:=adExecuteNoRecords
    pConn.Close
    Set pConn = Nothing
End Sub

Успехов.
 
Цитата
Андрей VG написал:
Может стоит проще? Сразу обновить?
Спасибо, помогло.
Страницы: 1
Наверх