다른 범위에 있는 동일한 셀의 행 번호를 얻는 다른 방법을 찾고 있습니다.
가장 빠른 방법 중 하나는 Match 기능을 사용하는 것입니다. 두 개의 매우 큰 범위(각각 500,000개 행 이상)에서 실행될 때 기본적으로 CPU 전체에서 병렬로 실행되며 좋은 CPU가 제공되면 매우 빠르게 진행됩니다. 그러나 CPU 성능이 약하거나 코어 수가 적은 경우(또는 멀티스레딩을 지원하지 않는 경우) 시간이 매우 오래 걸릴 수 있습니다. RAM을 거의 사용하지 않습니다.
RAM은 많이 사용하지만 CPU는 거의 사용하지 않는 검색 유형이 있나요? 이는 RAM은 많지만 CPU는 오래된 컴퓨터에 매우 유용합니다.
답변1
나는 검색하는 4가지 방법을 알고 있지만 결정적인 요소는 항상 CPU라고 생각합니다.
시험:
- out of the max of 1048576
- find cell A1048573
매치에 가까운 것은 없습니다
Time - LookupAppMatch(): 0.047 sec CPU usage 1%
Time - LookupAppMatch(): 0.031 sec CPU usage 0%
Time - LookupAppMatch(): 0.031 sec CPU usage 1%
Time - LookupWSMatch(): 0.047 sec CPU usage 1%
Time - LookupWSMatch(): 0.063 sec CPU usage 0%
Time - LookupWSMatch(): 0.047 sec CPU usage 0%
Time - LookupFind(): 0.672 sec CPU usage 8%
Time - LookupFind(): 0.625 sec CPU usage 5%
Time - LookupFind(): 0.625 sec CPU usage 7%
Time - LookupForLoop(): 0.297 sec CPU usage 5%
Time - LookupForLoop(): 0.297 sec CPU usage 3%
Time - LookupForLoop(): 0.297 sec CPU usage 3%
Time - LookupAutoFilter(): 0.672 sec CPU usage 7%
Time - LookupAutoFilter(): 0.359 sec CPU usage 5%
Time - LookupAutoFilter(): 0.375 sec CPU usage 7%
암호:
Option Explicit
Private Const FND = "A1048573"
Private t As Double
Public Sub SetupData()
Sheet1.Columns(1).Formula = "=Address(Row(), Column(), 4)"
End Sub
Public Sub LookupAppMatch()
t = Timer
Sheet1.Cells(1, 2) = Application.Match(FND, Sheet1.Columns(1), 0)
Debug.Print "Time - LookupAppMatch(): " & Format(Timer - t, "0.000") & " sec"
End Sub
Public Sub LookupWSMatch()
t = Timer
Sheet1.Cells(2, 2) = WorksheetFunction.Match(FND, Sheet1.Columns(1), 0)
Debug.Print "Time - LookupWSMatch(): " & Format(Timer - t, "0.000") & " sec"
End Sub
Public Sub LookupFind()
t = Timer
Sheet1.Cells(3, 2) = Sheet1.Columns(1).Find(What:=FND, LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=True).Row
Debug.Print "Time - LookupFind(): " & Format(Timer - t, "0.000") & " sec"
End Sub
Public Sub LookupForLoop()
Dim ur As Variant, r As Long
t = Timer
ur = Sheet1.Columns(1)
For r = 1 To UBound(ur)
If ur(r, 1) = FND Then Exit For
Next
Sheet1.Cells(4, 2) = r
Debug.Print "Time - LookupForLoop(): " & Format(Timer - t, "0.000") & " sec"
End Sub
Public Sub LookupAutoFilter()
t = Timer
Application.ScreenUpdating = False
With Sheet1.Columns(1)
.AutoFilter Field:=1, Criteria1:=FND
Sheet1.Cells(5, 2) = .Rows.Count - .SpecialCells(xlVisible).Cells.CountLarge - 1
.AutoFilter
End With
Application.ScreenUpdating = True
Debug.Print "Time - LookupAutoFilter(): " & Format(Timer - t, "0.000") & " sec"
End Sub