「excel vba characters.text を取得できるautoshapetype」
という検索で、このサイト・インストラクターのネタ帳へのアクセスがありました。
Shape内の文字列を扱うExcel VBA(Visual Basic for Applications)のコードを書いている方による検索です。
Charactersオブジェクトで文字列を取得するサンプルマクロ
Shape内の文字列を扱うExcelマクロを作ったことのない方には、
「excel vba characters.text を取得できるautoshapetype」
という検索をなさった方が、何を求めていたのか理解し辛いでしょうから、エラーの発生するマクロからご紹介します。
例えば、文字列の入力されているテキストボックスがワークシート上に存在する状態で以下のマクロを実行すると、テキストボックス内の文字列がメッセージボックスに表示されます。
Dim shp As Shape
For Each shp In ActiveSheet.Shapes
MsgBox shp.TextFrame.Characters.Text
Next shp
ところが、図形の一種である[直線]などが存在している状態で、
上記のマクロを実行すると、
「実行時エラー'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 shp
Office 2007から使えるようになっているTextFrame2オブジェクトのHasTextプロパティを使うと、
Shape内に文字列が存在するかどうかを判定することができるのです。
TextFrame2.HasTextプロパティは、TextFrame.Charactersメソッドと違って、テキストを設定できない図形を表すShapeオブジェクトでも呼ぶことができるのです。
2003以前のExcelでも同じマクロを使いたいのであればTextFrame2オブジェクトは使えませんけれど、2007以降ならばCharactersオブジェクトよりも、
便利なTextFrame2オブジェクトのほうが、
おすすめです。
Home » エクセルマクロ・Excel VBAの使い方 » Shapeオブジェクト » Shape内に文字列が存在するかどうかを判定する-TextFrame2.HasText
- Newer:頭を整理しながら迷子にならずついていけた
- Older:検索した隣のセルを取得するExcelマクロ
TrackBack:0
- TrackBack URL