Я бы предложил вам:
Application.match
Вы также можете посмотреть здесь , вы найдете интересные исследования по 3 различным способам Поиск .Эти 3 различных способа будут изучены по времени и по количеству происшествий .
Согласно Fastexcel заключение этого исследования:
Не используйте Range.Find
, если вы не хотите искать большое количество столбцов для одной и той же вещи (вам нужно будет выполнить сопоставление для каждого столбца).
Подход Variant array удивительно эффективен, особенно когда вы ожидаете большого количества попаданий.
Матч выигрывает легко для небольшого количества попаданий .
Так что если вы, кроме большого количества попаданий, вам, возможно, придется попробовать вариант массива метод.3 способа перечислены в Fastexcel tuto
Редактировать
Прочитав комментарий, я сделал новый тест:
Код варианта
Sub Test1()
Dim vArr As Variant
Dim j As Long
Dim n As Long
Dim dTime As Double
dTime = MicroTimer
vArr = Range("A1:B100000").Value2
Dim Matches As Object: Set Matches = CreateObject("Scripting.Dictionary")
arr = Range("G1:G15").Value
For i = 1 To UBound(arr)
For j = 1 To UBound(arr, 2)
If Not Matches.Exists(arr(i, j)) Then Matches.Add arr(i, j), 1
Next j
Next i
For j = LBound(vArr) To UBound(vArr)
If Matches.Exists(vArr(j, 1)) Or Matches.Exists(vArr(j, 2)) Then n = n + 1
Next j
Debug.Print "Using Variant : " & n & " Timer :" & (MicroTimer - dTime) * 1000
End Sub
Словарь
Sub Test()
Dim rng1 As Range
Set rng1 = Range("A1:B100000")
Dim rng2 As Range
Set rng2 = Range("G1:G15")
Dim i As Long, j As Long
Dim arr As Variant
Dim dTime As Double
dTime = MicroTimer
Dim Matches As Object: Set Matches = CreateObject("Scripting.Dictionary")
arr = rng2.Value
'input the larger data inside a dictionary
For i = 1 To UBound(arr)
For j = 1 To UBound(arr, 2)
If Not Matches.Exists(arr(i, j)) Then Matches.Add arr(i, j), 1
Next j
Next i
'input the shorter data inside an array
arr = rng1.Value
For i = 1 To UBound(arr)
For j = 1 To UBound(arr, 2)
If Matches.Exists(arr(i, j)) Then
'your code if the value is found
cpt = cpt + 1
End If
Next j
Next i
Debug.Print "Using Damian Method : " & cpt & " Timer : " & (MicroTimer - dTime) * 1000
End Sub