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 将列名保存到电子表格的主要内容,如果未能解决你的问题,请参考以下文章
使用 Excel VBA 查询 MS Access,SQL BETWEEN 日期查询
使用 vba 将 MS Access 查询输出到 Excel
从 Excel VBA 的 MS Access 表单中获取价值