
Я был бы очень признателен, если бы кто-нибудь подсказал, как выполнить следующую задачу быстрее. У меня есть список имен в столбце A, и я хочу посмотреть, появятся ли какие-либо из этих имен в столбце C. Код ниже отлично работает, когда я тестирую его с 500 именами. Но когда я использую свои полные данные, которые содержат около 3000 значений в столбце A и 150000 в столбце C, я не уверен, что он работает правильно, потому что прошло почти два часа, и он не закончился.
Sub compare_cols122()
Dim NameList As Worksheet
Dim i As Long, j As Long
Dim LastRow As Long
Set NameList = Excel.Worksheets("Names")
LastRow = NameList.UsedRange.Rows.Count
Application.ScreenUpdating = False
For i = 2 To LastRow
For j = 2 To LastRow
If NameList.Cells(i, 1).Value <> "" Then
If InStr(1, NameList.Cells(j, 3).Value, NameList.Cells(i, 1).Value, vbTextCompare) > 0 Then
NameList.Cells(j, 3).Interior.ColorIndex = 6
NameList.Cells(i, 1).Interior.ColorIndex = 6
Exit For
Else
End If
End If
Next j
Next i
Application.ScreenUpdating = True
End Sub
решение1
Вот ваш код, ускоренный за счет загрузки данных в массивы и выполнения сравнения с ними:
Sub compare_cols122()
Dim NameList As Worksheet
Dim i As Long, j As Long
Set NameList = Excel.Worksheets("Names")
Dim rngNames As Range
Set rngNames = Range("A1", Range("A1").Offset(Rows.Count - 1).End(xlUp))
Dim varNames As Variant
varNames = rngNames.Value2
Dim rngData As Range
Set rngData = Range("C1", Range("C1").Offset(Rows.Count - 1).End(xlUp))
Dim varData As Variant
varData = rngData.Value2
Application.ScreenUpdating = False
For i = LBound(varNames) + 1 To UBound(varNames)
For j = LBound(varData) + 1 To UBound(varData)
If varNames(i, 1) <> "" Then
If InStr(1, varData(j, 1), varNames(i, 1), vbTextCompare) > 0 Then
NameList.Cells(j, 3).Interior.ColorIndex = 6
NameList.Cells(i, 1).Interior.ColorIndex = 6
Exit For
Else
End If
End If
Next j
Next i
Application.ScreenUpdating = True
End Sub
Обратите внимание, что перестановка внутреннего и внешнего циклов только замедлит поиск, независимо от того, насколько редки совпадения.
решение2
Считывание данных из ячеек снова и снова неэффективно.
Используйте массив(ы) для загрузки всех значений.
Затем сделайте то, что вам нужно сделать с массивом.
Когда все будет сделано, верните значения в ячейки.