因为有人询问合并计算,对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