Что у меня есть: рутина VBA, которую я нашел где-то и пытался приспособиться к моей проблеме. Я понимаю, что эта процедура ищет все книги Excel в папке и объединяет все файлы диапазона H8: H27 в новую книгу.
Что мне нужно: Процедура, которая ищет все книги Excel (за исключением totals.xlsx) в папке и суммирует значения в диапазоне Sheet (2) H8: H27 с книгой totals.xlsx! лист (2) Н8: H27
У меня есть папка, содержащая 67 рабочих книг Excel, включая одну рабочую книгу с именем totals.xlsx;
За исключением Totals.xls, другие книги имеют огромные имена. Лист № 2 во всех книгах также имеет огромное название.
Все книги имеют одинаковую структуру;
Мне нужно сложить все значения в рабочей книге (кроме totals.xlsx) в листе диапазона (2) H8:H27 к одному и тому же диапазону в книге total.xls! лист (2) Н8: Н27;
Я не могу использовать инструмент Консолидация, поскольку ограничение составляет 50 файлов;
Почти невозможно написать формулу, которая относится к 67 рабочим книгам с огромными именами, при этом лист (2) также имеет огромное имя;
Поэтому я подумал о том, что подпрограмма VBA соответствует значениям SUM в диапазоне H8:H27 для всех рабочих книг (исключая totals.xlsx) в папке с таким же диапазоном в листе (2) файла totals.xlsx.
Я нашел и адаптировал следующую программу VBA. Я думаю, что я почти там, но до сих пор я смог объединить значения в отдельную книгу. Не знаю, как сложить все рабочие книги (кроме totals.xlsx)! лист (2) Н8: Н27 до итогов.xlsx! лист (2) Н8: 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