1

ルックアップ値のリストに対して垂直ルックアップを実行し、ルックアップ値ごとに複数の値を列に返したいと考えています。私は実際に長いGoogle検索の後にこれを行うことができました.これはコードです:

=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 行が含まれていることです。これは、多くの戻り値を意味します。しかし、これらの戻り値のほとんどは double です。これは、すべてのルックアップ値 (約 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(Data!$ H3:$ H70000、MATCH(1、($ B3 = Data!$ J3:$ J70000)* ISNA(MATCH(Data!$ 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 に答える