Я пытаюсь написать формулу 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
Это могут быть встроенные кавычки в строке формулы. Возможно, попробуйте удвоить их или использовать Chr (34), чтобы отличить их от закрытия строки? – barryleajo
Я использовал команду 'nill = Char (34) & Char (34)' для вызова '' ''. Спасибо хоть. – Galju