.Cell Справочный номер VBA

У меня есть этот VBA ниже, который предназначен для прокрутки каждого WS и вставки четырех верхних рядов каждого набора данных.

Это прекрасно работает внутри a, но это позволяет мне указывать только один лист, а не просматривать их все. Я взял его и получил "Недопустимую или неквалифицированную ссылку". После этого я добавил ActiveSheet. к методу "Ячейки".

Теперь я получаю эту ошибку ниже:

"Драйвер ODBC не поддерживает запрашиваемые свойства"

Как мне квалифицироваться? Или есть альтернатива? Я использую excel 2010 и mysql.

Public Function InsertData()
Dim rs As ADODB.Recordset
Dim oConn As ADODB.Connection
Dim WS As Worksheet
Dim strsql As String
Set rs = New ADODB.Recordset Set oConn = New ADODB.Connection
oConn.Open "DRIVER={MySQL ODBC 5.1 Driver};" & _ "SERVER=server.host.com;" & _ "DATABASE=datatime;" & _ "USER=boulders;" & _ "PASSWORD=rocks;" & _ "Option=3"
For Each WS In ActiveWorkbook.Worksheets For rowcursor = 4 To 8 strsql = "INSERT INTO workflow_metrics (id, code) " & _ "VALUES (" & (ActiveSheet.Cells(rowcursor, 1)) & "," & _ "'" & (ActiveSheet.Cells(rowcursor, 2)) & "')" rs.Open strsql, oConn, adOpenDynamic, adLockOptimistic Next
Next WS
End Function
2 ответа

Я думаю, вы хотите:

Param1.Value = WS.Cells(rowcursor, 1)

и т.п.


Как мне квалифицироваться? Или есть альтернатива?

Это не проблема. Проблема заключается в том, что вы пытаетесь открыть набор записей (rs.open) с помощью запроса модификации данных (INSERT).

Для DML вы хотите использовать ADODB.Command.Execute.

Также, если у вас нет контроля над значениями в электронной таблице, вы открываете себе атаку SQL Injection Attack. Вместо этого вы должны использовать параметризованный запрос.

Dim Cmd As ADODB.Command Set Cmd = New ADODB.Command Cmd.ActiveConnection = oConn Cmd.CommandText = "INSERT INTO workflow_metrics (id, code) VALUES (?,?)" Set Param1 = Cmd.CreateParameter(, adInteger, adParamInput, 5) Set Param2 = Cmd.CreateParameter(, adInteger, adParamInput, 5) For Each WS In ActiveWorkbook.Worksheets For rowcursor = 4 To 8 Param1.Value = WS.Cells(rowcursor, 1) 'As Doug Glancy this should be WS not ActiveSheet' Param2.Value = WS.Cells(rowcursor, 2) cmd1.Execute Next Next WS

licensed under cc by-sa 3.0 with attribution.