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

[기초방] VBA 100제 #29 [ 폰트처리하기 ]

by 일등미노왕국 2023. 2. 7.

이번 문제는 각각의 셀안에 모든값이 Bold 처리 되었거나, 일부만 Bold 처리 되었을 때, 이를 모두 Bold처리하고 노란색 음영을 주는 29번 문제와 영역의 모든 값을 병합한 후 29에서 처리한 Bold 영역에 빨간색과 Bold 처리하는 문제이다.

 

셀의 폰트 컬러가 아닌 셀안에 특정 단어의 컬러에 변화를 주려면 Characters구문을 알아야 한다.

전에 비슷한 문제를 낸 적이 있다.

https://1stminokingdom.tistory.com/56

 

[VBA] 글자색 바꾸기(feat. Instr/Characters)

오늘 해볼건 이런것이다. 색상 을 변경할 단어를 Inputbox로 입력받은 후 입력받은 단어를 색상은 빨강색 / Bold는 True하는 작업이다. 이 역시 막상 해보려면 좀 난감하기에 코드를 한번 쏴악 훝어보

1stminokingdom.tistory.com

이때는 기초방 문제가 아니었기 때문에 정규식과 instr, Characters가 사용되었지만, 오늘은 기초방 문제이기 때문에 최대한 Characters에 집중하여 풀어보도록 하자

 

If IsNull(rngA.Font.Bold) Or rngA.Font.Bold Then      
                                     
   rngA.Font.Bold = True: rngA.Interior.ColorIndex = 6  

End If

 

자 조건에서 IsNull 이 사용되었다. / 뒤에 사용된 rngA.font.bold = true then 으로 무슨 의미인지 알것 같아 넘어가기로 하고 참고로 [ rngA.font.bold = true then 는 rngA.font.bold then ] 으로 변경 사용 가능하다.

 

문제에서 [엑사남] 과 [환영] [합니다]를 비교해보자

 

[엑사남]은 range("b9") 으로 일부만 Bold 처리이다.

[환영] 은 range("e9') 으로 전체 Bold 처리이다.

[합니다] 는 range("f9")으로 Bold = False 이다.

 

각각의 셀을 선택 후 직접실행창에 찍어보면 부분  Bold 값은  Null을 반환하는것을 알 수 있다.

그래서 [ Isnull ] 이 사용된 것이다.

 

다음은 조합구문이다.

If rngA.Column = 2 And Str <> "" Then    
   Str = Str & Chr(10) & rngA    

Else: Str = IIf(Str = "", rngA, Str & " " & rngA)

End If

복잡한거 같지만 두번째행의 첫 열은 줄바꿈을 해야 하기에 개행문자인 Chr(10)을 조합한거구 그렇지 않을 경우에는 띄어쓰기로 각 셀을 조합하는데 첫 조합은 값이 비어있기에 값의 존재유뮤를 파악해서 조합을 하는 구문이다.

 

 

여기 저기서 곡소리가 났지만 역시 준빠님이 난이도를 생각해서 먼저 코드를 올려주셨다.

 

 

오늘의 핵심 구문이다.

 

앞서 조합한 Str을 rngX 영역에 출력한 후, 다시한번 전체 영역을 순환을 하면서  instr을 통해서 rngA의 위치를 파악하여 strLen에 담아준다.

그런 후 rngA가 만약 29번 풀이과정에서 Bold처리 되었다면 rngX영역에서 Characters를 사용할건데 그 위치값은 strlen이고 변경될 영역의 크기는 len(rngA) 이며, 이를 구문으로 써보면  [ rngX.Characters(strLen, Len(rngA)) ] 이다.

 

rngX = Str                                                
    
    For Each rngA In rngAll                               
    
        strLen = InStr(1, rngX, rngA, 1)                  
        If rngA.Font.Bold Then                            
        
            Haja_Delay rngA                               
            With rngX.Characters(strLen, Len(rngA))             
                .Font.Bold = True: .Font.Color = vbRed
                
            End With
            
        End If
    
    Next rngA

늘 말하지만 기초방 문제는 어떤 대단한 로직보다는 함수또는 코드를 설명하고자 하는 것이 더 크다.

그러기에 구글링을 하거나 조금만 공부를 하면 바로 적용이 가능한 문제들로 내고 있다.

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

    Dim rngAll As Range: Set rngAll = [b9:g13]                  '= 전체영역
    Dim rngA As Range
    Dim rngX As Range: Set rngX = [i9]
    Dim Str$, strLen&
    
    Haja_format                                                 '= 초기세팅
    
    For Each rngA In rngAll
        
        If IsNull(rngA.Font.Bold) Or rngA.Font.Bold Then        '= bold 가 1개 이상이거나 전체이면
         
           Haja_Delay rngA                                      '= 효과처리
           rngA.Font.Bold = True: rngA.Interior.ColorIndex = 6  '= 볼드처리와 음영처리해라
           
        End If
    
        If rngA.Column = 2 And Str <> "" Then                   '= 첫번째행 첫열이 아니면 / 두번째 행부터 첫 열이면
        
           Str = Str & Chr(10) & rngA                           '= 조합문자에 줄바꿈 개행한후 첫열의 문자를 조합
           
        Else: Str = IIf(Str = "", rngA, Str & " " & rngA)       '= 그렇지 않으면 Str이 비어있으면 rngA / 그렇지 않으면 띄어쓰기 조합
        
        End If
        
    Next rngA                                                   '= 기초방 29해법
    
    rngX = Str                                                  '= 29에서 조합된 내용을 rngX에 출력해라
    
    For Each rngA In rngAll                                     '= 기초방 29_1해법
    
        
        strLen = InStr(1, rngX, rngA, 1)                        '= rngX의 처음부터 rngA를 일치하는 값으로 정확히 일치 하는 값을 찾아라
        If rngA.Font.Bold Then                                  '= 29에서 처리한 rngA가 Bold이면
        
            Haja_Delay rngA                                     '= 효과처리
            With rngX.Characters(strLen, Len(rngA))             '= rngX에 문제의 효과를 적용해라
                .Font.Bold = True: .Font.Color = vbRed
                
            End With
            
        End If
    
    Next rngA
    
    MsgBox "출력완료"
End Sub

핵심 Key였던  Characters에 관한 문제였다.

오늘도 맛있는 코드 냠냠

기초방29.xlsm
0.02MB

댓글