VBA - Формула массива: ошибка времени выполнения 1004 для FormArray, хотя формула выглядит правильно. Пример внутри - PullRequest
0 голосов
/ 08 ноября 2018

РЕДАКТИРОВАТЬ: решение от Chronocidal было очень полезно. Я реализовал это, и это работает как шарм. Спасибо за вашу помощь. Замечания Рона Райзенфельда и EvR тоже очень помогли и направили меня в правильном направлении

Может кто-нибудь помочь мне с формулой массива, которую я пытаюсь вставить в некоторые ячейки с помощью функции form.local? Возможно, что-то не так в формуле, но я просто не могу найти причину ... Было бы очень полезно, если бы кто-то смог это проверить, так как у меня есть только немецкая версия Excel и, возможно, я наблюдал за ней. любые языковые причины. Я приложил файл для проверки формулы (xlsx)

Если я отлаживаю печать, формула будет выглядеть так:

=(PRODUCT(IF(Daten!B1:B12353=SMALL(IF((Daten!B1:B12353>=$C$25),Daten!B1:B12353,999999),1),Daten!A1:A12353-SUM(0,0),1),IF((Daten!B1:B12353>SMALL(IF((Daten!B1:B12353>=$C$25),Daten!B1:B12353),1))*((Daten!B1:B12353<=$D$33)),Daten!A1:A12353,1))^(1/(DAYS360($C$25,$D$33)/360))-1)*100

Я использовал формулу в этом примере рабочей книги: https://drive.google.com/open?id=1xCth5vo6G82lNDsclbj3FpUfYzvXsuEJ

В VBA формула состоит из множества переменных:

[править] b = последняя строка в диапазоне, на которую я хочу посмотреть в формуле [/ edit]

Daten! B1: B "& b = Ряд дат

sh_Ov.Cells (int_Ende + 1, Int_links) .Address = Последняя дата

sh_Ov.Cells (int_Start, 3) .Address = самая ранняя дата (но не обязательно в строке даты - вот почему я работаю с «маленькой» формулой)

Daten! A1: A "& b = Числа, которые я хочу вычислить как произведение

ThisWorkbook.Sheets(1).Cells(x,y).FormulaArray = "=(PRODUCT(IF(Daten!B1:B" & b & "=SMALL(IF((Daten!B1:B" & b & ">=" & sh_Ov.Cells(int_Start, 3).Address & "),Daten!B1:B" & b & ",999999),1),Daten!A1:A" & b & "-SUM(0,0),1),IF((Daten!B1:B" & b & ">SMALL(IF((Daten!B1:B" & b & ">=" & sh_Ov.Cells(int_Start, 3).Address & "),Daten!B1:B" & b & "),1))*((Daten!B1:B" & b & "<=" & sh_Ov.Cells(int_Ende + 1, Int_links).Address & ")),Daten!A1:A" & b & ",1))^(1/(DAYS360(" & sh_Ov.Cells(int_Start, 3).Address & "," & sh_Ov.Cells(int_Ende + 1, Int_links).Address & ")/360))-1)*100"

Было бы замечательно, если бы кто-нибудь мог взглянуть на это. Пока не могу найти причину

С наилучшими пожеланиями Jens

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

Ваша формула содержит более 255 символов, поэтому вы не можете ввести ее напрямую через VBA.

Либо измените его на более короткий (например, используйте именованные диапазоны, такие как EvR предлагает ), либо используйте ( технически действительный ) фиктивный код и затем замените его на Range.Replace, вот так:

With ThisWorkbook.Worksheets(1).Cells(x,y) 'Worksheets instead of Sheets will exclude Chart Sheets
    '214 Characters
    .FormulaArray = "=(PRODUCT(IF(MAX(1)=SMALL(IF((MAX(1)>=" & sh_Ov.Cells(int_Start, 3).Address & "),MAX(1),999999),1),Daten!A1:A" & b & "-SUM(0,0),1),IF((MAX(1)>SMALL(IF((MAX(1)>=" & sh_Ov.Cells(int_Start, 3).Address & "),MAX(1)),1))*((MAX(1)<=" & sh_Ov.Cells(int_Ende + 1, Int_links).Address & ")),Daten!A1:A" & b & ",1))^(1/(DAYS360(" & sh_Ov.Cells(int_Start, 3).Address & "," & sh_Ov.Cells(int_Ende + 1, Int_links).Address & ")/360))-1)*100"

     'Swap all instances of MAX(1) for your range in the Daten sheet
    .Replace("MAX(1)", "Daten!B1:B" & b, LookAt:=xlPart)
End With
0 голосов
/ 08 ноября 2018

Сократите формулу массива до 255 символов (с помощью определенных имен) и повторите попытку.(вы превышаете максимальную длину)

https://docs.microsoft.com/en-us/office/vba/api/excel.range.formulaarray

...