こんにちは、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の操作ができるようになると思います。ぜひご参考ください。
コメント