我使用以下代码:
Sub Evaluation_Formula()
Dim i As Long
With Worksheets("Sheet1")
i = .Evaluate("MIN(IF((LEFT($B$1:$B$89,5)*1)=C1,$B$1:$B$89,""""))")
.Range("F3").Value2 = i
End With
End Sub
但是,公式仅限于B89,如何在公式中使用B列中的最后一行?
答案 0 :(得分:3)
出于所有意图和目的,您实际上只关注B列中的最后一个数字,而不是最后一行。要在工作表公式中执行此操作,您将使用类似此数组公式的内容。
=MIN(IF(--LEFT(B1:INDEX(B:B, MATCH(1E+99,B:B )),5)=C1, B1:INDEX(B:B, MATCH(1E+99,B:B))))
这可以转换为您的VBA Evaluate method,如下所示。
Sub Evaluation_Formula()
Dim i As Long
With Worksheets("Sheet1")
i = .Evaluate("MIN(IF(--LEFT(B1:INDEX(B:B, MATCH(1E+99,B:B )),5)=C1, B1:INDEX(B:B, MATCH(1E+99,B:B))))")
.Range("F3").Value2 = i
End With
End Sub
双一元(又名 double-minus 或--
)执行的工作与将LEFT function的文本结果乘以1相同。不需要传入零长度字符串(例如""
),因为FALSE足以用于IF函数中的非匹配。由于您正在将文本评估为公式,因此不需要$
绝对标记。
将.
保留在.Evaluate
中,或将工作表名称添加到公式中的单元格引用中。如果没有它,如果 Sheet1 不能保存工作簿的ActiveSheet property,则存在评估另一个工作表的B1:B89和C1单元格的风险。
答案 1 :(得分:1)
我想这会发布正确的代码:
Sub Evaluation_Formula_w_LR()
Dim i As Long
Dim LR As Long
With Worksheets("Sheet1")
LR = .Cells(.Rows.Count, 2).End(xlUp).Row
i = Evaluate("MIN(IF((LEFT($B$1:$B$" & LR & ",5)*1)=C1,$B$1:$B$" & LR & ",""""))")
.Range("F10").Value2 = i
End With
End Sub