OfficeTutor.com
배움터 나눔터 교육센터 오튜장터
 통합검색  
  Home > 나눔터 > 엑셀 > 묻고답하기
엑셀
워드
액세스
파워포인트
아웃룩
프런트페이지
인포패스
원노트
비지오
쉐어포인트
포토드로우
퍼블리셔
오피스공통
MVP 안내
MVP 명예의 전당
MVP 카페

 

 

 

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

작성자:  

 정의성 (jes117)

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

 - 엑셀 버전(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)
 
 
 
회사소개 | 이용약관 | 개인정보 처리방침 | 회원정보수정 | 교육신청 및 문의 | 이메일무단수집거부 위로

오피스튜터 블로그 오피스튜터페이스북 오피스튜터유투브
110-722 서울 종로구 세종대로23길 47, 601-74 ㈜오피스튜터 ☎1544-4102 대표이사 : 전경수
개인정보관리책임자 : 이희진(privacy@officetutor.com) 사업자등록번호 120-86-14501
통신판매업신고 2013-서울종로-0547
norton
Copyright ⓒ OfficeTutor.com 이 페이지의 저작권은 ㈜오피스튜터와 콘텐츠 제공자에게 있습니다. 무단 복제를 금합니다.
Microsoft 및 Office 로고는 미국, 대한민국 및/또는 기타 국가에서의 Microsoft Corporation 등록 상표 또는 상표입니다.