因为有人询问合并计算,对VBA略知一些,我就写了一点,有需要的人可以借鉴。
新建一个工作表,粘贴到模块,F5运行,就可以达到左列合计,左列为一列。
下面是代码:
无源数据格式
Sub 多工作簿合计() Application.ScreenUpdating = False Dim Wb As Workbook, 
vrtSelectedItem As Variant, Mysheet As Worksheet, CellAddress Dim ShRan As 
String, Arr() As String, s As Long, Spt, NewPath As String, Bool As Boolean On 
Error Resume Next '遇到错误继续执行 With 
Application.FileDialog(msoFileDialogFilePicker) .AllowMultiSelect = True '多选 
.InitialFileName = ThisWorkbook.Path & "\" '默认路径 .Title = "选择文件" '窗口标题 
.Filters.Clear '清除文件过滤器 .Filters.Add "全部文件", "*.*" .Filters.Add "Excel文件", 
"*.xlsm" .Filters.Add "Excel文件", "*.xls" .Filters.Add "Excel文件", "*.xlsx;*.xls" 
'设置文件过滤器,可以指定多个扩展名,每个扩展名都必须用分号分隔。 例如,可以将参数分配给字符串:".txt;.htm"。 Cells.Clear Bool 
= True If .Show = -1 Then For Each vrtSelectedItem In .SelectedItems Spt = 
Split(vrtSelectedItem, "\") NewPath = "'" & Replace(vrtSelectedItem, 
Spt(UBound(Spt)), "[" & Spt(UBound(Spt)) & "]") Set Wb = 
Workbooks.Open(vrtSelectedItem) For Each Mysheet In Wb.Worksheets '复制标题行,不带格式粘贴 
If Bool Then Mysheet.Rows("1:1").Copy Cells(1, 1).PasteSpecial 
Paste:=xlPasteValues Bool = False Application.CutCopyMode = False End If ReDim 
Preserve Arr(s) '获取不包含首行的当前区域 CellAddress = Split(Mysheet.Cells(2, 
1).CurrentRegion.Address, ":") ShRan = Mysheet.Name & "'!" & 
Mysheet.Range("A2:" & CellAddress(1)).Address(ReferenceStyle:=xlR1C1) '数据区域 
Arr(s) = NewPath & ShRan s = s + 1 Next Mysheet Wb.Close Next vrtSelectedItem 
Set Wb = Nothing End If End With Range("A2").Consolidate Sources:=Arr, 
Function:=xlSum, TopRow:=False, LeftColumn:=True, CreateLinks:=False 
Application.ScreenUpdating = True End Sub 
下面是有源数据格式的
Sub 汇总合计() '保留源数据格式 Application.ScreenUpdating = False Dim Wb As Workbook, 
vrtSelectedItem, Mysheet As Worksheet, i As Long, Bool As Boolean, Start_row 
'On Error Resume Next '容错 With Application.FileDialog(msoFileDialogFilePicker) 
.AllowMultiSelect = True '多选 .InitialFileName = ThisWorkbook.Path & "\" '默认路径 
.Title = "选择文件" '窗口标题 .Filters.Clear '清除文件过滤器 .Filters.Add "全部文件", "*.*" 
.Filters.Add "Excel文件", "*.xlsx;*.xls" '可以指定多个扩展名,每个扩展名都必须用分号分隔。 
例如,可以将参数分配给字符串:".txt;.htm"。 .Filters.Add "Excel文件", "*.xlsm" .Filters.Add 
"Excel文件", "*.xls" '设置文件过滤器 Cells.Clear Bool = True If .Show = -1 Then For Each 
vrtSelectedItem In .SelectedItems Set Wb = Workbooks.Open(vrtSelectedItem) With 
ThisWorkbook.ActiveSheet For Each Mysheet In Wb.Worksheets If Bool = True Then 
Start_row = 1 Else Start_row = 2: Bool = False '获取不包含首行的当前区域 CellAddress = 
Split(Mysheet.Cells(1, 1).CurrentRegion.Address, ":") Mysheet.Range("A" & 
Start_row & ":" & CellAddress(1)).Copy .Cells(i + 1, 1) i = 
Mysheet.Range("A1").CurrentRegion.Rows.Count Next End With Wb.Close Next Set Wb 
= Nothing End If End With Dim RowCount As Long, MyRange As String, ColCount As 
Long, DataCol As Long, E_Coords, Act_sh With ThisWorkbook.ActiveSheet RowCount 
= .Cells(Rows.Count, 2).End(xlUp).Row ColCount = .Cells(1, 
1).CurrentRegion.Columns.Count Act_sh = .Cells(1, 1).CurrentRegion.Address 
.Range(Act_sh).Copy With .Cells(1, ColCount + 1) .PasteSpecial 
Paste:=xlPasteColumnWidths .PasteSpecial Paste:=xlPasteFormats End With 
Application.CutCopyMode = False E_Coords = Split(Act_sh, ":")(1) MyRange = 
ActiveSheet.Name & "!" & .Range("A2:" & 
E_Coords).Address(ReferenceStyle:=xlR1C1) .Cells(2, ColCount + 1).Consolidate 
Sources:=MyRange, _ Function:=xlSum, TopRow:=False, LeftColumn:=True, 
CreateLinks:=False .Range("A2:" & E_Coords).Delete Shift:=xlToLeft 
.Range(Range("A1").CurrentRegion.Rows.Count + 1 & ":" & 
.Cells.Rows.Count).ClearFormats End With Application.ScreenUpdating = True End 
Sub