. Ссылка на выпуск VBA - PullRequest
       11

. Ссылка на выпуск VBA

0 голосов
/ 02 декабря 2011

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

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

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

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

Как мне квалифицировать .Cells сейчас?Или есть альтернатива?Я использую 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 ]

5 голосов
/ 02 декабря 2011

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

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

и т. Д.

1 голос
/ 02 декабря 2011

Как я могу квалифицироваться. Клетки сейчас?Или есть альтернатива?

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

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

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

 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...