2010-11-16 26 views
8

J'utilise Excel pour extraire des données d'une base de données SQL. J'ai utilisé le code d'une autre question SO et ça fonctionne bien. Maintenant, je veux tirer les noms de colonnes d'une table en plus de la table réelle. J'ai compris que je pourrais obtenir les noms en utilisant la boucle For Each Fld. Cependant, il y a toujours le problème de les remplir horizontalement dans Excel dans la mesure où le nombre de colonnes peut changer - donc je pense que j'aurais besoin d'un autre pour chaque boucle ou quelque chose de similaire.Extraction de noms de colonnes dans Excel à partir d'une requête 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

Vous ne voulez pas les en-têtes alignés avec les données? Les données commencent dans A1, mais vous semblez avoir défini la plage d'en-tête sur A4. –

+0

ouais vous avez raison - mauvaise copie et coller de ma part. – firedrawndagger

Répondre

11

Ok donc je l'ai compris après 4 tentatives, voici le code de la boucle.

'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

Vous n'avez pas besoin de sélectionner la cellule quelque chose comme 'Range (" A4 "). OffSet (0, x) .value = fld.Name' –

19

Mon code habituel est très similaire:

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

J'aime la" brièveté "de votre solution. Je l'ai juste élargi un peu pour mettre les en-têtes à Bold. –

+1

Je suis déconcerté par l'absence d'une solution qui ne recourt pas à une boucle. – mvbentes

6

Pour le rendre super simple, faire quelque chose comme ça (en utilisant Sheet1 recordset et r)

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

Vous pouvez simplement définir votre "x" variable à 0, puis faire quelque chose comme:

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 

Et cela rendra un peu plus facile à lire ... :)