Lo que tengo: una rutina de VBA que encontré en alguna parte y traté de adaptarla a mi problema. Entiendo que esta rutina busca todos los libros de Excel en una carpeta y combina todos los archivos del rango H8:H27 en un nuevo libro.
Lo que necesito: una rutina que busque todos los libros de Excel (excluyendo totals.xlsx) en una carpeta y sume los valores en el rango Hoja (2) H8: H27 al libro de trabajo totals.xlsx. hoja(2)H8:H27
Tengo una carpeta que contiene 67 libros de Excel, incluido un libro llamado totals.xlsx;
Excluyendo totals.xls, los otros libros de trabajo tienen nombres enormes. La hoja número 2 en todos los libros también tiene un nombre enorme.
Todos los libros tienen la misma estructura;
¡Necesito sumar todos los valores del libro de trabajo (excluyendo totales.xlsx) en la hoja de rango (2) H8: H27 al mismo rango en el libro de trabajo total.xls! hoja (2)H8:H27;
No puedo utilizar la herramienta Consolidar porque el límite es 50 archivos;
Es casi imposible escribir una fórmula que haga referencia a 67 libros con nombres enormes, y que la hoja (2) también tenga un nombre enorme;
Así que pensé en la rutina de VBA para SUMAR valores en el rango H8:H27 de todos los libros de trabajo (excluyendo totals.xlsx) en una carpeta en el mismo rango en la hoja (2) del libro de trabajo totals.xlsx.
Encontré y adapté la siguiente rutina VBA. Creo que ya casi he llegado, pero hasta ahora he podido fusionar los valores en un libro de trabajo separado. ¡No tengo idea de cómo sumar todos los libros (excluyendo totales.xlsx)! hoja (2)H8:H27 a totales.xlsx! hoja(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
Respuesta1
¡Resuelto!
Sub SUM_WB()
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
Subtítulo final