0

我正在尝试Xlookup在 VBA 中使用。我以前曾将它用作 Excel 工作表中的公式,但我一直坚持让它在 VBA 中返回一系列值。

例如,下面的工作正常,因为Xlookup它只返回一个值 - B 列中的值:

Range("E1") = Application.WorksheetFunction.XLookup(sValue, Range("A:A"), Range("B:B"), "Tag Not Found", 0, 1)

一旦我将返回范围增加到一列以上,我什么也没有返回:

Range("E1") = Application.WorksheetFunction.XLookup(sValue, Range("A:A"), Range("B:C"), "Tag Not Found", 0, 1)

在 Excel 中,此公式将简单地将第一个值放入 E1,然后将第二个值“溢出”到 F1。

在后一个示例中,我看到返回的类型是变体(1 到 2)。有没有什么技巧可以让它表现得像 Excel,然后简单地溢出?

我想我可以将返回的值放入一个变量中,然后遍历它并提取每个元素 - 但我想知道是否有更简洁的方法来做到这一点。

4

2 回答 2

1

为了让事情动态地溢出,你需要一个公式。XLOOKUP 的技巧之一是它可以返回 Range 而不仅仅是值。所以尝试使用这个公式;

Range("e1").Formula2 = "=" & Application.WorksheetFunction.XLookup(2, Range("A:A"), Range("B:C")).Address
于 2021-06-20T18:34:21.237 回答
0

将在 VBA 中使用工作表函数的结果返回给变量总是一个好主意。

主要原因是检查错误,但另一个原因是结果可能在数组中返回多个值

返回数组时,您可以使用UBound获取行数和列数并适当调整目标范围的大小。

Dim Res As Variant

    Res = Application.XLookup(sValue, Range("A:A"), Range("B:C"), "Tag Not Found", 0, 1)

    If Not IsError(Res) Then
        If Not IsArray(Res) Then
            Range("E1").Value = Res
        End If
        Range("E1").Resize(UBound(Res,1), UBound(Res,2)).Value = Res
    Else
        MsgBox "XLOOKUP returned an error!", vbInformation
    End If
于 2021-06-20T09:11:36.323 回答