
누군가 다음 작업을 더 빠르게 수행하는 방법에 대한 아이디어가 있다면 정말 감사하겠습니다. A 열에 이름 목록이 있고 그 이름 중 C 열에 나타나는 이름이 있는지 확인하고 싶습니다. 아래 코드는 500개의 이름으로 테스트할 때 훌륭하게 작동했습니다. 그러나 A열에 약 3000개의 값이 있고 C열에 150000개의 값이 있는 전체 데이터를 사용할 때 2시간 가까이 지났는데 완료되지 않았기 때문에 제대로 실행되고 있는지 확신할 수 없습니다.
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
셀에서 데이터를 반복해서 읽는 것은 비효율적입니다.
배열을 사용하여 모든 값을 로드합니다.
그런 다음 어레이에 대해 수행해야 할 작업을 수행하십시오.
모든 작업이 완료되면 값을 셀에 다시 입력하세요.