【问题标题】:Aggregating data from Excel into Access将数据从 Excel 聚合到 Access
【发布时间】:2013-08-02 04:46:14
【问题描述】:

我刚刚开始一个项目,该项目需要我将多个 Excel 文件中的数据聚合到 Access 表中。棘手的部分是我的 Excel 数据不会在表格中,而是在像混乱一样的扫雷器中(你知道,地雷是随机放置的)。当然也不是完全随机的……

每个 Excel 文件本质上是一个包含预算信息和其他数据的项目的跟踪表格。作为一个 FORM 意味着它是在视觉上而不是在逻辑上排列的。此外,数据跨越 4 个单独的工作表。

是否有人对有效地将这些数据导入 Access 有任何建议?

假设
1)每个excel文件在Access中只会变成一行数据。
2)每个excel文件都将被锁定,以便每次在完全相同的单元格中输入数据

基于这些假设,我正在考虑创建一个隐藏的工作表,其中包含引用每个单独单元格的适当标题值,从而创建一个合并的数据表。然后从 Access 中创建一个宏,允许我选择所需的工作簿并从该隐藏表中导入新记录。当然有很多关于如何从 Excel 表中导入一条或多条记录的信息,所以如果我必须创建一个虚拟表,那就这样吧。

我应该考虑任何替代方法吗?有什么技巧可以简化我概述的步骤?

提前致谢!

【问题讨论】:

  • 我的建议:使用隐藏表创建聚合数据表,然后使用 vba 导入它们(或更简单)使用 pentaho 数据集成(kettle)进行自动化。将表格保留在访问权限或 Excel 工作表中,该工作表保留文件名和隐藏工作表名称,并将其用作您的 etl 的“控制工作表”。
  • 保持代码集中!如果您需要多个工作簿,让它们只是数据并使用 VBA 从 Access 收集所有数据。将您的代码拆分为多个工作簿和 Access 会增加您的代码复杂性。
  • @LS_dev 很好的建议!此外,这应该使我不必分发和启用宏的文件 (.xlsm)。

标签: excel ms-access vba


【解决方案1】:

这似乎是一个相当直接的任务。正如您所解释的,您正在从每个文件中读取相同的单元格位置,因此我会跳过在 Excel 中创建隐藏工作表的想法。从架构的角度来看,我同意 LS_Dev - 保持简单!你只需要

  1. 一种允许您标记和打开(多个)Excel 文件的选择机制
  2. 打开和读取每个选定的 Excel 文件并选择所需数据的例程
  3. 将数据写入一个(或多个)Access 表的代码块

以上三个都可以在一个 Access VBA 模块中巧妙地完成

广告 1。

Sub XLSProcessMulti()
Dim Idx As Long

    With Application.FileDialog(msoFileDialogFilePicker)
        .AllowMultiSelect = True
        .Title = "Pick one or more files"
        .Filters.Add "Worksheets", "*.xl*", 1

        If .Show = -1 Then
            For Idx = 1 To .SelectedItems.Count
                XLSProcessSingle .SelectedItems(Idx)
            Next Idx
        End If

    End With
End Sub

广告 2。

Sub XLSProcessSingle(FileName As String)
' needs creation of a reference to [Microsoft Excel xx.y Object Library]
Dim WB As Excel.Workbook
Dim Idx As Long

    Set WB = Excel.Workbooks.Open(FileName)

    ' dummy code here just to show a bit how the Excel object can be accessed
    Debug.Print WB.Name
    For Idx = 1 To WB.Worksheets.Count
        Debug.Print WB.Worksheets(Idx).Name
        Debug.Print WB.Worksheets(Idx).[A1] ' access a cell by its address enclosed in []
    Next Idx

    ' read sheets, ranges etc. by name or position into local variables
    ' and store them in Access table(s)

    ' X = WB.Worksheets(1).[A1]                  ' by position
    ' Y = WB.Worksheets("MySecondSheet").[B2]    ' by sheet name
    ' Z = WB.Worksheets(3).Range("MyNamedRange") ' single cell named range
    ' etc.


    WB.Close
End Sub

广告 3。

轮到你了 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-13
    • 1970-01-01
    • 1970-01-01
    • 2013-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多