从SQL查询中将列名称拉入Excel

fir*_*ger 10 excel vba excel-2003 excel-vba

我正在使用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
Run Code Online (Sandbox Code Playgroud)

小智 20

我通常的代码非常相似:

For intColIndex = 0 To objMyRecordset.Fields.Count - 1 
    Range("A4").Offset(0, intColIndex).Value = objMyRecordset.Fields(intColIndex).Name
Next
Run Code Online (Sandbox Code Playgroud)

  • 我对缺乏不诉诸循环的解决方案感到困惑。 (2认同)

fir*_*ger 12

好的,所以我在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
Run Code Online (Sandbox Code Playgroud)

  • 您不需要选择使用类似 `Range("A4").OffSet(0, x).value = fld.Name` 的单元格 (2认同)

小智 6

为了使它变得非常简单,做这样的事情(使用Sheet1和recordset r)

    For i = 0 To r.Fields.Count - 1
        Sheet1.Cells(1, i + 1) = r.Fields(i).Name
    Next i
Run Code Online (Sandbox Code Playgroud)