我有一个问题我被困住了。
我想将Access表导出为Excel文件。目前,我使用DoCmd.TransferSpreadsheet
执行此操作,但我希望对导出的数据执行某种格式设置。我可以格式化我发送到Excel的数据,还是必须在Excel中编写一个宏,在从Access导出数据后对其进行格式化?
答案 0 :(得分:3)
此 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
答案 1 :(得分:3)
我们有一个通用函数,可以将我们的连续表单直接导出到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
以下是结果的视图。左边是Access窗体,右边是Excel exportToExcel结果。希望你喜欢它。
答案 2 :(得分:2)
我对此域名没有任何经验,但请注意Excel的行限制小于Access的行限制。
答案 3 :(得分:2)
使用预先配置了格式的Excel电子表格可能更容易。从excel中使用VBA也可能更容易,并从Access中提取数据(并格式化)而不是从Access推送。 Excel VBA将更好地为您准备Excel格式。一个就像另一个一样容易。如果您只是尝试使用Macros,那么Excel宏可能比Access宏更容易。
答案 4 :(得分:1)
如果您使用DoCmd.TransferSpreadsheet
并创建原件然后对其进行编辑以使格式正确,则可以再次运行DoCmd.TransferSpreadsheet
,它将使用值更新文件但保留格式。
但是,如果某人通过添加新标签或添加计算等来编辑文件,那么DoCmd.TransferSpreadsheet
将不再有效,并且会因丑陋的错误消息而失败。因此,我们在环境中所做的是DoCmd.TransferSpreadsheet
到具有格式化的原始文件,并通过将文件复制到用户桌面,然后打开该副本以便用户不会打扰原始文件来进行跟进。
这种方法是最简单的代码,简洁且易于维护的解决方案。但它确实需要额外的“源”或原始文件。适用于Access 2007。