【问题标题】:Pulling Column Names into Excel from SQL query从 SQL 查询中将列名拉入 Excel
【发布时间】:2010-11-16 01:50:29
【问题描述】:

我正在使用 Excel 从 SQL 数据库中提取数据。我使用了另一个 SO question 中的代码,它工作正常。现在,除了实际表之外,我还想从表中提取列名。我发现我可以使用 For Each fld 循环获取名称。但是,由于列数可能会发生变化,仍然存在将它们水平填充到 Excel 中的一行的问题 - 所以我想我还需要另一个 For each 循环或类似的东西。

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

【问题讨论】:

  • 您不希望标题与数据对齐吗?数据从 A1 开始,但您似乎已将标题范围设置为 A4。
  • 是的,你是对的 - 我的复制和粘贴错误。

标签: vba excel excel-2003


【解决方案1】:

我平时的代码很相似:

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

【讨论】:

  • 我喜欢您解决方案的“短板”。我只是将其扩展了一点,将标题设置为粗体。
  • 我对没有不使用循环的解决方案感到困惑。
【解决方案2】:

好的,我尝试了 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

【讨论】:

  • 你不需要选择单元格使用Range("A4").OffSet(0, x).value = fld.Name
【解决方案3】:

为了让它超级简单,做这样的事情(使用 Sheet1 和记录集 r)

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

【讨论】:

    【解决方案4】:

    您可以将“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
    

    这会让它更容易阅读...... :)

    【讨论】:

    • 这个答案不是DAO而不是ADO吗?
    猜你喜欢
    • 2013-06-28
    • 1970-01-01
    • 2020-08-12
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-21
    相关资源
    最近更新 更多