Excel VBA中的最后一行评估

时间:2015-12-15 16:13:45

标签: excel vba excel-formula evaluate

我使用以下代码:

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列中的最后一行?

2 个答案:

答案 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