Excel中的数组公式通过VBA完成,无需或不使用.ArrayFormula for Dynamic Range

时间:2017-11-30 21:23:54

标签: excel vba excel-vba excel-formula array-formulas

我正在尝试"翻译"以前在Excel工作表上没有VBA的过程。这个简单的过程是将这个数组公式:= {MAX(IF(C2:C355 = C2,F2:F355))}插入单元格CE2并将其向下拖动到数据集的底部(可变)。

我希望将此作为vba宏的一部分完成。我已经尝试了许多不同的选项来循环遍历可变数据集,但仍然遇到问题。

这些包括:

Dim i As Variant
LastRow = Worksheets("Sheet1").Range("A" & Rows.Count).End(xlUp).Row

 For i = 2 To LastRow

Cells(i, 83).FormulaArray = "=MAX(IF(cells(2,LastRow)= cells(5,i),cells(2,LastRow))"

Next i

以下代码似乎有效,但我尝试将代码转换为动态循环会导致错误:

Range("CE2").FormulaArray = "=MAX(IF(C:C=C2,F:F))"

通常错误是:"无法设置范围类&#34的FormulaArray属性。

我注意到通过VBA放置到工作表上的数组公式非常慢。我猜有一种方法可以通过不使用.VarriantArray的VBA实现与我的公式相同的结果?我已经研究了VBA的MAX函数,但我担心VBA命令有点过头了。

任何人可以提供任何帮助:

  1. 如何遍历动态数组并通过宏
  2. 将我的数组公式放在工作表上

    1. 使用.ArrayFormula
    2. 以外的VBA函数获得与我的数组公式相同的结果

      非常感谢提前!

2 个答案:

答案 0 :(得分:1)

没有使用FillDown的循环:

Dim LastRow As Long
With Worksheets("Sheet1")
    LastRow = .Range("A" & .Rows.Count).End(xlUp).row
    .Cells(2, 83).FormulaArray = "=MAX(IF(" & .Range(.Cells(2, 3), .Cells(LastRow, 3)).Address(1, 1) & "=C2," & .Range(.Cells(2, 6), .Cells(LastRow, 6)).Address(1, 1) & "))"
    .Range(.Cells(2, 83), .Cells(LastRow, 83)).FillDown
End With

答案 1 :(得分:0)

您似乎已将Cells的行和列反转,因此我猜测您想要:

Cells(i, 83).FormulaArray = "=MAX(IF(R2C3:R" & LastRow & "C3=R[0]C3,R2C5:R" & LastRow & "C5))"