2010-11-16 9 views
8

Używam programu Excel do pobierania danych z bazy danych SQL. Użyłem kodu z innego pytania SO i działa dobrze. Teraz chcę pobrać nazwy kolumn z tabeli oprócz faktycznego stołu. Doszedłem do wniosku, że mogę uzyskać nazwy używając pętli For Each fld. Jednak wciąż istnieje kwestia zaludnienia ich poziomo w wierszu w programie Excel, ponieważ liczba kolumn może się zmienić - tak myślę, że potrzebowałbym innego dla każdej pętli również lub czegoś podobnego.Ciągnięcie nazw kolumn do programu Excel z zapytania SQL

Sub GetDataFromADO() 

'Declare variables' 
    Set objMyConn = New ADODB.Connection 
    Set objMyCmd = New ADODB.Command 
    Set objMyRecordset = New ADODB.Recordset 

'Open Connection' 
    objMyConn.ConnectionString = "Provider=SQLOLEDB;Data Source=localhost;User ID=abc;Password=abc;" 
    objMyConn.Open 

'Set and Excecute SQL Command' 
    Set objMyCmd.ActiveConnection = objMyConn 
    objMyCmd.CommandText = "select * from myTable" 
    objMyCmd.CommandType = adCmdText 
    objMyCmd.Execute 

'Loop Names' 
    ' WHAT TO DO HERE????' 

'Open Recordset' 
    Set objMyRecordset.ActiveConnection = objMyConn 
    objMyRecordset.Open objMyCmd 

'Copy Data to Excel' 
    ActiveSheet.Range("A1").CopyFromRecordset (objMyRecordset) 

End Sub 
+0

Nie chcesz, żeby nagłówki były wyrównane z danymi? Dane zaczynają się w A1, ale wydajesz się ustawić zakres nagłówka na A4. –

+0

Tak, masz rację - zła kopia i wklej z mojej strony. – firedrawndagger

Odpowiedz

11

Ok, więc wymyśliłem to po 4 próbach, oto kod dla pętli.

'Loop' 
Dim FieldRange As Range 
Set FieldRange = Range("A4") 
Set TableColumns = Range("A4:H4") 
x = 1 

Range("A4").Select 

For Each fld in objMyRecordset.Fields 
     ActiveCell.Value = fld.Name 
     ActiveCell.Offset(0, x).Select 
     x = x + 1 'tick iterator 
Next 

ActiveSheet.Range("A5").CopyFromRecordset objMyRecordset 
Range("A4").Select 
+1

Nie musisz zaznaczać, że Cell używa czegoś w rodzaju 'Range (" A4 ") OffSet (0, x) .value = fld.Name' –

19

Mój zwykły kod jest bardzo podobny:

For intColIndex = 0 To objMyRecordset.Fields.Count - 1 
    Range("A4").Offset(0, intColIndex).Value = objMyRecordset.Fields(intColIndex).Name 
Next 
+0

Podoba mi się" krótkość "twojego rozwiązania. Po prostu rozszerzyłem go nieco, aby ustawić nagłówki na Bold. –

+1

Jestem zaskoczony brakiem rozwiązania, które nie ucieka się do pętli. – mvbentes

6

Żeby było bardzo proste, coś jak to zrobić (przy użyciu Arkusz1 i recordset r)

For i = 0 To r.Fields.Count - 1 
     Sheet1.Cells(1, i + 1) = r.Fields(i).Name 
    Next i 
3

można po prostu ustawić swój "x" zmienna na 0, a następnie coś takiego:

x = 0 

For Each Field In RS.Fields 'RS being my Recordset variable 
    Range("A3").Offset(0, x).Value = Field.Name 
    x = x + 1 
Next Field 

A to ułatwi czytanie ... :)

Powiązane problemy