2016-04-05 10 views
0

Ich versuche Excel-Zellen durchlaufen, um Wert von SQL Server-Tabelle zu erhalten. Ich habe ein Makro geschrieben, das die Jobnummer aus der Excel- und SQL Server-Abfrage nimmt, um Kundendetails zu erhalten und sie in die Tabelle zu schreiben. Bis jetzt bin ich nur in der Lage, Daten für einzelne Zelle zu erhalten. Wie kann ich die Excel-Zellen für mehr als eine Jobnummer durchlaufen. Ich bin neu in VBA. Danke für Ihre Hilfe. Hier ist mein Makro:Schleife durch Excel-Tabelle mit Makro

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

Antwort

1

Sie können dies tun, indem Sie die SQL-Anweisung in Verwendung:

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

Daher müssen Sie eine Schleife durch alle Kunden in Spalte A Ihre Tabelle und ändern Sie die SQL-Anfrage zur Verwendung der oben genannten Anweisung:

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 - Vielen Dank für Ihre Antwort. Ich habe versucht, den von Ihnen vorgeschlagenen Code zu verwenden. Ich bekomme eine Fehlermeldung. Laufzeitfehler -2147217900 (80040e14) Automatisierungsfehler – LearningMacro

+0

Bei welcher Zeile wirft es den Fehler? – Ichixgo

+0

@ lchixgo-Ich bekomme eine Fehlermeldung in dieser Zeile. Setze rs = conn.Execute ("SELECT customer FROM job_tab wo jobnum2 IN" & newrow & "'; ") – LearningMacro