Установите ArrayFormula для многих ячеек Excel с помощью VBA
у меня есть формула массива, которая выводит одно значение, и я хочу дать целую кучу ячеек этой же формуле массива. Проблема в том, что когда я назначаю формулу массива диапазону, она интерпретирует формулу таким образом, что все они разделяют вывод одного вызова формулы массива, а не каждый из них выводит отдельное значение.
чтобы показать вам, что я имею в виду, я использую следующий код:
With MarginalData
.Range(.Cells(2, 1), .Cells(13, .UsedRange.Columns.Count)).FormulaArray = pullFormula
End With
что я хочу!--8-->, в результате это выглядит так:
вот как это выглядит, когда я ввожу формулу массива отдельно в каждой ячейке в диапазоне.
но что я это:
выход формулы массива в первой ячейке повторяется во всех столбцах - все они имеют один и тот же выход.
Как я могу программно назначить формулу массива, как если бы каждая ячейка была назначена отдельно?
формула есть:
{=INDEX(BatchResults,MATCH(TTID&CHAR(1)&ROW()-1,BatchResultsTTIDS&CHAR(1)&BatchResultsLayers,0),MATCH(A$1,BatchTTIDData!1$:$1,0))}
он должен быть помещен в Формулу массива, потому что он выполняет соответствие не для одного столбца, а для двух объединенных столбцов. Конкатенация столбцов должна быть возвращена в виде массива, поэтому формула должна быть введена в виде формулы массива.
самое простое решение до сих пор, вариант из принятого ответа ниже, является следующим:
Const pullFormula = "=INDEX(BatchResults,MATCH(TTID&CHAR(1)&ROW()-1,BatchResultsTTIDS&CHAR(1)&BatchResultsLayers,0),MATCH(A,BatchTTIDData!:,0))"
With wrksht
With .Range(.Cells(2, 1), .Cells(13, .UsedRange.Columns.Count))
.Formula = pullFormula
.FormulaArray = .FormulaR1C1
End With
End With
3 ответов
или возьмите формулу массива как R1C1, назначьте Диапазону как FormulaR1C1, затем назначьте FormulaR1C1 как формулу массива. Это предполагает, что Формула массива находится в ячейке A2
Sub test()
With Sheet1
pullFormula = .Range("A2").FormulaR1C1
Set Rng = .Range(.Cells(2, 1), .Cells(13, .UsedRange.Columns.Count))
Rng.Formula = pullFormula
Rng.FormulaArray = Rng.FormulaR1C1
End With
End Sub
попробуйте сделать это полуавтоматически. Задайте формулу для первой строки, затем используйте FillDown.
Private Sub soCopyFormula()
Dim MarginalData As Worksheet
Set MarginalData = ActiveWorkbook.Worksheets("Sheet2")
Dim oRange As Range
Dim i As Integer
With MarginalData
Set oRange = .Range(.Cells(2, 1), .Cells(13, .UsedRange.Columns.Count))
' for each column
For i = 0 To oRange.Columns.Count - 1
' set first row
oRange(1, i).FormulaArray = pullFormula
' copy down
oRange.Columns(i).FillDown
Next
End With
End Sub