将数据从Excel聚合到Access中

时间:2013-08-02 04:46:15

标签: excel vba excel-vba access-vba

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

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

有没有人有任何建议可以有效地将这些数据导入Access?

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

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

我应该考虑的其他方法吗?任何可能简化我概述的步骤的技巧?

提前致谢!

1 个答案:

答案 0 :(得分:0)

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

  1. 一种选择机制,允许您标记和打开(多个)Excel文件
  2. 打开并阅读每个所选Excel文件并选择所需数据的例程
  3. 将该数据写入一个(或多个)Access表的代码块
  4. 上述三个方面都可以在一个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
    

    ad 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。

    轮到你了:)