1

我想对查找值列表进行垂直查找,然后将多个值返回到每个查找值的列中。经过长时间的谷歌搜索,我实际上设法做到了这一点,这是代码:

=INDEX(Data!$H$3:$H$70000, SMALL(IF($B3=Data!$J$3:$J$70000, ROW(Data!$J$3:$J$70000)-MIN(ROW(Data!$J$3:$J$70000))+1, ""), COLUMN(A$2)))

现在,我的问题是,正如您在公式中看到的,我的查找范围包含 70,000 行,这意味着很多返回值。但是这些返回值中的大多数都是双倍的。这意味着我必须将上面的公式拖到许多列上,直到所有查找值(大约 200)都返回 #NUM!。

有没有可能的方法,我猜 VBA 是必要的,在删除重复项后返回值?我是 VBA 的新手,我不知道该怎么做。计算有这么多细胞也需要很长时间。

4

2 回答 2

1

[已编辑]

您可以使用修改后的公式来做您想做的事,但不确定 70,000 行的效率如何。

使用此公式进行第一场比赛

=IFERROR(INDEX(Data!$H3:$H70000,MATCH($B3,Data!$J3:$J70000,0)),"")

现在假设F5中的公式在 G5 中使用此公式确认CTRL+SHIFT+ENTER并复制

=IFERROR(INDEX(数据!$H3:$H70000,MATCH(1,($B3=数据!$J3:$J70000)*ISNA(MATCH(数据!$H3:$H70000, $F5:F5 ,0)) ,0)),"")

根据公式 1 的位置更改粗体部分

这将为您提供一个没有重复的列表......当您用完值时,您会得到空白而不是错误

于 2013-01-10T11:11:23.820 回答
1

不确定您是否仍在寻求 VBA 答案,但这应该可以完成工作 - 在我的机器上运行大约需要 25 秒 - 这个论坛上的人可能会加速它:

Sub ReturnValues()

Dim rnSearch As Range, rnLookup As Range, rnTemp As Range Dim varArray
As Variant Dim lnIndex As Long Dim strTemp As String

Set rnSearch = Sheet1.Range("A1:A200") 'Set this to your 200 row value range
Set rnLookup = Sheet2.Range("A1:B70000") 'Set this to your lookup range (assume 2
columns)

varArray = rnLookup

For Each rnTemp In rnSearch
    For lnIndex = LBound(varArray, 1) To UBound(varArray, 1)
        strTemp = rnTemp.Value
        If varArray(lnIndex, 1) = strTemp Then
            If WorksheetFunction.CountIf(rnTemp.EntireRow, varArray(lnIndex, 2)) = 0 Then 'Check if value exists already
                Sheet1.Cells(rnTemp.Row, rnTemp.EntireRow.Columns.Count).End(xlToLeft).Offset(0, 1).Value =
varArray(lnIndex, 2)
            End If
        End If
    Next Next

End Sub
于 2013-01-10T15:39:29.997 回答