vba를 사용하여 일치하는 두 열을 비교합니다.

vba를 사용하여 일치하는 두 열을 비교합니다.

누군가 다음 작업을 더 빠르게 수행하는 방법에 대한 아이디어가 있다면 정말 감사하겠습니다. 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

셀에서 데이터를 반복해서 읽는 것은 비효율적입니다.

배열을 사용하여 모든 값을 로드합니다.

그런 다음 어레이에 대해 수행해야 할 작업을 수행하십시오.

모든 작업이 완료되면 값을 셀에 다시 입력하세요.

관련 정보