English 中文(简体)
访问表格数据到Excel
原标题:
  • 时间:2008-12-11 06:52:12
  •  标签:

我遇到了一个卡住的问题。

我想将我的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的结果。希望你喜欢它。

将此翻译成中文:alt text 替代文本

我在这个领域没有多少经验,但请注意,Excel的行限制比Access小得多。

可能更容易的是从预先配置了您的格式的Excel电子表格开始。使用内部的Excel VBA,并从Access中获取数据(和格式化它)可能也更容易,而不是从Access推动。Excel VBA将更好地准备为您进行Excel格式设置。这两种方法都差不多容易。如果您尝试仅使用宏来完成此操作,使用Excel宏比使用Access宏仍然可能更容易。

如果您使用 DoCmd.TransferSpreadsheet 来创建一个原始文件,然后编辑它以使其格式正确,那么您可以再次运行 DoCmd.TransferSpreadsheet,它将使用值更新文件但保留格式。

然而,如果人类编辑文件并添加新选项卡或计算等,则 DoCmd.TransferSpreadsheet 将不再起作用,并且会失败并显示一个丑陋的错误消息。因此,我们在我们的环境中使用 DoCmd.TransferSpreadsheet 成原始格式的文件,并通过将文件复制到用户的桌面并打开该复件以确保用户不会干扰原始文件来进行跟进。

这种方法是一种最少代码、清晰易懂、易于维护的解决方案。但它确实需要一个额外的“源”或原始文件留在周围。适用于Access 2007。





相关问题
热门标签