Вытягивание имен столбцов в Excel из SQL-запроса - PullRequest
10 голосов
/ 16 ноября 2010

Я использую Excel для извлечения данных из базы данных SQL. Я использовал код из другого вопроса SO, и он отлично работает. Теперь я хочу получить имена столбцов из таблицы в дополнение к реальной таблице. Я понял, что могу получить имена, используя цикл For Each fld. Однако в Excel все еще остается проблема их горизонтального размещения в строке, так как количество столбцов может измениться, поэтому я думаю, что мне понадобится еще один для каждого цикла или что-то подобное.

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

Ответы [ 4 ]

20 голосов
/ 18 ноября 2010

Мой обычный код очень похож:

For intColIndex = 0 To objMyRecordset.Fields.Count - 1 
    Range("A4").Offset(0, intColIndex).Value = objMyRecordset.Fields(intColIndex).Name
Next
12 голосов
/ 16 ноября 2010

Хорошо, так что я понял это после 4 попыток, вот код для цикла.

 '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
6 голосов
/ 29 июля 2014

Чтобы сделать это очень просто, сделайте что-то вроде этого (используя Sheet1 и recordset r)

    For i = 0 To r.Fields.Count - 1
        Sheet1.Cells(1, i + 1) = r.Fields(i).Name
    Next i
3 голосов
/ 17 марта 2017

Вы можете просто установить переменную "x" в 0 и затем сделать что-то вроде:

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

И это немного облегчит чтение ...:)

...