Excel中的合并計算可以對多個工作表的對應項目進行求和,、求平均值等計算,,但如果需要合并計算的工作表較多,,特別是這些工作表位于不同的工作簿內時,,逐一選擇數據源顯得較為繁瑣,。用VBA中的Range.Consolidate方法可以快速地對多個結構相似的工作表進行合并計算,,但如果表格內包含有非數值類型的數據列,合并計算會忽略這些列,。例如下圖為某個圖書銷售點1至12月的圖書銷售記錄,,銷售數量位于D至O列,其中B列和C列為與A列對應的數據,,無需參與合并計算,,但必須在匯總表中列出。各銷售點都有一個類似的銷售表格,,每個分表列出的圖書數量不等,,圖書名稱也不盡相同。現在需要對各銷售點的銷售表格中D至O列的銷售數量按照A列圖書名稱進行合計,,求出總的銷售數量,。
如果直接使用合并計算,Excel會忽略B列文本,,同時對C列(單價)也進行合并計算,,顯然不符合要求。這時使用VBA中的Dictionary對象,,可以解決這一問題,,代碼如下:
Sub SumWorkbooks() Dim ThePath As String, TheFile As String Dim d As Object, Wbk As Workbook Dim i As Integer, j As Integer, k As Integer Dim Arr1(11), Arr2(), Arr3(), dk
On Error Resume Next Application.ScreenUpdating = False Set d = CreateObject("scripting.dictionary") ThePath = ThisWorkbook.Path & "\" TheFile = Dir(ThePath & "*.xls")
Do While TheFile <> "" If TheFile <> ThisWorkbook.Name Then Set Wbk = GetObject(ThePath & TheFile) With Wbk.Worksheets(1) For i = 2 To .Range("A65536").End(xlUp).Row '將D至O列數值賦值給Arr1 For j = 0 To 11 Arr1(j) = .Cells(i, j + 4).Value Next j If Not d.exists(.Range("A" & i).Value) Then 'key對應一個數組 d.Add .Range("A" & i).Value, Arr1 '將不能求和的數據賦值給Arr2 ReDim Preserve Arr2(1 To 2, 1 To k + 1) For j = 1 To 2 Arr2(j, k + 1) = .Cells(i, j + 1) Next j k = k + 1 Else For j = 0 To 11 '若數據存在則D至O列數值對應合計到Arr1中的每個元素 Arr1(j) = d(.Range("A" & i).Value)(j) + Arr1(j) Next d(.Range("A" & i).Value) = Arr1 End If Next End With Wbk.Close False End If TheFile = Dir '當前文件夾內的下一個工作簿 Loop
'輸出 With ThisWorkbook.Worksheets(1) .Range("A2").Resize(d.Count, 1) = Application.Transpose(d.keys) dk = d.keys ReDim Arr3(1 To d.Count, 1 To 12) For i = 0 To d.Count - 1 For j = 0 To 11 Arr3(i + 1, j + 1) = d(dk(i))(j) Next j Next i .Range("D2:O" & d.Count + 1).Value = Arr3 .Range("B2:C" & d.Count + 1).Value = Application.Transpose(Arr2) End With
Set d = Nothing Application.ScreenUpdating = True
End Sub
在匯總表中按Alt+F11,打開VBA編輯器,,單擊菜單“插入→模塊”,,粘貼上述代碼并運行,即可對匯總工作簿所在的文件夾內的其他所有工作簿的第一個工作表進行合并求和,,無需打開各個需要匯總的工作簿,。匯總后的B、C兩列為與A列對應的數據,。匯總前須注意以下幾點:
1.將匯總工作簿和其他各個工作簿放到同一文件夾內,,并保存匯總工作簿。匯總前移走文件夾內所有無關工作簿。
2.各分表應位于各工作簿中的最左側(第一個),。
3.各分表內的記錄數量可以不同,,但行標題需相同。 |