본문 바로가기
VBA/엑사남_기초방

[기초방] VBA 100제 #19 [ 이름별 나열하기 ]

by 일등미노왕국 2023. 1. 18.

더보기
Option Explicit
Sub 기초19()

    Dim Reg As Object: Set Reg = CreateObject("Vbscript.regexp")
    Dim rngX As Range: Set rngX = [c5]
    
    
    Application.ScreenUpdating = False
    
    Do Until IsEmpty(rngX)
    
        rngX.Copy rngX.Next                                               '= 출연자의 이름을 D열에 복사
    
        With Reg

            .Pattern = "\(\d+\)"                                          '= (숫자) 를 패턴으로
            .Global = True
            
            If .test(rngX.Next) Then rngX.Next = .Replace(rngX.Next, "")  '= 일치패턴을 없애라
            
            Application.DisplayAlerts = False                             '= 경고 표시 해제
            
                rngX.Next.TextToColumns comma:=True                       '= D열에 복사된 출연자를 콤마로 텍스트 나누기
                
            Application.DisplayAlerts = False                             '= 경고 표시 설정
            
        End With
    
    Set rngX = rngX.Offset(1)

    Loop
    
    Call 기초19_1(Reg, rngX)
    
    Application.ScreenUpdating = True
    
    MsgBox "완료"
    
End Sub

              
'= 패턴설명 : \,? 콤마가 없거나 하나 / .? 아무 문자나 없거나 하나
'= 패턴설명 : (   엑사남\(.+?\)   ) 1그룹 / 엑사남(숫자)
'= 패턴설명 : ( ) 은 그룹을 뜻하고 \( \d+ \) 은 (숫자) 를 뜻한다. 특수문자는 \ 과 함께 사용

.Pattern = "\,?.?(" & Cells(14, 3 + i) & "\(.+?\))"

더보기
Sub 기초19_1(Reg As Object, rngX As Range)

    Dim Mat As Object
    Dim i&, str$
    
    Set rngX = [c15]
    
    Do Until IsEmpty(rngX)
    
        For i = 1 To 5
        
            With Reg
                            
               '= 패턴설명 : ,? 콤마가 없거나 하나 / .? 아무 문자나 없거나 하나
               '= 패턴설명 : (   엑사남\(.+?\)   ) 1그룹 / 엑사남(숫자)
               '= 패턴설명 : ( ) 은 그룹을 뜻하고 \( \d+ \) 은 (숫자) 를 뜻한다. 특수문자는 \ 과 함께 사용
               
                .Pattern = "\,?.?(" & Cells(14, 3 + i) & "\(.+?\))"
                .Global = True
                
                If .test(rngX) Then
                
                    Set Mat = .Execute(rngX)
                
                    If Replace(Mat(0), ",", "") = Mat(0).submatches(0) Then
                    '= 매치값에 콤마가 있음 제거한 값과 서브매치한값이 같으면
                    '= 예를 들면 ,엑사남(34) = 엑사남(34) / 엑사남(34) < > 큰엑사남(34)
                    
                       str = Split(Mat(0).submatches(0), "(")(1)
                       Cells(rngX.Row, 3 + i) = Split(str, ")")(0)
                    '= 괄호를 제거한 후 숫자만 출력
                       
                    End If
                End If
                
            End With
        Next i
        
        Set rngX = rngX.Offset(1)
    Loop

End Sub

 

 

 

 

기초방#19.xlsm
0.02MB

 

댓글