「excel vba characters.text を取得できるautoshapetype」
という検索で、このサイト『インストラクターのネタ帳』へのアクセスがありました。
Shape内の文字列を扱うExcel VBAのコードを書いている方による検索です。
Characters.Textを取得できるShapeとは
Shape内の文字列を扱うExcelマクロを作ったことのない方には、
「excel vba characters.text を取得できるautoshapetype」
という検索をなさった方が、何を求めていたのか理解し辛いでしょうから、エラーの発生するマクロからご紹介します。
例えば、文字列の入力されているテキストボックスがワークシート上に存在する状態で以下のマクロを実行すると、テキストボックス内の文字列がメッセージボックスに表示されます。
Dim shp As Shape
For Each shp In ActiveSheet.Shapes
MsgBox shp.TextFrame.Characters.Text
Next
End Sub
ところが、図形の一種である[直線]などが存在している状態で、
上記のマクロを実行すると、
「実行時エラー'438': オブジェクトは、このプロパティまたはメソッドをサポートしていません。」
というエラーが発生してしまいます。
[直線]などの図形にはそもそもテキストを追加できませんから、TextFrameオブジェクトのCharactersメソッドを実行しようとするとエラーが発生してしまうのです。
「excel vba characters.text を取得できるautoshapetype」
という検索をなさった方は、このエラーを回避するためにShapeオブジェクトのAutoShapeTypeプロパティを使おうと考えたのではないかと、私は推測しています。
TextFrame2オブジェクトで文字列を取得するサンプルマクロ
2007以降のExcelならば、Charactersオブジェクトを使うよりも、TextFrame2オブジェクトを使うほうが便利です。
Office 2007からは、図形まわりがいろいろと変更になっていて、VBA側から見ると新しくTextFrame2オブジェクトが扱えるようになっています。
以下のマクロならば、先ほどエラーが発生した[直線]などの図形が存在していたとしても、実行時エラーは発生しません。
Dim shp As Shape
For Each shp In ActiveSheet.Shapes
If shp.TextFrame2.HasText Then
MsgBox shp.TextFrame2.TextRange.Text
End If
Next
End Sub
Office 2007から使えるようになっているTextFrame2オブジェクトのHasTextプロパティを使うと、
Shape内に文字列が存在するかどうかを判定することができるのです。
TextFrame2.HasTextプロパティは、TextFrame.Charactersメソッドと違って、テキストを設定できない図形を表すShapeオブジェクトでも呼ぶことができるのです。
2003以前のExcelでも同じマクロを使いたいのであればTextFrame2オブジェクトは使えませんけれど、2007以降ならばCharactersオブジェクトよりも、
便利なTextFrame2オブジェクトのほうが、
おすすめです。
- 『理解するExcel VBA/図形操作の基本』を出しました。
- 『図形操作の基本』で紹介している図形関連オブジェクトごとのメソッド一覧
- 『図形操作の基本』で紹介している図形関連オブジェクトごとのプロパティ一覧
最終更新日時:2021-12-17 07:09
- Newer:頭を整理しながら迷子にならずついていけた
- Older:検索した隣のセルを取得するExcelマクロ
Home » エクセルマクロ・Excel VBAの使い方 » 図形内文字列 » VBAでShape内に文字列が存在するかを判定する-TextFrame2.HasTextプロパティ