O que tenho: Uma rotina VBA que encontrei em algum lugar e tentei adaptar ao meu problema. Entendo que esta rotina procura todas as pastas de trabalho do Excel em uma pasta e mescla todos os arquivos do intervalo H8:H27 em uma nova pasta de trabalho.
O que eu preciso: uma rotina que procure todas as pastas de trabalho do Excel (excluindo totals.xlsx) em uma pasta e some os valores no intervalo Sheet(2)H8:H27 à 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 enormes. A folha número 2 de todos os livros também tem um nome enorme.
Todos os livros têm a mesma estrutura;
Preciso somar todos os valores da pasta de trabalho (excluindo totals.xlsx) na planilha de intervalo (2)H8:H27 com o mesmo intervalo na pasta de trabalho total.xls! folha (2)H8:H27;
Não consigo usar a ferramenta Consolidar porque o limite é de 50 arquivos;
É quase impossível escrever uma fórmula que se refira a 67 pastas de trabalho com nomes enormes, sendo que a folha (2) também tem um nome enorme;
Então pensei na rotina VBA para valores SUM no intervalo H8: H27 de todas as pastas de trabalho (excluindo totais.xlsx) em uma pasta para o mesmo intervalo na planilha (2) da pasta de trabalho totals.xlsx
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
Responder1
Resolvido!
Sub 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
Finalizar sub