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

특히 차트, 표, 스마트 아트, 그룹도형 내부의 텍스트도 해당색깔을 찾아서 바꾸도록 신경을 썼습니다.

샘플파일 첨부합니다.

텍스트색깔일괄변경.pptm
0.06MB