首页 > 解决方案 > VBA listobject查找功能快速

问题描述

我有几张包含 ListObjects 的工作表

当我必须在 listbject 中查找相应的值时,我会执行以下操作:

dim mytable as Listobject
set mytable = thisworkbook.sheets(x).listobject(1)
ValuetoSearch="whatever"
valueResult=""
' looking for the corresponding value of column A in column B
for i=1 to mytable.listrows.count
    if mytable.listcolumns("A").databodyrange.item(i).value=ValuetoSearch then
       valueResult=mytable.listcolumns("B").databodyrange.item(i).value
       exit for
    end if
next i

这样可行。美好的。但:

这是最快的搜索方式吗?当用户选择工作表中的某些单元格(使用工作簿更改选择)时,我正在“即时”使用其中的几个查找操作,并且当“你感觉到”时,这几乎是一秒钟的延迟。对用户来说很烦人。

干杯谢谢

标签: excelvbaperformancelookup-tableslistobject

解决方案


VBA 的主要减速之一是读取/写入单元格值。您希望尽可能减少读取/写入工作表的次数。事实证明,在大多数情况下,将一系列值读入数组,然后对该数组进行计算,比对值范围本身进行相同的计算要快得多。

在您的情况下,您可以将表的范围读入一个数组(只有一个读取操作),而不是对每一行进行读取操作。

Dim mytable As ListObject
Dim myArr() As Variant

Set mytable = ThisWorkbook.Sheets(x).ListObject(1)
valuetosearch = "whatever"
valueResult = ""

myArr = mytable.Range.Value 'Read entire range of values into array

' looking for the corresponding value of column A in column B
For i = 1 To mytable.ListRows.Count
    If myArr(i, 1) = valuetosearch Then 'Check the value of the ith row, 1st column
       valueResult = myArr(i,2) 'Get the value of the ith row, 2nd column
       Exit For
    End If
Next i

我在一个有 1,000,000 行的表上运行了一个快速基准测试,搜索的值只出现在最后一行(最坏的情况)。您的原始代码需要 4.201 秒,而这个需要 0.484 秒。这几乎快了 9 倍!


推荐阅读