2010-11-16 11 views
8

Estoy usando Excel para extraer datos de un SQL db. Utilicé el código de otra pregunta SO y funciona bien. Ahora quiero incluir los nombres de columna de una tabla además de la tabla actual. Descubrí que podía obtener los nombres usando el ciclo For Each fld. Sin embargo, todavía existe la cuestión de rellenarlos horizontalmente en una fila en Excel, ya que el número de columnas podría cambiar, por lo que estoy pensando que necesitaría otro para cada ciclo también o algo similar.Extracción de nombres de columna en Excel desde la consulta 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

¿No quieres que los encabezados estén alineados con los datos? Los datos comienzan en A1, pero parece que ha establecido el rango de encabezado en A4. –

+0

sí, tienes razón, copiar y pegar mal de mi parte. – firedrawndagger

Respuesta

11

Ok, así que me di cuenta después de 4 intentos, aquí está el código para el ciclo.

'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

No necesita seleccionar la Celda para usar algo como 'Rango (" A4 "). OffSet (0, x) .value = fld.Name' –

19

Mi código usual es muy similar:

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

Me gusta la" brevedad "de su solución. Simplemente lo expandí un poco para configurar los encabezados en negrita. –

+1

Estoy desconcertado por la ausencia de una solución que no recurra a un bucle. – mvbentes

6

Para que sea súper simple, hacer algo como esto (usando Hoja1 y registros r)

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

Sólo puede configurar su "x" variable a 0 y luego haga algo como:

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 

Y eso hará que sea un poco más fácil de leer ... :)

Cuestiones relacionadas