Was ich habe: Eine VBA-Routine, die ich irgendwo gefunden und versucht habe, an mein Problem anzupassen. Ich verstehe, dass diese Routine nach allen Excel-Arbeitsmappen in einem Ordner sucht und alle Dateien im Bereich H8:H27 in einer neuen Arbeitsmappe zusammenführt.
Was ich brauche: Eine Routine, die in einem Ordner nach allen Excel-Arbeitsmappen (außer totals.xlsx) sucht und die Werte im Bereich Sheet(2)H8:H27 zur Arbeitsmappe totals.xlsx summiert! sheet(2)H8:H27
Ich habe einen Ordner mit 67 Excel-Arbeitsmappen, darunter eine Arbeitsmappe namens „totals.xlsx“.
Mit Ausnahme von totals.xls haben die anderen Arbeitsmappen sehr lange Namen. Blatt Nummer 2 hat in allen Büchern ebenfalls einen sehr langen Namen.
Alle Bücher haben die gleiche Struktur;
Ich muss alle Werte der Arbeitsmappe (außer totals.xlsx) im Bereich Blatt (2)H8:H27 zum gleichen Bereich in der Arbeitsmappe total.xls summieren! Blatt (2)H8:H27;
Ich kann das Konsolidierungstool nicht verwenden, da das Limit bei 50 Dateien liegt.
Es ist fast unmöglich, eine Formel zu schreiben, die sich auf 67 Arbeitsmappen mit riesigen Namen bezieht, wobei das Blatt (2) auch einen riesigen Namen hat.
Also habe ich über eine VBA-Routine nachgedacht, um Werte im Bereich H8:H27 aller Arbeitsmappen (außer totals.xlsx) in einem Ordner auf den gleichen Bereich im Blatt (2) der Arbeitsmappe totals.xlsx zu summieren
Ich habe die folgende VBA-Routine gefunden und angepasst. Ich glaube, ich bin fast am Ziel, aber bisher konnte ich die Werte in einer separaten Arbeitsmappe zusammenführen. Ich habe keine Ahnung, wie ich alle Arbeitsmappen (außer totals.xlsx)! Blatt (2)H8:H27 zu totals.xlsx! Blatt (2)H8:H27 summieren kann.
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
Antwort1
Gelöst!
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
End Sub