이번 문제는 각각의 셀안에 모든값이 Bold 처리 되었거나, 일부만 Bold 처리 되었을 때, 이를 모두 Bold처리하고 노란색 음영을 주는 29번 문제와 영역의 모든 값을 병합한 후 29에서 처리한 Bold 영역에 빨간색과 Bold 처리하는 문제이다.
셀의 폰트 컬러가 아닌 셀안에 특정 단어의 컬러에 변화를 주려면 Characters구문을 알아야 한다.
전에 비슷한 문제를 낸 적이 있다.
https://1stminokingdom.tistory.com/56
이때는 기초방 문제가 아니었기 때문에 정규식과 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에 관한 문제였다.
오늘도 맛있는 코드 냠냠
'VBA > 엑사남_기초방' 카테고리의 다른 글
[기초방] VBA 100제 #30_1 [ 폰트처리하기_2(정규식) ] (0) | 2023.02.08 |
---|---|
[기초방] VBA 100제 #30 [ 폰트처리하기_2 ] (0) | 2023.02.07 |
[기초방] VBA 100제 #28 [ 그룹 통합하기 ] (0) | 2023.02.05 |
[기초방] VBA 100제 #27 [ 미납자 확인 ] (2) | 2023.02.05 |
[기초방] VBA 100제 #26_1 [ 그룹별 목차 만들기 ] (0) | 2023.02.05 |
댓글