728x90
작성된 시트에서 셀내 글자색을 지정하여 사용한 경우
일부 글자색을 다른 글자색으로 일괄 변경하는 매크로입니다.
Cell.Characters(i, j).Font.Color를 이용해서 하는 작업인데,
사용중 알 수 없는 오류가 발생하는 경우가 있습니다.
Sub FontColorChange1()
Dim C As Range, iCnt As Long, i As Long
Dim Color1 As Long, Color2 As Long, Color3 As Long, Color4 As Long, Color5 As Long, Color6 As Long, Color7 As Long, Color8 As Long, Color9 As Long, Color10 As Long, Color11 As Long, Color12 As Long
Color1 = RGB(0, 176, 80): Color2 = RGB(204, 204, 0) '// 녹색 → 황색 변경
'// 여러색일 경우 여기에 변경전/후 쌍을 추가
Application.ScreenUpdating = False
Application.EnableEvents = False
For Each C In Selection 'ActiveSheet.UsedRange.Cells
On Error Resume Next
iCnt = 0
iCnt = C.Characters.Count
If iCnt > 0 Then
For i = 1 To Len(C.Value2)
Select Case C.Characters(i, 1).Font.Color
Case Color1: C.Characters(i, 1).Font.Color = Color2
'// 여러색일 경우 여기에 Case 추가
Case Else
End Select
Next
End If
Next C
Application.ScreenUpdating = True
Application.EnableEvents = True
MsgBox "완료되었습니다."
End Sub
매크로 사용할 때 이상한 현상이 나온 것입니다.
발생하는 부위가 일정하지도 않고, 작업이 이루어지지 않은 부분이 변경되어 버리는 이상한 현상입니다.
글자 하나하나 처리하는 것이 Excel에서 자연스럽게 처리되지 않아서 그런 듯 한데...
Excel의 파일 구성을 보면 텍스트가 글자색 단위로 끊어서 저장되어 있습니다.
그래서 혹시나 하고,,, 글자색 단위로 처리하도록 매크로를 수정합니다.
이렇게 적용했더니 더이상 이상한 오류가 발생하지 않았습니다.
Sub FontColorChange2()
Dim C As Range, iCnt As Long, iLR As Long, iLC As Long, i As Long, iPos As Long, iLen As Long
Dim Color1 As Long, Color2 As Long, Color3 As Long, Color4 As Long, Color5 As Long, Color6 As Long, Color7 As Long, Color8 As Long, Color9 As Long, Color10 As Long, Color11 As Long, Color12 As Long
Color1 = RGB(0, 176, 80): Color2 = RGB(204, 204, 0) '// 녹색 → 황색 변경
Application.ScreenUpdating = False
Application.EnableEvents = False
On Error Resume Next
For Each C In Selection 'ActiveSheet.UsedRange.Cells
iCnt = 0
iCnt = C.Characters.Count
If iCnt > 0 Then
'// 아래를 변경하려는 Color 별로 호출
CharacterFontColorChange C, Color1, Color2
End If
Next C
Application.ScreenUpdating = True
Application.EnableEvents = True
MsgBox "완료되었습니다."
End Sub
Sub CharacterFontColorChange(C As Range, FromC As Long, ToC As Long)
Dim iCnt As Long, iPos As Long, iLen As Long, i As Long
With C
iCnt = 0
iCnt = .Characters.Count
If iCnt > 0 Then
iPos = 0: iLen = 0: i = 0
Do While True
i = i + 1
If i > iCnt Then Exit Do
If .Characters(i, 1).Font.Color = FromC Then
If iPos = 0 Then iPos = i: iLen = iLen + 1 Else iLen = iLen + 1
Else
If iPos > 0 Then .Characters(iPos, iLen).Font.Color = ToC: iPos = 0: iLen = 0
End If
Loop
End If
End With
End Sub
728x90
'Excel - VBA' 카테고리의 다른 글
문제은행 (ExamBank)으로 시험준비 하기 (2) | 2023.11.24 |
---|---|
[VBA] RTF(Rich Text Format) 을 Plain Text로 변경 (0) | 2023.11.02 |
Selenium TakeScreenshot.Copy와 TakeScreenshot.SaveAs (0) | 2023.09.11 |
[VBA] Compound class names not permitted (0) | 2023.09.09 |
WorkBook과 Worksheet 보호를 암호 없이 해제하기 (0) | 2023.08.28 |