Если честно, я не уверен, что это отвечает на ваш вопрос, но он вставляет значения, а не формулы. Макрос заполняет матрицу 19 x 16 на листе 1, используя либо формулы (как у вас сейчас), либо значения (используя ту же формулу). Выберите, какой метод, закомментировав соответствующую строку в конце l oop. Поместите код в пустую книгу и запустите тестовый макрос, это сгенерирует некоторые тестовые данные на листе 2 и сводку на листе 1. Насколько я могу судить, разница между двумя методами очень мала, что означает, что может быть что-то еще вызывая ваш медленный ответ.
Option Explicit
Sub test()
Const MONTHS = 19
testdata MONTHS, 1000 ' generate some data on sheet2
Dim ws As Worksheet, wsData As Worksheet
Dim r As Integer, c As Integer
Dim f1 As String, f2 As String, f3 As String
Dim col As String, a1 As String, a2 As String
Dim src As String, mth As Integer
Set ws = ThisWorkbook.Sheets("Sheet1")
ws.Cells.Clear
src = ws.Range("B5")
If src = "" Then src = "Sheet2"
Set wsData = ThisWorkbook.Sheets(src)
For r = 1 To 16
ws.Range("B" & r + 8) = "Category_" & r
For mth = 1 To 19
If r = 1 Then ws.Cells(8, mth + 2) = "Month " & mth
c = mth + 4
a1 = Chr(65 + (c - 1) Mod 26)
a2 = ""
' generate column as letters (up to ZZ)
If c > 26 Then a2 = Chr(64 + Int((c - 1) / 26))
col = a2 & a1 & ":" & a2 & a1
f1 = src & "!" & col
f2 = src & "!AI:AI"
f3 = "B" & r + 8
ws.Cells(r + 8, mth + 2).Formula = "=SUMIFS(" & f1 & "," & f2 & "," & f3 & ")"
'ws.Cells(r + 8, mth + 2) = WorksheetFunction.SumIfs(Range(f1), Range(f2), ws.Range(f3).Value)
Next
Next
MsgBox "Finished"
End Sub
Sub testdata(mth As Integer, i As Long)
' sheet2 data
Dim ws, r, c
Set ws = ThisWorkbook.Sheets("Sheet2")
ws.Cells.Clear
For r = 2 To i
ws.Range("AI" & r) = "Category_" & (1 + Int(Rnd() * 16))
For c = 5 To 4 + mth
ws.Cells(r, c) = Int(Rnd() * 100)
Next
Next
End Sub