본문 바로가기
VBA

[VBA] Alt + Enter 셀 텍스트 색상 변경하기

by 일등미노왕국 2022. 4. 20.

이전에 이런 글을 올릴적이 있다

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

 

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

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

1stminokingdom.tistory.com

이건 해당 영역을 순환하면서 값을 찾은 후 글자수를 계산하여 해당 글자만큼 색상을 입혀주기만 하면 된다.

 

아무 생각할 필요도 없다고 건방을 떨었다...와...근데 하루 반나절이 걸렸다. 물론 일하는 짬짬이 해결했지만 시간 상으론 하루 반나절이 맞다...

 

이전 글에 올렸던 글자색 변경 문제는 새로운 행에 문장들이 있었기 때문에 순환문에서 새로운 행의 위치에 찾는 문자가 있니? 없니? 만 구분지은 후 문자내에 같은 단어가 있는지만 살피면 되는데.. 이문제는 그리 쉬운 문제가 아닌거 같다.

 

우선 각 문장을 결합하는 VBCrLf는 Chr(10) 과 Chr(13)으로 결합되어 우리눈에는 안보이지만 2바이트의 크기를 가진다.

 

해서 각 문장이 끝나고 다음 행으로 넘어갈때는 항상 +2바이트를 증가시켜야 한다.

 

문장내 공백까지 글자로 볼지 안볼지에 따라 아래 구문의 사용 여부가 가려지게 된다.

다잡님이 처음 개시한 숙제는 공백도 글자로 인식하는 과제였지만, 본인은 공백은 글자로 안 잡는 코드를 만들었다.

물론 코드가 전부 다르겠지만 숙제를 받아들이는 입장에서는 큰 틀에서 나만의 색깔을 내는 것도 나쁘지않다.

[d1] 셀에 체인지이벤트를 설정하여 값이 변경함에 따라 자동으로 구문이 돌아가도록 하였다.

 

Option Explicit

Sub Haja_Dajob()

    Dim rngX As Range                           '= 실제 결과값을 출력할 셀
    Dim vall: vall = [a1]                       '= 문제의 셀을 Vall 배열에 담아라
    Dim i&, j&, c&, N&, Num&                   '= N : 문장 내 추출문자안에 들어간 공백 수
    Dim Vtemp(100), Cnt&: Cnt = [d1]            '= Vtemp : 각문장의 첫 글자를 담을 임시 배열
    Dim F_index&: F_index = 1
    
    [b1].Clear: Set rngX = [b1]                 '= 영역 초기화
    
    vall = Split(vall, Chr(10))                 '= 배열을 Alt + Enter(chr(10))으로 분리
    
    Call Haja_merge(vall, Vtemp, rngX)          '= 출력할 영역을 만드는 구문

        For i = LBound(vall) To UBound(vall)    '= 배열의 크기만큼 / 문장의 크기만큼 순환
      
             If InStr(1, Left(vall(i), Cnt), Chr(32)) > 0 Then  '= 선택된 배열의 문장속에 chr(32)
                                                                '= 공백의 유무를 확인
                   For j = 1 To Len(vall(i))    '= 공백이 있다면 문장의 길이 만큼 순환해라
                  
                     If Mid(vall(i), j, 1) = " " Then  '= 선택된 문장 속에 공백이 있다면
                 
                        N = N + 1               '= N을 +1해라
                        
                     Else
                        c = c + 1               '= 공백이 없는 실제 문자만 카운팅
                        If c >= Cnt Then Exit For  '= C값이 선택한 수와 크거나 같다면 For문을 종료해라
                     End If
                        
                   Next j
                  
               Else                             '= 선택한 문장내에 공백이 없다면
                   
                   N = 0
            
               End If
               
             F_index = InStr(F_index, rngX, Vtemp(i)) + Cnt  '= 값을 찾을 첫 위치는 항상 문장의 처음 + 선택값
             
             If Len(vall(i)) - Cnt - N <= 0 Then GoTo haja   '= 선택한 문장이 선택한 길이보다 작거나 같으면 Goto Haja
                                                                    
             With rngX.Characters(F_index + N, Len(vall(i)) - Cnt - N)  '= 글자 색상을 변경할 영역 설정
                .Font.Color = vbRed
                .Font.Bold = True
             End With
haja:
             Num = Num + Len(vall(i))                        '= 다음을 위해 이전 길이들을 NUM에 누적해라
             F_index = Num + 2                               '= 다음 시작점은 이전 문장의 길이 + 유령문자(2바이트)
             N = 0: c = 0
        Next i

End Sub

Sub Haja_merge(vall, Vtemp, rngX As Range)
    Dim i&
    
    For i = LBound(vall) To UBound(vall)                    '= 배열 순환
    
        Vtemp(i) = Left(vall(i), 1)
        If rngX = "" Then                                   '= 값이 없으면
        
            rngX = vall(i)                                  '= 배열값 출력
            
        Else
            rngX = rngX & vbCrLf & vall(i)                  '= 값이 있다면 기존 값에 VbCrlf 를 결합하여 출력해라
            
        End If
        
    Next i

End Sub

구문들을 하나씩 뜯어보고 끊임없이 공부하고 그리고 발전하길 응원한다.

 

숙제.xlsm
0.02MB

댓글