.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.