我遇到了一个卡住的问题。
我想将我的Access表导出到Excel文件。目前,我使用DoCmd.TransferSpreadsheet
来实现,但我希望对导出的数据进行某种格式化。我能否格式化我发送到Excel的数据,还是必须在Access导出数据后编写Excel宏来格式化数据?
我遇到了一个卡住的问题。
我想将我的Access表导出到Excel文件。目前,我使用DoCmd.TransferSpreadsheet
来实现,但我希望对导出的数据进行某种格式化。我能否格式化我发送到Excel的数据,还是必须在Access导出数据后编写Excel宏来格式化数据?
这个 Excel 宏从您的 MS Access 数据库中检索数据:
Sub Makro1()
Const sDB = "c:db1.mdb"
Const sSQL = "SELECT * FROM Table1"
With ActiveSheet.QueryTables.Add(Connection:= _
"ODBC;DSN=MS Access-database;DBQ=" + sDB + ";FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;" _
, Destination:=Range("A1"))
.CommandText = Array(sSQL)
.Name = "Query1"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = True
.RefreshStyle = xlInsertDeleteCells
.SavePassword = True
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
.Refresh BackgroundQuery:=False
End With
End Sub
我们有一个通用的功能,可以直接将我们的连续表格导出到Excel中。您需要在可用工具中添加Microsoft Excel库,以使其从您的代码中运行。这个功能可以在您所有的表单中向用户提供。如果您想直接从表格中导出,您可以轻松地进行调整。
Public Function ExportToExcel(x_frm as Form)
Dim ctl As Control, _
xlApp As Excel.Application, _
xlBook As Excel.Workbook, _
xlSheet As Excel.Worksheet, _
columnName() As String, _
columnCount as Integer
suppose Excel is not opened. You can add an extra control for that
Set xlApp = CreateObject("Excel.Application")
create an Excel workbook, declare the first sheet
Set xlBook = xlApp.Workbooks.Add
Set xlSheet = xlBook.Worksheets(1)
xlApp.Visible = False
columnCount = fc().section(0).Controls.Count
use array columnName() to collect the column names of detail section in tabbed order
ReDim columnName(columnCount)
For Each ctl In fc().section(0).Controls
columnName(ctl.TabIndex) = ctl.Name
Next ctl
This function will add a title to the excel sheet with my favorite formating
I can for example decide this title to be bold/Arial/16 on cell(B2)
addTitleToExcelSheet xlSheet, x_frm.Name
This function will add the column names to my Excel sheet with my favorite formating
for example column names will be added on row 4, columns B to B + columnCount
addColumnNameToExcelSheet xlSheet, columnName()
This function will add the column values to my Excel sheet with specific format (date, number, etc)
Data will be added to the range defined by
row 5 to row 5 + x_frm.recordset.recordcount,
columns B to B + columnCount.
Recordset values will have to be read according to tab order
exported data can depend on recordset filter and orderBy property: your choice
addColumnValueToExcelSheet xlSheet, columnName(), x_frm.Recordset
The Excel sheet is made visible and saved under the current folder with the forms name
xlApp.Visible = True
xlBook.SaveAs x_frm.Name & ".xls"
Set xlBook = Nothing
Set xlSheet = Nothing
Set xlApp = Nothing
End Function
这里是结果的视图。左边是访问表单,右边是Excel导出到Excel的结果。希望你喜欢它。
将此翻译成中文:
我在这个领域没有多少经验,但请注意,Excel的行限制比Access小得多。
可能更容易的是从预先配置了您的格式的Excel电子表格开始。使用内部的Excel VBA,并从Access中获取数据(和格式化它)可能也更容易,而不是从Access推动。Excel VBA将更好地准备为您进行Excel格式设置。这两种方法都差不多容易。如果您尝试仅使用宏来完成此操作,使用Excel宏比使用Access宏仍然可能更容易。
如果您使用 DoCmd.TransferSpreadsheet
来创建一个原始文件,然后编辑它以使其格式正确,那么您可以再次运行 DoCmd.TransferSpreadsheet
,它将使用值更新文件但保留格式。
然而,如果人类编辑文件并添加新选项卡或计算等,则 DoCmd.TransferSpreadsheet
将不再起作用,并且会失败并显示一个丑陋的错误消息。因此,我们在我们的环境中使用 DoCmd.TransferSpreadsheet
成原始格式的文件,并通过将文件复制到用户的桌面并打开该复件以确保用户不会干扰原始文件来进行跟进。
这种方法是一种最少代码、清晰易懂、易于维护的解决方案。但它确实需要一个额外的“源”或原始文件留在周围。适用于Access 2007。