12
votes

Tirer des noms de colonne dans Excel de la requête SQL

J'utilise Excel pour tirer des données d'un DB SQL. J'ai utilisé le code d'une autre question et cela fonctionne bien. Maintenant, je veux tirer dans les noms de colonne d'une table en plus de la table réelle. J'ai compris que je pouvais obtenir les noms à l'aide de la boucle de chaque fld. Cependant, il reste encore le problème de les peupler horizontalement d'une ligne d'Excel, car le nombre de colonnes pourrait changer - donc je pense que j'aurais besoin d'une autre pour chaque boucle également ou quelque chose de similaire.

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


2 commentaires

Vous ne voulez pas que les en-têtes alignent les données? Les données commencent dans A1, mais vous semblez avoir réglé la plage d'en-tête sur A4.


Ouais tu as raison - mauvaise copie et coller de ma part.


4 Réponses :


12
votes

OK Alors 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 commentaires

Vous n'avez pas besoin de sélectionner la cellule d'utiliser quelque chose comme plage ("A4"). Décalage (0, x) .value = fld.name



23
votes

Mon code habituel est très similaire: xxx


2 commentaires

J'aime la "criblesse" de votre solution. Je viens de l'élargir un peu pour régler les en-têtes en gras.


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



8
votes

Pour le rendre super simple, faites quelque chose comme ceci (à l'aide de la feuille1 et de l'enregistrement R) xxx


0 commentaires

3
votes

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

et cela facilitera un peu plus facile de lire ... :)


1 commentaires

Cette réponse n'est-elle pas au lieu d'ADO?