Задачу решил (макросом, достаточно сложным, но универсальным), в личной беседе.
Но по ходу решения возник вопрос - может, кто подскажет решение...
Если надо сложить 2 диапазона ячеек - то такое в Excel присутствует
(как в примере от R Dmitry - вариант с PasteSpecial Paste:=xlPasteAll, Operation:=xlAdd)
А если надо сложить 2 двумерных массива - есть ли аналогичный вариант?
Сейчас я складываю массивы перебором - на это уходит много времени (6 сек. на сложение 5 массивов 1000*30):
Function SumArrayUsingOptions(ByRef AllArrays, ByVal Options) As Variant
' принимает AllArrays - массив, содержащий все массивы проектов
' и Options - одномерный массив опций вида {0,0,1,0,1}
' Возвращает массив, являющийся суммой массивов из AllArrays
arr = AllArrays(LBound(AllArrays)) ' первый попавшийся массив - для определения размеров
ReDim NewArr(LBound(arr, 1) To UBound(arr, 1), LBound(arr, 2) To UBound(arr, 2))
For i = LBound(AllArrays) To UBound(AllArrays)
arr = AllArrays(i)
If Options(i) = 1 Then
For i2 = LBound(arr, 1) To UBound(arr, 1)
For i3 = LBound(arr, 2) To UBound(arr, 2)
NewArr(i2, i3) = NewArr(i2, i3) + arr(i2, i3)
Next i3
DoEvents
Next i2
End If
Next i
SumArrayUsingOptions = NewArr
End Function
Может, кто предложит способ проще и быстрее?
PS: Кстати, вот итоговый макрос (сделанный под реальный файл):
Sub PortfolioCalculation()
ProjectsCount = КоличествоПроектов
BinArr = BinaryArray(ProjectsCount) ' все возможные комбинации проектов
ReDim AllArrays(1 To ProjectsCount)
For i = LBound(AllArrays) To UBound(AllArrays): AllArrays(i) = GetArray(i): Next i
For i = LBound(BinArr) To UBound(BinArr) - 1
CurrentOption = Application.Index(BinArr, i, 0)
sumArr = SumArrayUsingOptions(AllArrays, CurrentOption)
arrIRR = ArrayIRR(sumArr) ' формируем массив IRR
Dim cell As Range: Set cell = shd.Range("A" & shd.Rows.Count).End(xlUp).Offset(1)
cell = i: cell.Offset(, 1) = Application.WorksheetFunction.Average(arrIRR)
cell.Offset(, 2) = Application.WorksheetFunction.StDev(arrIRR)
cell.Offset(, 3).Resize(, ProjectsCount).Value = CurrentOption
Next i
End Sub