私が持っているもの: どこかで見つけて、自分の問題に適用しようとした VBA ルーチン。このルーチンは、フォルダー内のすべての Excel ワークブックを検索し、H8:H27 の範囲にあるすべてのファイルを新しいワークブックに結合することを理解しています。
必要なもの: フォルダー内のすべての Excel ワークブック (totals.xlsx を除く) を検索し、範囲 Sheet(2)H8:H27 からワークブック totals.xlsx までの値を合計するルーチン。sheet(2)H8:H27
totals.xlsx というブックを含む 67 個の Excel ブックを含むフォルダーがあります。
totals.xls を除く他のワークブックの名前は非常に長くなっています。すべてのブックのシート番号 2 にも非常に長い名前が付けられています。
すべての本は同じ構造になっています。
範囲 sheet(2)H8:H27 内のすべてのワークブック (totals.xlsx を除く) の値を合計して、ワークブック total.xls! sheet (2)H8:H27 の同じ範囲に計算する必要があります。
制限が 50 ファイルであるため、統合ツールを使用できません。
巨大な名前を持つ 67 個のワークブックを参照し、シート (2) の名前も非常に大きい数式を記述することはほぼ不可能です。
そこで、フォルダ内のすべてのワークブック(totals.xlsxを除く)の範囲H8:H27の値をtotals.xlsxワークブックのシート(2)の同じ範囲に合計するVBAルーチンについて考えました。
私は次の 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_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
終了サブ