Страницы: 1
RSS
Как сложить массивы с условием?
 
Всех с праздником!    
Уважаемые знатоки) есть вопросик.  
Как формулой или в крайнем случае макросом сложить массивы при условии что они перемножаются на условие.  
Наверно не совсем понятно объяснил но постарался это в примере исправить.  
Спасибо за помощь.
 
Неужели нет идей?)    
как говорится по Станиславскому...не верю..не верю))
 
Формула самая простая, рабочая. Чем не нравится?
 
Хотите другой берите:  
 
=$E$2:$H$14*$A$2+$I$2:$L$14*$B$2+$M$2:$P$14*$C$2 формула массива
Редко но метко ...
 
{quote}{login=vikttur}{date=24.02.2011 09:14}{thema=}{post}Формула самая простая, рабочая. Чем не нравится?{/post}{/quote} Небось препод напряг.
Я сам - дурнее всякого примера! ...
 
{quote}{login=димитр77}{date=24.02.2011 09:10}{thema=}{post}Неужели нет идей?)    
как говорится по Станиславскому...не верю..не верю)){/post}{/quote}  
Макросом замороченый вариант :)только под Ваши диапазоны...
Спасибо
 
Задачу решил (макросом, достаточно сложным, но универсальным), в личной беседе.  
 
Но по ходу решения возник вопрос - может, кто подскажет решение...  
Если надо сложить 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
 
Выяснил - тормоза были не из-за суммирования массивов (они очень быстро суммируются), а из-за вычисления функций листа в другой процедуре:  
 
Function ArrayIRR(ByVal arr) As Variant  
   ' возвращает вертикальный массив с результатами вычисления функции IRR для строк массива ARR  
   ReDim NewArr(LBound(arr) To UBound(arr), 1 To 1)  
   For i = LBound(arr) To UBound(arr)  
       строка = Application.Index(arr, i, 0)  
       NewArr(i, 1) = Application.WorksheetFunction.IRR(строка)  
   Next i  
   ArrayIRR = NewArr  
End Function  
 
 
И всё же - вопрос остаётся открытым: как суммировать 2 двумерных массива одинаковой размерности (средствами VBA или API, без записи на лист)
 
Если например через формулу массива то {=mas1+mas2} где mas1 и mas2 массивы с одинаковой размерностью, но как эту формулу записать в ВБА не знаю ((. Может в эту сторону копать ?
Редко но метко ...
 
с выгрузкой на лист как в моем примере довольно шустро работает :)  
протестил 3 массива 4*15000 3 операции умножения + 3 операции сложения  
выплюнуло  0,96875    
а копать надо в сторону API , мне кажется обычными средствами VBA тут не обойдешся
Спасибо
 
Огромное всем спасибо!!!!!  
На самом деле проблема была решена Игорем по средствам макроса, респект мастеру.  
Но формула массива тоже очень полезная, это наверно и есть выход если не знаешь как написать макрос.  
 
Задание на самом деле не от препода, а из реального сектора экономики но пока теоретический поиск решения)    
В любом случае спасибо за помощь.
 
Так и не понял, чем Вас обидела Ваша формула? Проще некуда.
Страницы: 1
Читают тему
Наверх