2014-11-04 2 views
3

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

Я тщательно проверил строковый формат формулы по 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. ВОПРОС EDIT: Когда эта ошибка отображается, отладчик указывает на линию: .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 
+0

Это могут быть встроенные кавычки в строке формулы. Возможно, попробуйте удвоить их или использовать Chr (34), чтобы отличить их от закрытия строки? – barryleajo

+0

Я использовал команду 'nill = Char (34) & Char (34)' для вызова '' ''. Спасибо хоть. – Galju

ответ

2

Я изменил #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 

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

+0

Я попытался заменить '#NULL!' На '' 1E99', чтобы убедиться, что он не переходит в 'SMALL', как вы предложили. Однако я не думаю, что это было проблемой. – Galju

+0

Я также пробовал написать формулу в ячейке так, как вы предлагали. Ошибка, которую я представляю теперь в строке '.Value = formulaP1', является« Ошибка времени выполнения »1004« Определенная приложением или объектная ошибка ». По моему опыту это обычно связано с фокусом команды, но я не могу найти в ней никакой ошибки ... Я также попытался изменить ее на '.Formula = formulaP1', но это не решило проблему. Это не позволяет мне перейти к строке 'FormulaArray = .Value', поэтому я могу выяснить, работает ли это решение. – Galju

+1

@Galju - Вы предисловили строку в 'formulaP1 =" '= IF (OR (...) с одной цитатой, как я сделал, чтобы заставить текстовое значение в ячейку? Если нет, мои извинения ... это было – Jeeped

Смежные вопросы