2013-08-02 95 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.

輪到你了:)