查询完成后,我使用下面的vba代码将以下公式插入到包含查询数据的工作表中。所有这些都适用于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年及之前的所有版本。
如果将其键入单元格,则需要按常用的Ctrl + 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