Ошибка выполнения: 1004 Невозможно установить свойство FormulaArray класса Range.

Я пытаюсь заставить VBA написать формулу в определенных диапазонах ячеек со значениями строк, определенными переменной: Arr(,). Поскольку в EXCEL я бы использовал Ctrl+Shift+Enter для формулы, я использую команду FormulaArray. Однако я получаю: Run-time error: 1004 Unable to set the FormulaArray property of the Range Class.

Я тщательно проверил строковый формат формулы с помощью печати VBA в виде строки в ячейке и сравнил ее с моим обычным вводом в EXCEL. Так что формула должна подойти. Я проверил длину ввода FormulaArray и убедился, что она значительно ниже ограничения в 255 символов. Следуя предложению из Интернета (http://dailydoseofexcel.com/archives/2005/01/10/entering-long-array-formulas-in-vba/), я использовал команду .Replace, чтобы преодолеть ограничение на количество слов.

Я также попытался заменить команду With Sheets("Detail analysis").Cells(a, j) на With Sheets("Detail analysis").Range(Cells(a,j).Address(0,0)); однако это по-прежнему дает ошибку FormulaArray.

Тем не менее, я все еще получаю сообщение об ошибке: Run-time error: 1004 Unable to set the FormulaArray property of the Range Class. РЕДАКТИРОВАНИЕ ВОПРОСА: при отображении этой ошибки отладчик указывает на строку: .FormulaArray = formulaP1.

Может ли кто-нибудь предложить, где я ошибаюсь с кодом?

' Define variables '
Dim top As Integer
Dim bottom As Integer

Dim a As Integer
Dim sumrows As Double   ' Summation of the Main Loads in a list '
Dim totalsum As Double  ' Generator Loads total '
Dim etotalsum As Double ' Emergency Generator Loads total '
Dim g As Integer
Dim formulaP1 As String
Dim formulaP2 As String
Dim formulaP3 As String
Dim formulaP4 As String
Dim nill As String

nill = Chr(34) & Chr(34)


j = 6

' Loop for the number of "Actual Load" columns required '

Do While Sheets("Detail analysis").Cells(9, j).Value = Sheets("Detail analysis").Cells(9, 6).Value

totalsum = 0
etotalsum = 0

' Nested Loop for the list ranges identified by the previous code block (i.e. between orange and     blue rows) '

i = 1

Do While Arr(i, 1) <> green ' Green is a previously defined row number '

''''' Identify the Orange (Top) and Blue (bottom) rows of the current list '

    top = Arr(i, 1)
    bottom = Arr(i, 2)


''''' Write formula in the "Actual Load" column between the Arr() rows '
    For a = (top + 1) To (bottom - 1)

    formulaP1 = "=IF(OR($B" & a + 1 & "=" & nill & ",$A" & a & "=" & nill & "),IF(OR($A" & a & "<>" & nill & ",$B" & a & "<>" & "X_X_X()"
    formulaP2 = nill & "),$C" & a & "*$D" & a & "*" & Sheets("Detail analysis").Cells(a, j - 1).Address(0, 0) & "," & nill & ")," & "Y_Y_Y()"
    formulaP3 = "SUM(" & Sheets("Detail analysis").Cells(a + 1, j).Address(0, 0) & ":INDIRECT(ADDRESS(SMALL(IFERROR(IF($A" & a + 2 & ":$A$" & bottom & "<>" & nill & "Z_Z_Z()"
    formulaP4 = ",ROW($A" & a + 2 & ":$A$" & bottom & ")-1),#NULL!),1),COLUMN(" & Sheets("Detail analysis").Cells(a, j).Address(0, 0) & "),1,1,))))"

         With Sheets("Detail analysis").Cells(a, j)
            .FormulaArray = formulaP1
            .Replace "X_X_X()", formulaP2
            .Replace "Y_Y_Y()", formulaP3
            .Replace "Z_Z_Z()", formulaP4

        End With
    Next a


    Next a

i = i + 1
Loop


j = j + 2

Loop

ВОПРОС EDIT После некоторых дальнейших испытаний я попытался закодировать VBA некоторые условия в формуле. Это разделило формулу на две части: одна инструкция — =cell*cell*cell, поэтому FormulaArray не требуется. Когда я запустил код, эти команды выполняются хорошо.

Второй оператор — это суммирование, которое рассматривает диапазон ячеек для вычисления значения. Код теперь дает сбой именно тогда, когда мои условия требуют строки FormulaArray. Н.Б. Я проверил количество символов в formula, и в сумме они составляют 250 (меньше ограничения в 255, указанного на веб-сайте MSDN http://msdn.microsoft.com/en-us/library/office/ff837104(v=office.15).aspx).

ws= Sheets("Detail analysis")

With ws

    formula = "=SUM(" & .Cells(a + 1, j).Address(0, 0) & ":INDIRECT(ADDRESS(SMALL(IFERROR(IF($A" & a + 2 & ":$A$" & bottom & "<>" & nill & _
                ",ROW($A" & a + 2 & ":$A$" & bottom & ")-1),1E+99),1),COLUMN(" & .Cells(a, j).Address(0, 0) & "),1,1,))))"

End With

For a = (top + 1) To (bottom - 1)

    If ws.Cells(a + 1, 2) = "" Or ws.Cells(a, 1) = "" Then
        If (ws.Cells(a, 1) <> "" Or ws.Cells(a, 2) <> "") And ws.Cells(a, j - 1) <> "" Then
            ws.Cells(a, j).formula = "=$C" & a & "*$D" & a & "*" & ws.Cells(a, j - 1).Address(0, 0)
        End If
    Else
         ws.Cells(a, j).FormulaArray = formula
    End If
Next a

person Galju    schedule 04.11.2014    source источник
comment
Возможно, это встроенные кавычки в строке формулы. Возможно, попробуйте удвоить их или использовать Chr(34), чтобы отличить их от закрытия строки?   -  person barryleajo    schedule 04.11.2014
comment
Я использовал команду nill= Char(34) & Char(34) для вызова "". Спасибо хоть.   -  person Galju    schedule 04.11.2014


Ответы (1)


Я изменил #NULL!, который у вас был, на 1E+99, чтобы никогда не было SMALL. Не уверен, откуда берется #NULL!, но это не принятый код ошибки Excel. Я также изменил метод сборки формулы массива, выбрав сборку в виде строки в ячейке и преобразование ее в формулу массива только после замены и полного формирования формулы. Не имея данных для тестирования и некоторых переменных (значения отсутствовали в образце), я придумал это.

' Write formula in the "Actual Load" column between the Arr() rows '
For a = (top + 1) To (bottom - 1)
     With Sheets("Detail analysis")
        formulaP1 = "'=IF(OR($B" & a + 1 & "=" & nill & ",$A" & a & "=" & nill & "),IF(OR($A" & a & "<>" & nill & ",$B" & a & "<>" & "X_X_X()"
        formulaP2 = nill & "),$C" & a & "*$D" & a & "*" & .Cells(a, j - 1).Address(0, 0) & "," & nill & ")," & "Y_Y_Y()"
        formulaP3 = "SUM(" & .Cells(a + 1, j).Address(0, 0) & ":INDIRECT(ADDRESS(SMALL(IFERROR(IF($A" & a + 2 & ":$A$" & bottom & "<>" & nill & "Z_Z_Z()"
        formulaP4 = ",ROW($A" & a + 2 & ":$A$" & bottom & ")-1),1E99),1),COLUMN(" & .Cells(a, j).Address(0, 0) & "),1,1,))))"

        With .Cells(a, j)
            .Value = formulaP1
            .Replace What:="X_X_X()", Replacement:=formulaP2, lookat:=xlPart
            .Replace What:="Y_Y_Y()", Replacement:=formulaP3, lookat:=xlPart
            .Replace What:="Z_Z_Z()", Replacement:=formulaP4, lookat:=xlPart
            .FormulaArray = .Value
        End With
    End With
Next a

Дополнение: функциональность .Replace по умолчанию использовалась бы последней. Если бы это было xlWhole, то .Replace и последующее .FormulaArray присваивание снова завершилось бы ошибкой. Я изменил, чтобы указать параметр , lookat:=xlPart.

person Community    schedule 04.11.2014
comment
Я попытался заменить #NULL! на тот самый 1E99, чтобы убедиться, что там он не идет к SMALL, как вы предложили. Однако я не думаю, что это было проблемой. - person Galju; 04.11.2014
comment
Я также попытался написать формулу в ячейке так, как вы предложили. Ошибка, с которой я сейчас сталкиваюсь в строке .Value=formulaP1, является ошибкой времени выполнения «1004», определяемой приложением или ошибкой, определяемой объектом. По моему опыту, это обычно связано с фокусом команды, но я не могу найти в этом никакой ошибки... Я также пытался изменить его на .Formula= formulaP1, но это не решило проблему. Теперь это не позволяет мне добраться до строки FormulaArray=.Value, поэтому я могу проверить, работает ли решение. - person Galju; 04.11.2014
comment
@Galju - Вы предваряли строку в formulaP1 = "'=IF(OR(... одинарной кавычкой, как я, чтобы ввести текстовое значение в ячейку? Если нет, то мои извинения... это было скрыто и, вероятно, должно было быть упомянуто. - person ; 04.11.2014
comment
Это всегда сводится к чему-то настолько маленькому! Не нужно извиняться, я тот, кто пропустил это. Теперь код работает гладко, как вы предложили. Большое спасибо за помощь. - person Galju; 04.11.2014