2016-07-07 28 views
0

Ich führe SQL-Abfrage in Excel durch Excel-VBA & ADO. Ich parse das Ergebnis mit looping Dann finde ich, dass ich wissen muss, wie viele Datensätze sql wird vor dem Parsen des Ergebnisses.Wie legen Sie den Analyseergebnisbereich fest, ohne die Anzahl der Datensätze zu kennen?

In Wirklichkeit kenne ich nicht die Anzahl der Abfrage Ergebnis Datensätze vor dem Erstellen der Abfrage.

Irgendwelche Funktionen oder Methoden können mich wissen lassen, damit ich die Schleifenaussage anziehen kann?

(i haben Einsicht von .fields() .Properties(), aber nicht funktionieren)

Sub sbADO() 
Dim sSQLQry As String 
Dim ReturnArray 

Dim Conn As New ADODB.Connection 
Dim mrs As New ADODB.Recordset 

Dim DBPath As String, sconnect As String 



DBPath = ThisWorkbook.FullName 

'You can provide the full path of your external file as shown below 
'DBPath ="C:\InputData.xlsx" 

sconnect = "Provider=MSDASQL.1;DSN=Excel Files;DBQ=" & DBPath & ";HDR=Yes';" 

Conn.Open sconnect 
     sSQLSting = select ....' it is too long so i choose to skip 

    Set rs = Conn.Execute(sSQLSting) 



    Do While Not rs.EOF 




'Officer = rs.Fields(i).Value 
For j = 5 To 29 ' THIS IS THE MAIN CODE I NEED TO IMPROVE 
'worksheet1.Cells(7, 11) = rs.Properties.Count 
worksheet1.Cells(j, 1) = rs.Fields(0).Value 
worksheet1.Cells(j, 3) = rs.Fields(2).Value 
worksheet1.Cells(j, 4) = rs.Fields(3).Value 
worksheet1.Cells(j, 7) = rs.Fields(6).Value 



    ' Insert data to your worksheet here 




    rs.MoveNext 
Next j 


Loop 


rs.Close 




End Sub 

For j = 5 To 29 ' 
next j 

Dies ist der Bereich I gesetzt sollte, dass der Bereich der Arbeitsblatt-Parsing beeinflussen .There ist insgesamt 24 Nummern von Abfrage Datensatz Ergebnis in diesem Fall. Wenn ich j zu groß einstellen (z. B. zu 30), wird es 3021 Fehler-BOF & EOF sollte wahr werden. Daher sollte der Bereich die Nummern von Datensatz passen Gut .

+0

Sie müssen nur "j" innerhalb Ihrer Schleife "Do While Not rs.EOF" inkrementieren. Sie brauchen die 'For j ...' Schleife überhaupt nicht. –

+0

MS Excel Range unterstützt die 'CopyFromRecordset' Methode, was sehr praktisch ist. –

+0

@ Maciej Los kann ich 'CopyFromRecordset' nicht verwenden. Einige Spalten Ich muss Daten in Excel zu bewerten. Die SQL wird alle meine gespeicherten Daten zurückgesetzt – Vito

Antwort

1

Sie brauchen keine Schleife für j. Erhöhen Sie einfach j nach allen Zellenzuweisungen und vor dem Ende der do-Schleife.

Sub sbADO() 
    Dim sSQLQry As String 
    Dim ReturnArray 

    Dim Conn As New ADODB.Connection 
    Dim mrs As New ADODB.Recordset 

    Dim DBPath As String, sconnect As String 
    DBPath = ThisWorkbook.FullName 

    'You can provide the full path of your external file as shown below 
    'DBPath ="C:\InputData.xlsx" 

    sconnect = "Provider=MSDASQL.1;DSN=Excel Files;DBQ=" & DBPath & ";HDR=Yes';" 

    Conn.Open sconnect 
    sSQLSting = select .... ' it is too long so i choose to skip 

    Set rs = Conn.Execute(sSQLSting) 
    j = 5 
    Do While Not rs.EOF 
     'worksheet1.Cells(7, 11) = rs.Properties.Count 
     worksheet1.Cells(j, 1) = rs.Fields(0).Value 
     worksheet1.Cells(j, 3) = rs.Fields(2).Value 
     worksheet1.Cells(j, 4) = rs.Fields(3).Value 
     worksheet1.Cells(j, 7) = rs.Fields(6).Value 
     j = j + 1 
     rs.MoveNext 

    Loop 

    rs.Close 
End Sub 
+0

nur eine einfache Frage. Ist es nicht notwendig, vor dem Zuweisen der Variablen in VBA zu definieren (dim), im Gegensatz zu JAVA, c? I m bezieht sich auf die j – Vito

+0

Standardmäßig keine. Wenn Sie jedoch 'Option Explicit' an den Anfang des Codemoduls hinzufügen, müssen alle Variablen deklariert werden. Ich benutze immer "Option Explicit", es hilft dem Invoker, Fehler früh zu erkennen. –

+0

standardmäßig Nein, meinst du ganze Zahl? Kann es doppelt, lange speichern? – Vito