こんにちは、blueです。
前回はPowerPoint VBAの階層構造とShapeまでの取得について説明しました。
前回の記事はこちら

今回はShape以降の図形内の「文字列」の取得を行います。
前回の記事でShapeはExcelのRangeに近いと書きましたが、中の構造は全く異なっています。
Rangeの中の構造は同じですが、Shapeに関しては内部の構造はそれぞれ異なっており、簡単にテキストのみを取得することはできません。
その為今回は各種図形の説明と「文字列枠を持つ図形」からのテキストの取得について説明します。
ちなみに今回の記事は以下の書籍を参考にしています。
各種オブジェクトに対する説明がとても丁寧で、この書籍を1冊読めばPowerPointでVBAの操作ができるようになると思います。ぜひご参考ください。
Shape以降の内部構造は複雑
前回以下の図形を取得しました。


これらは主に挿入のタブから取得しています。

ただこれらShapeごとの構造はバラバラです。
例えば、直線や曲線などの図形は文字を入力できませんが、四角形や円には文字を入力できます。
またグラフや表は図形の中にさらにテキストや図形を持つなど複雑な構造になっています。
このようにShapeまでは普通に取得できてもそれ以降の処理は個別に考慮しないといけないことになります。
これがExcelのRangeオブジェクトと異なる点であり、難しい所となっています。
文字列を持つShape
では今回の主旨である文字列を持つ図形というのはどういったものがあるでしょうか?
代表的なものとして以下4つがあります。
- 「文字列枠」を持った図形
- 表
- グラフ
- スマートアート
次から詳しく説明します。
「文字列枠」を持った図形
「文字列枠」を持った図形には以下のようなものがあります。

具体的には右クリックをして「テキストの編集」が出てくるものになります。

ちなみに以下直線などには「テキストの編集」は存在しません。

このように同じ図形でも文字列枠を含むものと含まないものが存在しています。
表
ここでいう表とはパワーポイントの挿入タブから作成したものになります。

なお、他のものから画像として貼り付けたものはもちろん表としては判別されません。
ちなみに表については先ほどの右クリックでは「テキストの編集」はでてきません。表の内部構造になります。
グラフ
ここでいうグラフもパワーポイントの挿入タブから作成したものになります。またExcelから直接貼り付けたものも該当します。

こちらも右クリックでは「テキストの編集」はでてきません。グラフの内部構造になります。
スマートアート
スマートアートもパワーポイントの挿入タブから作成したものになります。

こちらも右クリックでは「テキストの編集」はでてきません。スマートアートの内部構造になります。
特定のShapeのみを取得する方法
ではこれらのShapeはどうやって個別に取得できるでしょうか?
それにはHas〇〇〇プロパティを用います。
Shapeには図形の種類を判別するHas〇〇〇プロパティが存在します。
具体的には以下のものがあります。
プロパティ | 内容 |
HasTable | テーブルを含むか |
HasChart | グラフを含むか |
HasSmartArt | スマートアートを含むか |
HasTextFrame | 文字列枠を含むか |
含む場合はmsoTrue,含まない場合はmsoFalseを返すことから、これを使って特定のShapeのみを取得することができます。
(ちなみにmsoTrue≒True, msoFalse≒Falseと考えてもらっても問題ありません)
具体的には以下のように使います。
If Shape.Has〇〇〇 Then
持つ場合の処理
End If
絵にすると以下のようになります。

このようにしてHas〇〇〇プロパティを用いてShapeを処理してあげれば目的の図形を取得することができます。
文字列枠を含むもののみを取得する方法
先ほども説明したように文字列枠を含むものは右クリックで「テキストの編集」があるものでした。
これは以下のコードを使って取得することができます。
shape.HasTextFrame
なお内部のテキストは文字列枠内の文字列範囲を表すTextRangeオブジェクトで取得し、Textプロパティで取得することができます。
以下は文字列枠を含むものはテキストを、含まないものはShapeの名前をイミディエイトウィンドウに表示させるコードです。
Sub TextAcquisition_TextFrame()
Dim sld As Slide
Dim prs As Presentation
Dim shp As Shape
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
Else
Debug.Print "文字列なし " & shp.Name
End If
Next
Next
End Sub
なお前回から追加しているのは以下の部分になります。
If shp.HasTextFrame Then
Debug.Print “文字列あり ” & shp.TextFrame.TextRange.Text
Else
Debug.Print “文字列なし ” & shp.Name
End If
文字列枠まで取得すればTextRange.Textで取得できるようになります。
今回のまとめ
今回の記事では
- PowerPointの各種図形の構造を理解する
- PowerPoint内の文字列枠を含む図形からテキストを取得する
ところまでを勉強しました。
PowerPointでの目的の図形を取得するにはHas〇〇〇プロパティを使う必要があります。
今回はまず「文字列枠を持った図形」を理解していただいたので次回で残りの表、グラフ、スマートアートについて説明します。
ちなみに今回の記事は以下の書籍を参考にしています。
各種オブジェクトに対する説明がとても丁寧で、この書籍を1冊読めばPowerPointでVBAの操作ができるようになると思います。ぜひご参考ください。
コメント