VBA Excel - 从 MS Access 将列名保存到电子表格

Posted

技术标签:

【中文标题】VBA Excel - 从 MS Access 将列名保存到电子表格【英文标题】:VBA Excel - Saving column names to spreadsheet from MS Access 【发布时间】:2015-04-04 11:59:49 【问题描述】:

我在 Visual Studio Express 中使用 VBA。我想要做的是给出我通过VB导出MS Access DB创建的excel电子表格的第一行,列名,即我在我的DB中的名称。

有 10 列第 9 列被跳过,我还将电子表格隔开以允许第一行有标题,我将如何用我的数据库的列名填充电子表格的第一行? 也可以直接通过代码分配名称,而不是从数据库中传递列标题。

我的代码:

Public Sub ExportEx()
    Dim strSQL_Query As String
    Dim oCN As ADODB.Connection
    Dim oCMD As ADODB.Command
    Dim oRecords As ADODB.Recordset
    Dim strDBPath As String
    Dim varValues As Object
    Dim lngRows As Long
    Dim lngCols As Long
    Dim strCN As String



    strDBPath = Application.StartupPath & "\SCO_Leaderboard.accdb"

    strCN = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & strDBPath & ";" & _
                    "Persist Security Info=False;"


    strSQL_Query = "Select top 10 Rank, Username, Time_Played, Lv, EXP, Floor, Col, Logins, Status FROM tblUsers ORDER BY Rank ASC"

    Dim oExcel As Object
    Dim oBook As Object
    Dim oSheet As Object
    oExcel = CreateObject("Excel.Application")
    oBook = oExcel.Workbooks.Add
    oSheet = oBook.Worksheets(1)

    oCN = New ADODB.Connection
    oCN.ConnectionString = strCN
    oCN.Open()


    oCMD = New ADODB.Command
    oCMD.ActiveConnection = oCN
    oCMD.CommandText = strSQL_Query
    oRecords = oCMD.Execute

    varValues = oRecords.GetRows


    lngCols = UBound(varValues, 2)
    lngRows = UBound(varValues, 1)
    oSheet.Range("A2", oSheet.Range("A2").Offset(lngRows, lngCols)) = varValues


    oBook.SaveAs(Application.StartupPath & "\Top_10_All_Time.xls")
    oExcel.Quit()

    MsgBox("An Excel spreadsheet has been created under:" & vbNewLine & vbNewLine & Application.StartupPath & "\Top_10_All_Time.xls")
    '' Clean up...

    oCMD = Nothing
    oCN.Close()
    oCN = Nothing

另一方面,我将如何在 Excel 中将字段隔开,以便所有数据都适合列?

感谢您的帮助,

安迪

【问题讨论】:

【参考方案1】:

在 VBA 中,有两种方法可以将 Access 表/查询数据导出到 Excel 电子表格:

1)TransferSpreadsheet方法

此命令将导出所有字段和记录。因此,将您的 VBA 字符串保存为存储的查询对象并在以下命令中引用它:

DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, _
               "yourtableorqueryname", "fullpathtoExcelFile", True

2)CopyFromRecordset方法

此命令将仅导出记录。但是,您可以使用记录集的Fields 属性来填写第一行。请注意,下面的代码假定您使用 ADODB 连接创建了一个名为 rst 的 ADO 记录集。

Dim rst As ADODB.Recordset

Set rst = New ADODB.Recordset

rst = "Select top 10 Rank, Username, Time_Played, Lv, EXP, Floor, Col, Logins, Status" _
  & " FROM tblUsers ORDER BY Rank ASC", oCN

oSheet.Range("A1").Select
For Each fld In rst.Fields
   oExcel.ActiveCell = fld.Name
   oExcel.ActiveCell.Offset(0, 1).Select
Next
'REMOVE BELOW IF YOU WANT ONLY COLUMN HEADERS NOT DATA
oSheet.Range("A2").CopyFromRecordset rst
'TO AUTO FIT (SPACE OUT) COLUMNS
osheet.Range("A1:I" & rst.RecordCount + 1).Columns.AutoFit

【讨论】:

【参考方案2】:

这适用于 Access,我不确定它是否适用于您的情况:

Select top 10 Rank As Header1, Username As Header2, Time_Played As Header3 ...

【讨论】:

【参考方案3】:

您必须从 oRecords 的架构中检索字段 Collection:

oRecords = oCMD.Execute

或者只是从 strSQL 中解析字段名...

或者 - 非常简单,当您定义字段名称并根据字段名称构建 SQL 时 - 将它们放在一个数组中,然后从该数组构建范围的第一行。

【讨论】:

有没有办法直接通过代码设置字段中的数据,即单元格A1 = "Rank"等? 是的......使用第1行的范围。

以上是关于VBA Excel - 从 MS Access 将列名保存到电子表格的主要内容,如果未能解决你的问题,请参考以下文章

MS Access导出联合查询到Excel,VBA问题

使用 Excel VBA 查询 MS Access,SQL BETWEEN 日期查询

使用 vba 将 MS Access 查询输出到 Excel

从 Excel VBA 的 MS Access 表单中获取价值

在 VBA 中查找适用于 MS Access 和 MS Excel 的应用程序目录路径

MS Access VBA 修改 Excel 工作表而不写入 Drive