Что у меня есть: Процедура VBA, которую я где-то нашел и попытался адаптировать к своей проблеме. Я понимаю, что эта процедура ищет все книги Excel в папке и объединяет все файлы в диапазоне H8:H27 в новую книгу.
Что мне нужно: Процедура, которая ищет все рабочие книги Excel (кроме totals.xlsx) в папке и суммирует значения в диапазоне Sheet(2)H8:H27 с workbook totals.xlsx! sheet(2)H8:H27
У меня есть папка, содержащая 67 рабочих книг Excel, включая одну рабочую книгу под названием totals.xlsx;
За исключением totals.xls, все остальные рабочие книги имеют огромные имена. Лист номер 2 во всех книгах также имеет огромное имя.
Все книги имеют одинаковую структуру;
Мне нужно просуммировать все значения Workbook (исключая totals.xlsx) в диапазоне sheet(2)H8:H27 с тем же диапазоном в workbook total.xls! sheet (2)H8:H27;
Я не могу использовать инструмент «Консолидация», так как ограничение составляет 50 файлов;
Практически невозможно написать формулу, которая ссылается на 67 рабочих книг с огромными именами, при этом лист (2) также имеет огромное имя;
Поэтому я подумал о процедуре VBA для суммирования значений в диапазоне H8:H27 всех рабочих книг (исключая totals.xlsx) в папке с тем же диапазоном на листе (2) рабочей книги totals.xlsx.
Я нашел и адаптировал следующую процедуру VBA. Думаю, я почти у цели, но пока мне удалось объединить значения в отдельную рабочую книгу. Понятия не имею, как суммировать все рабочие книги (исключая totals.xlsx)! лист (2)H8:H27 в totals.xlsx! лист (2)H8:H27
Sub MergeAllWorkbooks()
Dim MyPath As String, FilesInPath As String
Dim MyFiles() As String
Dim SourceRcount As Long, FNum As Long
Dim mybook As Workbook, BaseWks As Worksheet
Dim sourceRange As Range, destrange As Range
Dim rnum As Long, CalcMode As Long
MyPath = "C:\Users\test"
If Right(MyPath, 1) <> "\" Then
MyPath = MyPath & "\"
End If
FilesInPath = Dir(MyPath & "*.xl*")
If FilesInPath = "" Then
MsgBox "No files found"
Exit Sub
End If
FNum = 0
Do While FilesInPath <> ""
FNum = FNum + 1
ReDim Preserve MyFiles(1 To FNum)
MyFiles(FNum) = FilesInPath
FilesInPath = Dir()
Loop
With Application
CalcMode = .Calculation
.Calculation = xlCalculationManual
.ScreenUpdating = False
.EnableEvents = False
End With
Set BaseWks = Workbooks.Add(xlWBATWorksheet).Worksheets(1)
rnum = 1
If FNum > 0 Then
For FNum = LBound(MyFiles) To UBound(MyFiles)
Set mybook = Nothing
On Error Resume Next
Set mybook = Workbooks.Open(MyPath & MyFiles(FNum))
On Error GoTo 0
If Not mybook Is Nothing Then
On Error Resume Next
With mybook.Worksheets(1)
Set sourceRange = .Range("A1:C1")
End With
If Err.Number > 0 Then
Err.Clear
Set sourceRange = Nothing
Else
If sourceRange.Columns.Count >= BaseWks.Columns.Count Then
Set sourceRange = Nothing
End If
End If
On Error GoTo 0
If Not sourceRange Is Nothing Then
SourceRcount = sourceRange.Rows.Count
If rnum + SourceRcount >= BaseWks.Rows.Count Then
MsgBox "There are not enough rows in the target worksheet."
BaseWks.Columns.AutoFit
mybook.Close savechanges:=False
GoTo ExitTheSub
Else
With sourceRange
BaseWks.Cells(rnum, "A"). _
Resize(.Rows.Count).Value = MyFiles(FNum)
End With
Set destrange = BaseWks.Range("B" & rnum)
With sourceRange
Set destrange = destrange. _
Resize(.Rows.Count, .Columns.Count)
End With
destrange.Value = sourceRange.Value
rnum = rnum + SourceRcount
End If
End If
mybook.Close savechanges:=False
End If
Next FNum
BaseWks.Columns.AutoFit
End If
ExitTheSub:
With Application
.ScreenUpdating = True
.EnableEvents = True
.Calculation = CalcMode
End With
End Sub
решение1
Решено!
Под SUM_WBs()
Dim FileNameXls As Variant, i As Integer, wb As Workbook
Range("H8:H27").ClearContents
FileNameXls = Application.GetOpenFilename(filefilter:="Excel Files, *.xl*", MultiSelect:=True)
If Not IsArray(FileNameXls) Then Exit Sub
Application.ScreenUpdating = False
For i = LBound(FileNameXls) To UBound(FileNameXls)
Set wb = Workbooks.Open(FileNameXls(i))
wb.Sheets(2).Range("H8:H27").Copy
ThisWorkbook.Sheets(2).Range("H8:H27").PasteSpecial Paste:=xlPasteValues, Operation:=xlAdd, SkipBlanks:=True, Transpose:=False
Application.CutCopyMode = False
wb.Close SaveChanges:=False
Next i
Application.ScreenUpdating = True
Конец субтитра