Установите ArrayFormula для многих ячеек Excel, используя VBA - PullRequest
7 голосов
/ 18 мая 2011

У меня есть формула массива, которая выводит одно значение, и я хочу дать целую кучу ячеек этой же формуле массива.Проблема в том, что когда я присваиваю формулу массива диапазону, она интерпретирует формулу таким образом, что все они совместно используют вывод одного вызова формулы массива, а не каждый из них выводит отдельное значение.

Чтобы показать вам, что я имею в виду, я использую следующий код:

With MarginalData
    .Range(.Cells(2, 1), .Cells(13, .UsedRange.Columns.Count)).FormulaArray = pullFormula
End With

То, что я хочу , это результат, который выглядит следующим образом: desired result

Вот как это выглядит, когда я вписываю формулу массива отдельно в каждую ячейку диапазона.

Но , что я получаю , это: given result

Вывод формулы массива в первой ячейке повторяется во всех столбцах - все они имеют один и тот же вывод.

Как программно назначить формулу массива, как если бы для каждой ячейки она была назначена отдельно?


Формула:

{= 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$1,BatchTTIDData!$1:$1,0))"
With wrksht
    With .Range(.Cells(2, 1), .Cells(13, .UsedRange.Columns.Count))
        .Formula = pullFormula
        .FormulaArray = .FormulaR1C1
    End With
End With

Ответы [ 3 ]

5 голосов
/ 18 мая 2011

Или выберите формулу массива как 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
2 голосов
/ 18 мая 2011

Вместо 1 доллара, попробуйте

INDIRECT(ADDRESS(1,COLUMN()))
1 голос
/ 19 мая 2011

Попробуйте сделать это полуавтоматически. Установите формулу для первой строки, затем используйте 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
...