「excel vba TextFrame2.TextRange.Characters.text」
といった検索キーワードで時折アクセスがあります。
Excelで、テキストボックスや図形に文字列を入力する操作をマクロ記録すると、自動的に作られるコードについて調べていた方による検索でしょうか。
アクティブなワークシートに「TextBox 1」という名前のテキストボックスが存在するときに、そのテキストボックスを選択して「サンプル文字列」と入力する操作をマクロ記録すると、以下のようなコードが作られます。
ActiveSheet.Shapes.Range(Array("TextBox 1")).Select
Selection.ShapeRange(1).TextFrame2.TextRange.Characters.Text = "サンプル文字列"
「excel vba TextFrame2.TextRange.Characters.text」
と検索なさった方は、このコードの中の「.TextFrame2.TextRange.Characters.Text」について調べていたのだろうと、推測しています。
.TextFrame2.TextRange.Characters.Textを確認するサンプル
以下のSubプロシージャで「.TextFrame2.TextRange.Characters.Text」を確認しましょう。Dim sh As Worksheet
Set sh = ActiveSheet
sh.Shapes(1) _
.TextFrame2.TextRange.Characters.Text = "サンプル文字列"
End Sub
アクティブなワークシートにテキストボックスなど、文字列の入力可能なShapeが存在するときに、上記Subプロシージャを実行すれば、1個目のShapeに「サンプル文字列」と入力されます。
オブジェクトを返すプロパティと単なるデータを返すプロパティ
拙著『いちばんやさしいExcel VBAの教本』のLesson 52で、プロパティには、オブジェクトを取得するためのプロパティと、単なるデータを取得するためのプロパティの2種類があることをお伝えしています。
「.TextFrame2.TextRange.Characters.Text」に登場するTextFrame2・TextRange・Characters・Textはすべてプロパティで、最後のTextだけが単なるデータである文字列を取得するプロパティで、他のTextFrame2・TextRange・Charactersはいずれもオブジェクトを取得するプロパティです。
TextFrame2・TextRange・Charactersが、それぞれどのようなオブジェクトを返すのかを、イメージすることが必要です。
Shape.TextFrame2プロパティは文字列枠を表すTextFrame2オブジェクトを、TextFrame2.TextRange2プロパティは文字列範囲を表すTextRange2オブジェクトを、TextRange2.Charactersプロパティも文字列範囲を表すTextRange2オブジェクトを返します。
TextFrame2.TextRangeはTextRange2オブジェクトを返す
「.TextFrame2.TextRange.Characters.Text」の中で特に注意が必要なのは、「TextFrame2.TextRange」の部分です。
オブジェクトを取得するコードについて正しく理解できていないと、TextFrame2オブジェクトのTextRangeプロパティで、TextRangeオブジェクトを取得していると思ってしまいがちですが、そうではありません。TextFrame2オブジェクトのTextRangeプロパティが返すのはTextRange2オブジェクトです。
コードウィンドウの「TextRange」内にカーソルを置いて、[Ctrl]+[I]を押して表示されるヒントをご確認ください。
上図のとおりTextFrame2.TextRangeプロパティで定義されている戻り値が「As TextRange2」と表示されます。
TextFrame2.TextRangeプロパティの戻り値を、TextRange2オブジェクトと定義したMicrosoft PowerPoint開発チームの意図はわかりますけれど、私は、TextFrame2にTextRangeプロパティは定義せずに、TextRange2オブジェクトを返すTextRange2として定義しても、悪くはなかったのではないかという気がします。
.CharactersはなくてもOK
「.TextFrame2.TextRange.Characters.Text = "サンプル文字列"」のように、TextRange2オブジェクトのCharactersプロパティを使ったコードが、マクロ記録では作られてしまいますが、文字列全体を操作する場合ならば、実はCharactersプロパティは不要です。
TextRange2オブジェクトのCharactersプロパティもTextRange2オブジェクトを返すプロパティで、引数を指定しない場合は、TextFrame2.TextRange.Charactersの返すTextRange2とTextFrame2.TextRangの返すTextRange2は同じ文字列範囲を表すからです。
具体的には以下のようなCharactersプロパティを使わないコードでも、先のプロシージャと同じ挙動をします。Dim sh As Worksheet
Set sh = ActiveSheet
sh.Shapes(1) _
.TextFrame2.TextRange.Text = "サンプル文字列"
End Sub
マクロ記録ではShape内文字列を操作するコードを生成する部分を共通化しているために、Shape内の文字列全体を操作する場合も、文字列の一部を操作する場合でもCharactersプロパティを使ったコードが作られてしまうのだろうと、私は推測しています。
- Newer:Pythonのmax関数・min関数の引数keyが便利
- Older:python-pptxで図形の位置を変更する
Home » エクセルマクロ・Excel VBAの使い方 » 図形内文字列 » TextFrame2.TextRange.Characters.Textとは