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

[기초방] VBA 100제 #37 [ Characters ]

by 일등미노왕국 2023. 3. 6.

37번 문제인데 38번으로 표기해서 크루인 [시훈아빠]님한테 혼이났다..

37번으로 알고 가시길...

 

이문제는  Characters의 매소드중 Insert를 알고 모르고의 차이가 크다..

이걸 Replace로 하게 되면 코드가 많이 지저분해질것이다.

 

Characters 매소드에 대해선 Characters의 고찰편에서 자세하게 다뤄보도록 하겠다.

 

With Reg                                                  
    .Pattern = "[^\s]+"
    .Global = True
End With

해당 정규식 패턴은 [ 띄어쓰기가 아닌 모든 문자 ] 라는 의미이다.

 

With rngA.Characters(idx, Len(Ma))
    If .Font.Color = vbRed Then
       .Insert ("[" & Ma & "]")                        
    End If
End With

이 구문은 핵심구문으로 정규식 패턴과 일치한 문자의 컬러가 빨강이면 양쪽에 대괄호를 삽입하라는 뜻으로 이걸 모르면 엄청 어려울수 있다. 이또한 이번 경험으로 다음에는 자연스럽게 Insert, Delete, Count가 나오길 바란다.

더보기
Option Explicit
Sub 기초방37()

    Dim rngAll As Range: Set rngAll = [c5:g8]
    Dim rngX As Range: Set rngX = [c11]
    Dim rngA As Range
    Dim bln As Boolean
    Dim Reg As Object: Set Reg = CreateObject("vbscript.regexp")
    Dim Mat As Object, Ma As Object
    Dim idx&: idx = 1
    Dim str$
    
    [i5:m14].Copy [c5]
    
    Do
        For Each rngA In IIf(bln = False, rngAll, rngX)
        
            If bln = False Then
                If rngA.Font.Color = vbRed Then rngA = "[" & rngA & "]"   '= 37번 문제 해법
            Else
            
                With Reg                                                   '= 37-1 문제 해법
                    .Pattern = "[^\s]+"
                    .Global = True
                End With
                
                Set Mat = Reg.Execute(rngA)
                
                For Each Ma In Mat
                
                    idx = InStr(idx, rngA, Ma, 1)
                    
                    With rngA.Characters(idx, Len(Ma))
                        If .Font.Color = vbRed Then
                           .Insert ("[" & Ma & "]")                        '= 필수구문
                        End If
                    End With
                
                Next Ma
            
            End If
        
        Next rngA
    
    If bln = True Then Exit Do
    bln = Not bln
    
    Loop
End Sub

기초방37.xlsm
0.02MB

댓글