엑셀

엑셀 VBA로 자료 처리 - 신청자, 회원목록 비교 4

파란바람이 2020. 7. 13. 10:11

며칠전에 연락한 후 따로 연락이 없어서 다 끝난건가 싶었는데, 오늘 아침 다시 연락이 왔습니다.

마무리 작업을 진행 중이군요.

한 가지 일을 처리하는데도 완전히 끝내려면 꽤나 많은 일이 필요하군요.

 

연락 온 용건은 반복지급된 내역 중 중복자의 경우 한 번만 나타내도록 색상을 지정하는 것이었습니다.

 

아주 흔한 작업이고 공식 같은 코드가 있습니다.

Public Sub 중복자한명만색상으로나타내기()
    i = 4
    이름 = ""
    
    Do
        If Range("B" & i).Value <> 이름 Then
            Range("B" & i).Interior.ColorIndex = 19
            이름 = Range("B" & i).Value
        End If
        
        i = i + 1
    Loop While Range("B" & i).Value <> ""
End Sub

단지 귀찮은 점은 여러 개 파일로 나눠져 있어 파일을 하나씩 열어 작업하고 다시 닫는 일이었습니다.

이럴 바에 코드 자체에서 파일을 열어 처리하도록 하는게 빠르고 귀찮음을 줄일 수 있었겠다 싶습니다.

 


7월 15일 다시 처리 작업 요청이 들어왔습니다.

 

계좌번호를 기준으로 전화번호를 찾아 등록하는 것이었습니다.

 

앞에서 작업한 내용을 조금 수정해서 다시 처리했습니다.

 

Public Sub 전화번호찾아나타내기()
    Dim sht1 As Worksheet
    Dim sht2 As Worksheet
    Dim strAddr As String
    Dim C As Range
    Dim i As Long
    
    Dim P(1 To 50) As String    ' 찾은 전화번호 저장
    Dim CHUL(1 To 50) As String  ' 중복검사해 출력 전화번호 저장
    Dim 확인 As Boolean
    Dim 출력 As String

    시트 = "작업시트"
    열 = "I"    ' 찾을 값
    비교열 = 16 ' P열 찾는 열

    Set sht1 = ActiveSheet
    Set sht2 = Sheets(시트)

    시작 = 4
    끝 = sht1.Range("A" & 시작).End(xlDown).Row
    열번호 = Range(열 & "1").Column ' 열에 해당하는 숫자 구함 I : 9
    출력열 = "J"

    시작시간 = timer
    Application.ScreenUpdating = False

    For i = 시작 To 끝
        j = 1
        
        Set C = sht2.Columns(비교열).Find(sht1.Cells(i, 열번호).Value, LookAt:=xlWhole)

        If Not C Is Nothing Then
            strAddr = C.Address
            Do
                P(j) = C.Offset(0, -1).Value
                j = j + 1
            
                Set C = sht2.Columns(비교열).FindNext(C)
            Loop While Not C Is Nothing And C.Address <> strAddr
        End If
        
        m = 1
        확인 = True
        
        For k = 1 To j - 1
            For l = 1 To m
                If P(k) = CHUL(l) Then
                    확인 = False
                    Exit For
                End If
            Next l
            
            If 확인 Then
                CHUL(m) = P(k)
                
                m = m + 1
            End If
            
            확인 = True
        Next k
        
        For k = 1 To m - 1
            출력 = 출력 & CHUL(k) & ", "
        Next k
        
        If Len(출력) > 2 Then
            출력 = Left(출력, Len(출력) - 2)
        End If
        
        sht1.Range(출력열 & i).Value = 출력
        
        출력 = ""
        
        For k = 1 To j - 1
            P(k) = ""
            CHUL(k) = ""
        Next k
    
        DoEvents
    Next i

    Application.ScreenUpdating = True
    Beep
    MsgBox "총 " & format(timer - 시작시간, "#,##0") & "초 소요"
End Sub

 

이렇게 반복되는 작업이 있을 때 직접 코딩해 작업을 쉽고 빠르게 할 수 있도록 소개를 잘해야 하는데, 차근차근 소개하는게 쉽지 않군요.