【问题标题】:Export sql query results to excel using vba with headers使用带有标题的vba将sql查询结果导出到excel
【发布时间】:2014-06-18 10:00:30
【问题描述】:

我需要将一个简单的 SQL 查询结果导出到 Excel。我能够得到结果,但是标题丢失了,我怎样才能导出标题?

这是我目前所拥有的:

Sub Conn2SQL()

Dim cnn1 As New ADODB.Connection
Dim mrs As New ADODB.Recordset

Set cnn1 = New ADODB.Connection
  cnn1.ConnectionString = "driver={SQL Server};server=MyDBServer;uid=MyuserID;pwd=mypassword;database=MyDB"
  cnn1.ConnectionTimeout = 30
  cnn1.Open  

SQry = "use MyDB select * from TableName"

mrs.Open SQry, cnn1

Sheet2.Range("A2").CopyFromRecordset mrs

mrs.Close
cnn1.Close

End Sub

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    您需要遍历字段名称以包含标题。 An example from the Microsoft site is below:

    For iCols = 0 To oRS.Fields.Count - 1
     Sheet(1).Cells(1, iCols + 1).Value = oRS.Fields(iCols).Name
    Next
    

    所以要在你的代码中实现,应该是这样的:

    Sub Conn2SQL()
    
        Dim cnn1 As New ADODB.Connection
        Dim mrs As New ADODB.Recordset
        Dim iCols As Integer
    
        Set cnn1 = New ADODB.Connection
          cnn1.ConnectionString = "driver={SQL Server};server=MyDBServer;uid=MyuserID;pwd=mypassword;database=MyDB"
          cnn1.ConnectionTimeout = 30
          cnn1.Open
    
        SQry = "use MyDB select * from TableName"
    
        mrs.Open SQry, cnn1
    
        For iCols = 0 To mrs.Fields.Count - 1
            Worksheets("Sheet2").Cells(1, iCols + 1).Value = mrs.Fields(iCols).Name
        Next
    
        Sheet2.Range("A2").CopyFromRecordset mrs
    
        mrs.Close
        cnn1.Close
    
    End Sub
    

    【讨论】:

    • 这很有帮助,但现在你让我想到了菲尔兹夫人的饼干。
    【解决方案2】:

    还有另一种方法可以做到这一点。您可以将 SQL 连接和表数据添加到工作表中。 (Excel数据连接向导)

    然后使用您的 VBA 删除该表中的数据,并通过代码插入您的数据(使用 VBA 创建 SQL 连接和查询)。

    一旦您的代码成功删除数据并将您的 SQL 数据重新查询到该表中,您就可以删除创建的连接。

    您将得到一个带有列标题的表格,您的数据现在将被动态引入并转储到表格中。不需要列标题 VBA。 :)

    【讨论】:

      【解决方案3】:

      我仍然希望提出更好的解决方案。不知道为什么这不容易。

      'Get Header into an array:
      
          Dim HeadString As String
          Dim HeadArr as Variant 
      
          For iCols = 0 To mrs.Fields.Count - 1
          If HeadString = "" Then
              HeadString = mrs.Fields(iCols).Name
          Else
              HeadString = HeadString & "," & mrs.Fields(iCols).Name
          End If
      
              Next f
       Debug.Print HeadString 
        HeadArr  = Split(HeadString, ",")
       Debug.Print HeadArr (0)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-03-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多