Я бы предложил следующее:
- Определите ваши адреса
SumAddresses
, которые должны суммироваться. - Обработайте эти адреса по областям.
Адрес A1:C4,A7:C10
состоит из 2 областей: A1:C4
и A7:C10
- Работа с массивами. Это означает чтение данных в каждой области в массив. Затем выполните вычисление суммы с помощью массива и в конце запишите этот массив в область назначения на рабочем листе
Total
. Работать с массивами гораздо быстрее, чем с использованием диапазонов.
Таким образом, вы получите что-то вроде:
Option Explicit
Public Sub SumResourceSheets()
Dim SumAddresses As String
SumAddresses = "A1:C4,A7:C10,D5" 'note this is limited to 255 characters!
Dim ResultRange As Range
Set ResultRange = ThisWorkbook.Worksheets("Total - Resources").Range(SumAddresses)
ResultRange.ClearContents 'make result range epmty
ReDim SumAreas(1 To ResultRange.Areas.Count) As Variant
Dim iArea As Long
For iArea = LBound(SumAreas) To UBound(SumAreas)
SumAreas(iArea) = ResultRange.Areas(iArea).Cells.Value 'read area into array
Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets
If ws.Name Like "*- Resources" And ws.Name <> "Total - Resources" Then 'exclude Total - Resources
If ws.Range(ResultRange.Areas(iArea).Address).Cells.CountLarge = 1 Then
'handle single cell areas…
SumAreas(iArea) = SumAreas(iArea) + ws.Range(ResultRange.Areas(iArea).Address).Value
Else
'this is for multi cell areas …
'read data area into array
Dim DataArea() As Variant
DataArea = ws.Range(ResultRange.Areas(iArea).Address).Value
'sum data into sum array
Dim iRow As Long
For iRow = LBound(DataArea, 1) To UBound(DataArea, 1)
Dim iCol As Long
For iCol = LBound(DataArea, 2) To UBound(DataArea, 2)
If IsNumeric(DataArea(iRow, iCol)) Then
SumAreas(iArea)(iRow, iCol) = SumAreas(iArea)(iRow, iCol) + DataArea(iRow, iCol)
Else
MsgBox "The cell '" & ResultRange.Areas(iArea).Cells(iRow, iCol).Address & "' in worksheet '" & ws.Name & "' does not contain a number!", vbCritical
Exit Sub
End If
Next iCol
Next iRow
End If
End If
Next ws
ResultRange.Areas(iArea).Cells.Value = SumAreas(iArea) 'write area into cell
Next iArea
End Sub