Excel 高效查找表

Excel 高效查找表,excel,lookup-tables,vba,Excel,Lookup Tables,Vba,我目前有一个查找表,我正在使用它为一个记录分配一个值,在分配值之前,给定3个要匹配的输入。该表有3426条记录,我希望找到一种方法使查找过程运行得更快。我正在使用以下功能执行查找: Function FindValue(rng1 As String, rng2 As Date, rng3 As String) As Variant Dim varVal1 As Variant Dim varVal2 As Variant Dim varVal3 As Variant Dim rngTargetA

我目前有一个查找表,我正在使用它为一个记录分配一个值,在分配值之前,给定3个要匹配的输入。该表有3426条记录,我希望找到一种方法使查找过程运行得更快。我正在使用以下功能执行查找:

Function FindValue(rng1 As String, rng2 As Date, rng3 As String) As Variant
Dim varVal1 As Variant
Dim varVal2 As Variant
Dim varVal3 As Variant
Dim rngTargetA As Range
Dim rngTargetB As Range
Dim rngTargetC As Range
Dim lngRowCounter As Long
Dim ws As Worksheet

varVal1 = rng1
varVal2 = rng2
varVal3 = rng3

Set ws = Sheets("Uncertinaty_LU")
lngRowCounter = 2
Set rngTargetA = ws.Range("A" & lngRowCounter)
Set rngTargetB = ws.Range("B" & lngRowCounter)
Set rngTargetC = ws.Range("C" & lngRowCounter)
Do While Not IsEmpty(rngTargetA.Value)
    If UCase(rngTargetA.Value) = varVal1 And rngTargetB.Value = varVal2 And UCase(rngTargetC.Value) = UCase(varVal3) Then
        FindValue = ws.Range("D" & lngRowCounter).Value
        Exit Function
    End If

    lngRowCounter = lngRowCounter + 1
    Set rngTargetA = ws.Range("A" & lngRowCounter)
    Set rngTargetB = ws.Range("B" & lngRowCounter)
    Set rngTargetC = ws.Range("C" & lngRowCounter)
Loop

' if we don't find anything, return an empty string '

MsgBox ("Could not find uncertainty value for " & varVal1 & ", " & varVal2 & ", " & varVal3)
FindValue = ""


End Function
在上述函数中,rng1、rng2和rng3是工作簿中另一页的输入输出


尽管查找表中有3426条记录,但rngTargetA中有38个唯一值,rngTargetC中有4个唯一值。我希望找到一个解决方案,它首先在rngTargetA中找到感兴趣的唯一值,然后再开始遍历记录以查找感兴趣的记录

工作簿中rng1、2、3引用的另一个页面是什么?为什么不在查找表上放置一个临时自动筛选,筛选相关输入,然后读取值?我也考虑过这一点,但我不愿意使用内置excel函数对查找表进行子集设置。这就像我想将查找表提交到内存中,而不是每次调用函数时逐行读取它一样。@PJRosenburg rng1,2,3正在引用工作簿中其他工作表上的3个单元格。更具体地说,它们来自我读取并输入到单元格中的文本文件。此函数在工作表中的任意位置调用40到100次。我总共有84张使用此功能的图纸。