내가 가지고 있는 것: 어딘가에서 찾은 VBA 루틴으로 내 문제에 적응하려고 노력했습니다. 이 루틴은 폴더의 모든 Excel 통합 문서를 찾고 H8:H27 범위의 모든 파일을 새 통합 문서에 병합한다는 것을 이해합니다.
필요한 것: 폴더에서 모든 Excel 통합 문서(totals.xlsx 제외)를 찾고 Sheet(2)H8:H27 범위의 값을 통합 문서 totals.xlsx에 합산하는 루틴입니다! 시트(2)H8:H27
totals.xlsx라는 통합 문서 하나를 포함하여 67개의 Excel 통합 문서가 포함된 폴더가 있습니다.
totals.xls를 제외한 다른 통합 문서에는 큰 이름이 있습니다. 모든 책의 시트 번호 2에도 거대한 이름이 있습니다.
모든 책은 동일한 구조를 가지고 있습니다.
범위 시트(2)H8:H27의 모든 통합 문서(totals.xlsx 제외) 값을 통합 문서 total.xls의 동일한 범위로 합산해야 합니다! 시트 (2)H8:H27;
파일 제한이 50개이므로 통합 도구를 사용할 수 없습니다.
큰 이름을 가진 67개의 통합 문서를 참조하는 공식을 작성하는 것은 거의 불가능합니다. 시트 (2)도 큰 이름을 가지고 있습니다.
그래서 폴더에 있는 모든 통합 문서(totals.xlsx 제외)의 H8:H27 범위에 있는 SUM 값에 대한 VBA 루틴을 totals.xlsx 통합 문서 시트(2)의 동일한 범위에 대해 생각했습니다.
다음 VBA 루틴을 찾아서 적용했습니다. 거의 다 온 것 같지만 지금까지는 값을 별도의 통합 문서로 병합할 수 있었습니다. 모든 통합 문서(totals.xlsx 제외)를 합산하는 방법을 모릅니다! 시트 (2)H8:H27을 totals.xlsx로! 시트(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
답변1
해결되었습니다!
하위 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
서브 끝