2013-08-02 51 views
0

我刚刚开始一个项目,该项目需要我将多个Excel文件中的数据汇总到Access表中。棘手的部分是我的Excel数据不会出现在表格中,而是出现在一个像混乱的扫雷(你知道,这些地雷被随机放置在哪里)。当然,它不是完全随机的...将数据从Excel汇总到Access中

每个Excel文件本质上都是包含预算信息和其他数据的项目的跟踪表单。作为一种形式意味着它是视觉上的而不是逻辑上的。此外,这些数据还跨越了4个独立的工作表。

有没有人有任何建议有效地获取这些数据到Access?

假设
1)每个excel文件只会成为Access中的一行数据。
2)每个excel文件将被锁定,以使数据被以完全相同的单元,每个单元时间

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

我应该考虑的任何替代方法?任何可能简化我列出的步骤的技巧?

在此先感谢!

+0

我的建议是:使用隐藏的工作表来创建汇总数据表,然后使用vba导入它们(或更容易)使用pentaho数据集成(水壶)来执行自动化。在访问表中或在保留文件名和隐藏工作表名称的Excel工作表中保留一张表,并将其作为您的etl的“控制表”。 – RowanC

+1

保持您的代码集中!如果您需要多个工作簿,请让他们成为数据并使用VBA从Access中收集所有数据。将代码分割成多个工作簿和Access将增加您的代码复杂性。 –

+0

@LS_dev优秀建议!此外,这应该让我不必分发和宏启用文件(.xlsm)。 – mediocrecoder

回答

0

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

  1. 一个选择机制,用于标记和开放的(多)Excel文件
  2. 一个程序来打开,并通过每个选定的Excel文件读取和选择你需要
  3. 的块中的数据代码编写数据到一个(或多个)Access表(S)

所有上述三个可以在一个访问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.

轮到你了:)