2016-04-05 2 views
0

Я пытаюсь выполнить цикл через ячейки excel, чтобы получить значение из таблицы sql server. Я написал макрос, который будет брать номер задания из истории Excel и запросов sql server, чтобы получить информацию о клиенте и выгрузить его в электронную таблицу. Пока я могу получить данные только для одной ячейки. Как я могу прокручивать ячейки excel для более чем одного номера задания. Я новичок в VBA. Спасибо за вашу помощь. Вот мой макрос:Цикл через таблицу Excel с использованием макроса

Sub ConnectSqlServer() 

Dim conn As ADODB.Connection 
Dim rs As ADODB.Recordset 
Dim sConnString As String 
Dim newrow As String 



newrow = Worksheets("Sheet1").Cells(1, "A").Value 

' Create the connection string. 
sConnString = "Provider=SQLOLEDB;Data Source=0.0.0.0;" & _ 
       "Initial Catalog=asset;" & _ 
       "User ID=Temp;Password=test123;" 

' Create the Connection and Recordset objects. 
Set conn = New ADODB.Connection 
Set rs = New ADODB.Recordset 

' Open the connection and execute. 
conn.Open sConnString 
Set rs = conn.Execute("SELECT customer FROM job_tab where jobnum2='" & Trim(newrow) & "';") 

' Check we have data. 
If Not rs.EOF Then 
    ' Transfer result. 
    Sheets(1).Range("B1").CopyFromRecordset rs 
' Close the recordset 
    rs.Close 
Else 
    MsgBox "Error: No records returned.", vbCritical 
End If 

' Clean up 
If CBool(conn.State And adStateOpen) Then conn.Close 
Set conn = Nothing 
Set rs = Nothing 

End Sub

ответ

1

Вы можете сделать это, используя SQL заявление в:

SELECT customer FROM job_tab WHERE jobnum2 IN ('Value1', 'Value2', ...); 

Поэтому вы должны перебрать все клиенты в колонке А таблицу и изменить запрос SQL для использования вышеуказанного заявления:

Sub ConnectSqlServer() 

Dim conn As ADODB.Connection 
Dim rs As ADODB.Recordset 
Dim sConnString As String 
Dim newrow As String 


'MODIFIED: create the search string for the IN-Statement 
newrow = "(" 
For i = 1 To Worksheets("Sheet1").Cells(Worksheets("Sheet1").Rows.Count, "A").End(xlUp).Row 
    newrow = newrow & "'" & Trim(Worksheets("Sheet1").Cells(i, "A").value) & "'," 
Next i 
newrow = Left(newrow, Len(newrow) - 1) 
newrow = newrow & ")" 

' Create the connection string. 
sConnString = "Provider=SQLOLEDB;Data Source=0.0.0.0;" & _ 
       "Initial Catalog=asset;" & _ 
       "User ID=Temp;Password=test123;" 

' Create the Connection and Recordset objects. 
Set conn = New ADODB.Connection 
Set rs = New ADODB.Recordset 

' Open the connection and execute. 
conn.Open sConnString 
'MODIFIED: altered the SQL statement to use the search string with IN 
Set rs = conn.Execute("SELECT customer FROM job_tab where jobnum2 IN " & newrow & "';") 

' Check we have data. 
If Not rs.EOF Then 
    ' Transfer result. 
    Sheets(1).Range("B1").CopyFromRecordset rs 
' Close the recordset 
    rs.Close 
Else 
    MsgBox "Error: No records returned.", vbCritical 
End If 

' Clean up 
If CBool(conn.State And adStateOpen) Then conn.Close 
Set conn = Nothing 
Set rs = Nothing 
End Sub 
+0

@lchixgo - Спасибо за ваш ответ. Я попытался использовать код, который вы предложили. Я получаю ниже сообщения об ошибке. Ошибка выполнения -2147217900 (80040e14) Ошибка автоматизации – LearningMacro

+0

На какой строке она выдает ошибку? – Ichixgo

+0

@ lchixgo-Я получаю сообщение об ошибке в этой строке. Установите rs = conn.Execute («SELECT customer FROM job_tab where jobnum2 IN» & newrow & "'; ») – LearningMacro