スポンサーリンク

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

VBAでの操作

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

コメント

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