将索引匹配转换为动态VBA代码

时间:2019-01-31 17:03:39

标签: excel vba excel-2016

我有一个试图将其转换为VBA代码的索引匹配方程式:

=IFERROR(INDEX(Comments!$C$2:$C$100,MATCH(C8,Comments!$A$2:$A$100,0)),"COMMENT REQUIRED")

这是我想出的:

DestinationSheet.Cells(DestinationRow, 8).Value = Application.WorksheetFunction.Index(Sheets("Comments").Range("$C$2:$C$100"), Application.WorksheetFunction.Match((DestinationSheet.Range(DestinationRow, 3)), Sheets("Comments").Range("$A$2:$A$100"), 0), 1)

但是,我遇到一个错误。本质上,第一个公式基于C列中的值找到位于另一个工作表中的值。

对于第二段代码,我尝试浏览另一张表中的相同值,但基于定义为DestinationRow的行的第3列中的值。我在VBA代码中执行此操作,因为与索引匹配的条目的行号是未知的,这就是为什么我必须使用DestinationRow指定行,而不是像第一个公式那样对值进行硬编码。

1 个答案:

答案 0 :(得分:0)

像VLOOKUP这样看起来不太复杂:

Dim m
With DestinationSheet.Rows(DestinationRow)
    m = Application.VLookup(.Cells(3).Value, Sheets("Comments").Range("$A$2:$C$100"), 3, False)
    .Cells(8).Value = IIf(IsError(m), "COMMENT REQUIRED", m)
End With

注意:在VBA中使用工作表函数有两种不同的方式

这个:

Application.Worksheetfunction.VLookup(...)

如果没有匹配项,则会引发运行时错误,这是您需要捕获和处理的。

这个:

Application.VLookup(...)

不会不会引发运行时错误,但会返回一个错误值,您可以使用IsError()

进行测试