VBA로 텍스트를 일괄로 변경할 때 일반적인 도형 뿐만아니라
그룹도형 내부의 자식 도형들, 차트내의 차트제목, 계열제목, 데이터라벨, 스마트 아트 내부 텍스트, 테이블(표)의 텍스트 등 여러가지 상황을 고려해서 만들기 어렵습니다. 각 개체마다 텍스트에 접근하는 방식이 약간식 달라서 간단히 만들기 쉽지 않습니다.
여기서 여러가지 개체의 텍스트에 접근하는 예시를 보여주고자 합니다.
일단 테이블과 스마트아트, 그리고 차트개체에 집중해서 텍스트에 접근해보겠습니다. 특히 특정색깔의 텍스트를 다른색깔로 일괄 변경하는 작업을 예시로 들겠습니다.
아래와 같이 슬라이드가 있을 때 표 내부의 텍스트 색, 차트 내부의 텍스트색, 스마트 아트 내부의 텍스트 색에 접근합니다. TextFrame.TextRange 보다 TextFrame.TextRange.Characters 에 접근하여야 합니다.
매크로 실행이전에 먼저 이전 색깔과 바꿀 색깔을 지정해줍니다.
oldColor = RGB(255, 192, 0) 'rgbOrange '찾을 폰트 색깔
newColor = RGB(255, 50, 100) '새로운 색깔
색깔의 RGB값을 외우기는 힘들기 때문에 oldColor 는 원하는 텍스트를 드래그로 선택하고 실행하면 현재 선택된 텍스트 색상을 찾아 다른 색깔로 바꿔줍니다.
아래와 같은 VBA매크로를 이용해볼 수 있습니다.
(Alt-F11 누르고 삽입 >모듈 추가 후 아래 코드를 붙여넣기, oldColor 와 newColor를 수정.)
더보기
Option Explicit
Dim oldColor As Long, newColor As Long
Sub ChangeColor()
Dim sld As Slide
Dim shp As Shape
Dim tr As TextRange2
'바꿀 색깔 미리 지정
oldColor = RGB(255, 192, 0) 'rgbOrange '찾을 폰트 색깔
newColor = RGB(255, 50, 100) '새로운 색깔
On Error Resume Next
'현재 선택된 텍스트의 폰트색상으로 검색
Set tr = ActiveWindow.Selection.TextRange2
On Error GoTo 0
If Not tr Is Nothing Then
oldColor = ActiveWindow.Selection.TextRange2.Font.Fill.ForeColor.RGB
End If
'도형 순환
For Each sld In ActivePresentation.Slides
For Each shp In sld.Shapes
Call ChangeTextColor(shp)
Next shp
Next sld
End Sub
Function ChangeTextColor(oShp As Shape)
Dim shp As Shape
Dim run As TextRange2
Dim r%, c%
Dim node As SmartArtNode
Dim srs As Series, pt As Point, ax As Axis
'그룹 도형인 경우 내부 순환
If oShp.Type = msoGroup Then
For Each shp In oShp.GroupItems
Call ChangeTextColor(shp)
Next shp
'차트
ElseIf oShp.Type = msoChart Then
'oShp.Chart.ChartArea.Font.Color = newColor
'차트 제목
If oShp.Chart.HasTitle Then
For Each run In oShp.Chart.ChartTitle.Format.TextFrame2.TextRange.Runs
ChangeRunColor run
Next run
End If
'차트 범례
If oShp.Chart.HasLegend Then
For Each run In oShp.Chart.Legend.Format.TextFrame2.TextRange.Runs
ChangeRunColor run
Next run
End If
'차트 데이터 라벨
For r = 1 To oShp.Chart.SeriesCollection.Count
Set srs = oShp.Chart.SeriesCollection(r)
For c = 1 To srs.Points.Count
Set pt = srs.Points(c)
If pt.HasDataLabel Then
ChangeRunColor pt.DataLabel.Format.TextFrame2.TextRange
End If
Next c
Next r
'차트 축 제목
For r = 1 To oShp.Chart.Axes.Count
Set ax = oShp.Chart.Axes(r)
If ax.HasTitle Then
For Each run In ax.AxisTitle.Format.TextFrame2.TextRange.Runs
ChangeRunColor run
Next run
End If
Next r
'차트 축
For r = 1 To oShp.Chart.Axes.Count
Set ax = oShp.Chart.Axes(r)
If ax.TickLabels.Font.Color = oldColor Then _
ax.TickLabels.Font.Color = newColor
Next r
'스마트아트
ElseIf oShp.Type = msoSmartArt Then
For Each node In oShp.SmartArt.AllNodes
For Each run In node.TextFrame2.TextRange.Runs
ChangeRunColor run
Next run
Next node
'표
ElseIf oShp.Type = msoTable Then
For r = 1 To oShp.Table.Rows.Count
For c = 1 To oShp.Table.Columns.Count
For Each run In oShp.Table.Cell(r, c).Shape.TextFrame2.TextRange.Runs
ChangeRunColor run
Next run
Next c
Next r
'일반 도형
ElseIf oShp.Type = msoAutoShape Or oShp.Type = msoTextBox _
Or oShp.Type = msoPlaceholder Then
If oShp.HasTextFrame Then
If oShp.TextFrame.HasText Then
'텍스트 내부 조각 순환
For Each run In oShp.TextFrame2.TextRange.Runs
ChangeRunColor run
Next run
End If
End If
End If
End Function
Function ChangeRunColor(ByRef oRun As TextRange2)
If oRun.Font.Fill.ForeColor.RGB = oldColor Then
oRun.Font.Fill.ForeColor.RGB = newColor
End If
End Function
Private Sub test()
'바꿀 색깔 미리 지정
oldColor = RGB(255, 192, 0) 'rgbOrange '찾을 폰트 색깔
newColor = RGB(255, 50, 100) '새로운 색깔
ChangeTextColor ActiveWindow.Selection.ShapeRange(1)
End Sub
특히 차트, 표, 스마트 아트, 그룹도형 내부의 텍스트도 해당색깔을 찾아서 바꾸도록 신경을 썼습니다.
샘플파일 첨부합니다.
'PPT+VBA' 카테고리의 다른 글
VBA로 이동경로 애니메이션 추가 (0) | 2022.08.30 |
---|---|
연결된 차트의 시트변경시 연결 자동 복구 (0) | 2022.08.20 |
PPT의 표(테이블)를 엑셀시트에 일괄 복사 (0) | 2022.08.13 |
도형병합(교차)를 이용한 두 도형의 충돌체크 (0) | 2022.08.12 |
[Chart Merge] 차트 복제하여 엑셀 데이터 일괄 반영 (0) | 2022.08.06 |
텍스트박스를 일괄 도형으로 변환하기 (0) | 2022.07.10 |
[Web Viewer 추가기능]온라인 구글문서 PPT슬라이드에 띄우기 (1) | 2022.06.24 |
도형의 윤곽선은 안쪽 정렬도 가능 (1) | 2022.06.04 |
최근댓글