나눔터  
  HOME > 나눔터 > 묻고답하기 > 엑셀
엑셀
엑셀에 대한 질문과 답변을 올려주세요. 단, 취지에 맞지 않는 글은 운영자가 삭제합니다.
 "000 님, 도와주세요", "부탁 드립니다.", "급합니다!" 등과 같이 막연한 제목을 달지 말아주세요.
[필독] 빠르고 정확한 답변을 얻는 16가지 Tip !
[필독] 저작권법 개정에 따른 이용안내

작성자:  

 정의성 (jes117)

추천:  2
파일:     조회:  2524
제목:   [매크로] 데이터 비교 속도 향상 질문
     
  * 답변하시는 분들께 도움이 되도록 자신의 환경을 아래 항목 옆에 기재해 주세요.

 - 엑셀 버전(95,97,2000,xp,2003,2007): 2007

* 아래줄에 질문을 작성하세요 >>

안녕하세요. 항상 많은 도움을 얻고 있습니다.감사합니다.
다름이 아니라, 매크로 속도향상에 대한 고수님들의 의견이 필요합니다.

데이터 추출 상황은 아래와 같습니다.
1. A데이터, B데이터 존재
2. A데이터의 ID를 기준으로, B데이터의 ID를 매칭
3. 매칭된 B데이터 ID의 시간 조건에 충족하는 값을 A데이터에 찍기

아웃풋은 잘 나오지만, 문제는 데이터의 양이 매우 큽니다.
=> A데이터 2만행 / B데이터 55만행

그럼, 고수님들의 조언 부탁 드리겠습니다.

-실행코드-
Dim sht1, sht2 As Worksheet
Dim Target1, Target2 As Range
Dim rng1, rng2 As Range
Dim i As Integer
Dim endRow As Long

Set sht1 = Worksheets("A")
Set sht2 = Worksheets("B")

i = 0
endRow = 1048576

sht1.Activate
Set Target1 = sht1.Range("B2:B" & CStr(sht1.Cells(endRow, 2).End(xlUp).Row))
realRowCnt = sht1.Cells(endRow, 2).End(xlUp).Row

sht2.Activate
Set Target2 = sht2.Range("B2:B" & CStr(sht2.Cells(endRow, 2).End(xlUp).Row))
sht2EndRow = sht2.Cells(endRow, 2).End(xlUp).Row

sht1.Activate
Application.ScreenUpdating = False
Application.DisplayStatusBar = True
Application.EnableEvents = False

For Each rng1 In Target1
    Set rng2 = Nothing
    Set rng2 = Target2.Find(rng1, Lookat:=xlWhole)
    If Not rng2 Is Nothing Then
        strAddress = rng2.Address
        Do
            With rng2
                'ID매칭
                If rng1.Offset(0, -1) = .Offset(0, 16) Then
                    '시간 비교1
                    If rng1.Offset(0, 3) >= .Offset(0, 15) Then
                        '시간 비교2
                        If rng1.Offset(0, 3) <= .Offset(0, 17) Then
                            'B데이터 값을 A데이터에 찍기
                            rng1.Offset(0, 7) = .Offset(0, 13)
                            Exit Do
                        End If
                    End If
                End If
            End With
            Set rng2 = Target2.FindNext(after:=rng2)
        Loop While rng2.Address <> strAddress
    End If
    i = i + 1: Application.StatusBar = i & " / " & realRowCnt
Next
Application.StatusBar = ""
Application.ScreenUpdating = True
Application.DisplayStatusBar = True
Application.EnableEvents = True
 
[불량 게시물 신고]  
수범이친구1. B 데이터의 같은 ID 가 모여있고
2. 순서가 A 데이터의 ID 와 같다면
조금 더 고칠 수 있겠습니다.
여기서 핵심은 Find, FindNext 함수를 최대한 적게 사용하는것일테니까요.
05-17 (14:57)
삭제 ■신고
정의성ID 정렬 후, 진행하니 조금의 속도 증가 확인했습니다. 
알려주셔서 감사합니다.
05-17 (15:27)
삭제 ■신고
정의성추가로 데이터 비교를 위한 최적의 방법은 어떤것이 있을까요?05-23 (10:50)
삭제 ■신고
        
  

작성일 : 2017-05-15(11:31)
최종수정일 : 2017-05-15(11:31)