スポンサーリンク

【PowerPoint VBA入門】図形に含まれる文字列取得についてわかりやすく説明します!2

VBAでの操作

こんにちは、blueです。

前回はPowerPoint VBAでの階層構造とShapeまでの取得について説明しました。

前回の記事はこちら

今回はShape以降の表、グラフ、スマートアートからの文字列の取得を行います。

前回は「文字列枠を含む」図形の判別としてHasTextFrameプロパティを用いましたが、今回も同様にHas〇〇〇プロパティを使って取得していくことになります。

ただ以降の処理は少し複雑ですが図や絵を使ってわかりやすく説明していきます。

ちなみに今回の記事は以下の書籍を参考にしています。

各種オブジェクトに対する説明がとても丁寧で、この書籍を1冊読めばPowerPointでVBAの操作ができるようになると思います。ぜひご参考ください。

スポンサーリンク

表を含む図形を取得する方法

まずは表になります。

今回は以下の表から中の文字列を取得することを考えます。

クリックすると拡大します

これは以下のコードで取得することができます。

shape.HasTable

なお内部の構造をオブジェクトブラウザで見ると以下のようにRowとColumnの構造になっています。

クリックすると拡大します

セルの情報はRowsとColumns両方を用いて取得することも可能です。

ただ単純にすべてのセルを取得したい場合はどちらかを使って内部のセル情報を取得すればよいことになります。

絵にすると以下のようになります。

クリックすると拡大します

以下は表の中のテキストも含めて取得して文字列を出力するコードです。

Sub TextAcquisition_Table()

    Dim sld As Slide
    Dim prs As Presentation
    Dim shp As Shape
    Dim clm As Column
    Dim cl As Cell
    
    Set prs = ActivePresentation

    For Each sld In prs.Slides
        sld.Select
        For Each shp In sld.Shapes
        
            '文字列枠を含む場合の処理
            If shp.HasTextFrame Then
                Debug.Print "文字列あり " & shp.TextFrame.TextRange.Text
                
            '表を含む場合の処理
            ElseIf shp.HasTable Then
                For Each clm In shp.Table.Columns
                    For Each cl In clm.Cells
                        Debug.Print "表 " & cl.Shape.TextFrame.TextRange.Text
                    Next
                Next
            End If
        Next
    Next
    
End Sub

なお前回から追加しているのは以下の部分になります。

ElseIf shp.HasTable Then
 For Each clm In shp.Table.Columns
  For Each cl In clm.Cells
   Debug.Print “表 ” & cl.Shape.TextFrame.TextRange.Text
  Next
 Next

Tableオブジェクトを取得した後はご自身で中身を追っていった方が理解が深まると思います。

グラフを含む図形を取得する方法

次はグラフになります。

今回は以下のようなExcelのシートが埋め込まれたグラフから文字列を取得する方法について考えます。

クリックすると拡大します

これは以下のコードで取得することができます。

shape.HasChart

ちなみにタイトルはTitleプロパティで取得できますが、他の情報はChartDataプロパティから取得することになります。

Chartオブジェクト以降の階層構造は以下のようになっています。

クリックすると拡大します

Workbookが存在しますね。

これは文字の通りExcelのWorkbookオブジェクトであり、Excel VBAでの操作が可能です。

なおPowerPoint VBAのみではオブジェクトが取得できないので参照設定でExcel VBAのライブラリをあらかじめ取得しておいてください。

以下はグラフの中のテキストも含めて取得して文字列を出力するコードです。

Sub TextAcquisition_Chart()

    Dim sld As Slide
    Dim prs As Presentation
    Dim shp As Shape
    Dim clm As Column
    Dim cl As Cell
    Dim rng As Range
    
    Set prs = ActivePresentation

    For Each sld In prs.Slides
        For Each shp In sld.Shapes
        
            '文字列枠を含む場合の処理
            If shp.HasTextFrame Then
                Debug.Print "文字列あり " & shp.TextFrame.TextRange.Text
                
            '表を含む場合の処理
            ElseIf shp.HasTable Then
                For Each clm In shp.Table.Columns
                    For Each cl In clm.Cells
                        Debug.Print "表 " & cl.Shape.TextFrame.TextRange.Text
                    Next
                Next
                
            'グラフを含む場合の処理
            ElseIf shp.HasChart Then
                If shp.Chart.HasTitle Then
                    Debug.Print shp.Chart.Title
                    For Each rng In shp.Chart.ChartData. _
                    Workbook.Worksheets(1).Range("A1").CurrentRegion
                        Debug.Print rng.Value
                    Next
                End If
            End If
        Next
    Next
    
End Sub

なお前回から追加しているのは以下の部分になります。

ElseIf shp.HasChart Then
 If shp.Chart.HasTitle Then
  Debug.Print shp.Chart.Title
  For Each rng In shp.Chart.ChartData. _
  Workbook.Worksheets(1).Range(“A1”).CurrentRegion
   Debug.Print rng.Value
  Next
 End If

中身の表はCurrentRegionで取得し、Rangeオブジェクト一つ一つに対して繰り返し処理を行っています。

スマートアートを含む図形を取得する方法

最後はスマートアートになります。

今回は以下のようなスマートアートから中の文字列を取得することを考えます。

クリックすると拡大します

スマートアートは以下のコードで取得することができます。

shape.HasSmartArt

なお内部構造は以下のようになっています。

クリックすると拡大します

かなりわかりにくいですね。

絵にすると以下のようになります。

クリックすると拡大します

SmartArtオブジェクト以降はNodesオブジェクトの階層構造となっています。

またSmartArtごとで階層構造が異なっています。その為取り扱われる際はオブジェクトブラウザで都度確認されることをお勧めします。

以下はスマートアートの中のテキストも含めて取得して文字列を出力するコードです。

Sub TextAcquisition_SmartArt()

    Dim sld As Slide
    Dim prs As Presentation
    Dim shp As Shape
    Dim clm As Column
    Dim cl As Cell
    Dim nd As SmartArtNode
    Dim nd2 As SmartArtNode
    
    Set prs = ActivePresentation

    For Each sld In prs.Slides
        sld.Select
        For Each shp In sld.Shapes
        
            '文字列枠を含む場合の処理
            If shp.HasTextFrame Then
                Debug.Print "文字列あり " & shp.TextFrame.TextRange.Text
                
            '表を含む場合の処理
            ElseIf shp.HasTable Then
                For Each clm In shp.Table.Columns
                    For Each cl In clm.Cells
                        Debug.Print "表 " & cl.Shape.TextFrame.TextRange.Text
                    Next
                Next
                
            'グラフを含む場合の処理
            ElseIf shp.HasChart Then
                If shp.Chart.HasTitle Then
                    Debug.Print shp.Chart.Title
                    For Each rng In shp.Chart.ChartData. _
                    Workbook.Worksheets(1).Range("A1").CurrentRegion
                        Debug.Print rng.Value
                    Next
                End If
                
            'スマートアートを含む場合の処理
            ElseIf shp.HasSmartArt Then
                For Each nd In shp.SmartArt.Nodes
                    Debug.Print nd.TextFrame2.TextRange.Text
                    For Each nd2 In nd.Nodes
                        Debug.Print nd2.TextFrame2.TextRange.Text
                    Next
                Next
            End If
        Next
    Next
    
End Sub

なお今回の追加コードは以下になります。

ElseIf shp.HasSmartArt Then
 For Each nd In shp.SmartArt.Nodes
  Debug.Print nd.TextFrame2.TextRange.Text
  For Each nd2 In nd.Nodes
   Debug.Print nd2.TextFrame2.TextRange.Text
  Next
 Next

これらを通してスマートアートから文字列を取得することができます。

今回のまとめ

今回の記事では

  • PowerPoint内の表、グラフ、スマートアートを含む図形からテキストを取得する

ところを勉強しました。

かなりコードは長くなっていますが基本はHas〇〇〇プロパティを使うというところを理解していただければ問題ないです。

今回まででPowerPoint VBAにおける各種図形からの文字列取得方法を勉強しました。

かなり項目は多かったですが各種オブジェクトを取得することができればあとはメソッドやプロパティを用いて色々な操作ができるようになります。

今回の勉強を通して少しでもPowerPoint VBAに慣れていただければ幸いです。


今回の記事は以下の書籍を参考にしています。

各種オブジェクトに対する説明がとても丁寧で、この書籍を1冊読めばPowerPointでVBAの操作ができるようになると思います。ぜひご参考ください。


コメント

タイトルとURLをコピーしました