O que eu tenho: Uma rotina VBA eu encontrei em algum lugar e tentei me adaptar ao meu problema. Eu entendo que esta rotina procura todas as pastas de trabalho do Excel em uma pasta e mescla todos os arquivos de intervalo H8: H27 em uma nova pasta de trabalho.
O que eu preciso: uma rotina que procura todas as pastas de trabalho do Excel (excluindo o totals.xlsx) em uma pasta e soma os valores no intervalo Folha (2) H8: H27 para a pasta de trabalho totals.xlsx! folha (2) H8: H27
Eu tenho uma pasta contendo 67 pastas de trabalho do Excel, incluindo uma pasta de trabalho chamada totals.xlsx;
Excluindo totals.xls, as outras pastas de trabalho têm nomes grandes. Folha número 2 em todos os livros também tem um nome enorme.
Todos os livros têm a mesma estrutura;
Eu preciso somar todos os valores da pasta de trabalho (excluindo totals.xlsx) na folha de intervalo (2) H8: H27 para o mesmo intervalo na pasta de trabalho total.xls! folha (2) H8: H27;
Não consigo usar a ferramenta Consolidar, pois o limite é de 50 arquivos;
É quase impossível escrever uma fórmula que se refira a 67 pastas de trabalho com nomes grandes, com a folha (2) também tendo um nome enorme;
Então eu pensei sobre a rotina VBA para valores SUM no intervalo H8: H27 de todas as pastas de trabalho (excluindo totals.xlsx) em uma pasta para o mesmo intervalo na folha (2) do totals.xlsx Workbook
Eu encontrei e adaptei a seguinte rotina VBA. Acho que estou quase lá, mas até agora consegui mesclar os valores em uma pasta de trabalho separada. Não tenho ideia de como somar todas as pastas de trabalho (excluindo totals.xlsx)! folha (2) H8: H27 para totals.xlsx! folha (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