不带数组公式的 MAXIFS 代入
Substitution for MAXIFS without array formula
查询完成后,我使用下面的 vba 代码将以下公式与查询数据一起插入到 sheet 中。在 Excel Office365 上一切正常,但如果 Excel 的版本是 2016 独立版,则公式失败并出现 #NAME 错误,因为该函数在该版本中不可用。我有一些用户坚持使用它。
我知道公式数组可以替换它,但我不确定如何执行此操作并用代码插入它,以及可以替换它的最有效公式是什么。
=IF(OR(ISERROR(MAXIFS(Consumed!D:D,Consumed!B:B,A2)),
MAXIFS(Consumed!D:D,Consumed!B:B,A2)=0),"",
MAXIFS(Consumed!D:D,Consumed!B:B,A2))
感谢任何帮助。
strInsertFormula = "=IF(OR(ISERROR(MAXIFS(Consumed!D:D,Consumed!B:B,A2)),MAXIFS(Consumed!D:D,Consumed!B:B,A2)=0),"""",MAXIFS(Consumed!D:D,Consumed!B:B,A2))"
With Sheet3
.Range("Individual_Bottles").Columns(.Range("EndRng").Offset(0, 1).Column).Insert Shift:=xlToRight
.Range("EndRng").Offset(-1, 1).Cells(1, 1).Value = "Last Drank"
.Range("EndRng").Offset(0, 1).Formula = strInsertFormula
.Range("EndRng").Offset(0, 1).NumberFormat = "yy/mm/dd"
End With
您可以使用 Excel 数组公式 =MAX(IF(B:B=A2,D:D,""))
来查找条件最大值(您可以围绕此添加额外的错误检查等)。这将适用于 2016 年及更早版本的所有版本。
如果将其键入单元格,则需要按常规的 Crtl+Shift+Enter(称为 CSE)。
如果要通过代码输入此数组公式,需要将范围的FormulaArray 属性设置为上述,而不是公式属性。所以你的代码应该是:
.Range("EndRng").Offset(0, 1).FormulaArray = strInsertFormula
其中strInsertFormula
就是我上面提到的数组公式
@JohnF 好吧,多亏了 John F,我让它工作了。我曾预计我将不得不使用循环,但希望不要这样做。最后我做了,因为我相信 FillDown 方法需要选择范围,而我不想那样做。这是最终代码
ii = .Range("EndRng").rows.Count
ConsRows = Consumed.Range("Consumed").rows.Count
For i = 1 To ii
strInsertFormula = "=IF(IFERROR(MAX(IF(Consumed!B1:B" & ConsRows & "=" & _
.Range("A1").Offset(i, 0).Address & _
",Consumed!D1:D" & ConsRows & ","""")),0)>0,MAX(IF(Consumed!B1:B" & ConsRows & "=" & _
.Range("A1").Offset(i, 0).Address & _
",Consumed!D1:D" & ConsRows & ","""")),"""")"
.Range("EndRng").Offset(0, 1).Cells(i, 1).FormulaArray = strInsertFormula
Next
End If
查询完成后,我使用下面的 vba 代码将以下公式与查询数据一起插入到 sheet 中。在 Excel Office365 上一切正常,但如果 Excel 的版本是 2016 独立版,则公式失败并出现 #NAME 错误,因为该函数在该版本中不可用。我有一些用户坚持使用它。
我知道公式数组可以替换它,但我不确定如何执行此操作并用代码插入它,以及可以替换它的最有效公式是什么。
=IF(OR(ISERROR(MAXIFS(Consumed!D:D,Consumed!B:B,A2)),
MAXIFS(Consumed!D:D,Consumed!B:B,A2)=0),"",
MAXIFS(Consumed!D:D,Consumed!B:B,A2))
感谢任何帮助。
strInsertFormula = "=IF(OR(ISERROR(MAXIFS(Consumed!D:D,Consumed!B:B,A2)),MAXIFS(Consumed!D:D,Consumed!B:B,A2)=0),"""",MAXIFS(Consumed!D:D,Consumed!B:B,A2))"
With Sheet3
.Range("Individual_Bottles").Columns(.Range("EndRng").Offset(0, 1).Column).Insert Shift:=xlToRight
.Range("EndRng").Offset(-1, 1).Cells(1, 1).Value = "Last Drank"
.Range("EndRng").Offset(0, 1).Formula = strInsertFormula
.Range("EndRng").Offset(0, 1).NumberFormat = "yy/mm/dd"
End With
您可以使用 Excel 数组公式 =MAX(IF(B:B=A2,D:D,""))
来查找条件最大值(您可以围绕此添加额外的错误检查等)。这将适用于 2016 年及更早版本的所有版本。
如果将其键入单元格,则需要按常规的 Crtl+Shift+Enter(称为 CSE)。
如果要通过代码输入此数组公式,需要将范围的FormulaArray 属性设置为上述,而不是公式属性。所以你的代码应该是:
.Range("EndRng").Offset(0, 1).FormulaArray = strInsertFormula
其中strInsertFormula
就是我上面提到的数组公式
@JohnF 好吧,多亏了 John F,我让它工作了。我曾预计我将不得不使用循环,但希望不要这样做。最后我做了,因为我相信 FillDown 方法需要选择范围,而我不想那样做。这是最终代码
ii = .Range("EndRng").rows.Count
ConsRows = Consumed.Range("Consumed").rows.Count
For i = 1 To ii
strInsertFormula = "=IF(IFERROR(MAX(IF(Consumed!B1:B" & ConsRows & "=" & _
.Range("A1").Offset(i, 0).Address & _
",Consumed!D1:D" & ConsRows & ","""")),0)>0,MAX(IF(Consumed!B1:B" & ConsRows & "=" & _
.Range("A1").Offset(i, 0).Address & _
",Consumed!D1:D" & ConsRows & ","""")),"""")"
.Range("EndRng").Offset(0, 1).Cells(i, 1).FormulaArray = strInsertFormula
Next
End If