テキストボックスの先頭にカーソルを置く(Word)

テキストボックスの先頭にカーソルを置く

これ、みなさんどうやって実現しているのでしょう?

テキストボックス内の文字列を取得する

テキストボックスはShapeオブジェクトの一種。

んで、その配下にTextFrameオブジェクトがあり、そのTextRangeプロパティを参照すると、「指定されたレイアウト枠の中の文字列範囲を表すRangeオブジェクト」が取得できる、という次第。

従って、テキストボックス内の文字列は、

[Shape].TextFrame.TextRange.Text

で取得可能。

たとえば、Document上に

f:id:akashi_keirin:20191227075104j:plain

このようなテキストボックスがあるとき、イミディエイト・ウインドウに

?ActiveDocument.Shapes(1).TextFrame.TextRange.Text

と入力して[Enter]を押すと、

f:id:akashi_keirin:20191227075106j:plain

こんなふうに、テキストボックス内の文字列を取得することができる。

[Shape].TextFrame.TextRangeを選択する

では、テキストボックス内の文字列を選択するにはどうすればよいか。

[Shape].TextFrame.TextRangeプロパティの返り値はRangeオブジェクトなので、[Range].Selectメソッドを使えばよい。

試みに、イミディエイト・ウインドウに

ActiveDocument.Shapes(1).TextFrame.TextRange.Select

と入力して[Enter]を押す。

f:id:akashi_keirin:20191227075110j:plain

まっ たく 簡 単 だ

カーソルを先頭に置く

では、カーソルを先頭に持って行くにはどうすればよいのだろうか。

すでに、文字列部分が選択されている以上、私にはSelection.Collapseメソッドを用いる方法しか思い浮かばなかった。つまり、

Call Selction.Collapse(wdCollapseStart)

とするのである。

リスト1 標準モジュール
Private Sub test01()
  Call ActiveDocument.Shapes(1).TextFrame.TextRange.Select
  Call Selection.Collapse(wdCollapseStart)
End Sub

ActiveDocumentにはテキストボックスを一つ置いているだけなので、ActiveDocument.Shapes(1)とすれば、そのテキストボックスをShapeオブジェクトとして取得可能。

あとは、TextFrame.TextRangeプロパティを参照してRangeオブジェクトを取得し、そのSelectメソッドを用いてテキスト範囲を選択。

しかる後にSelection.Collapseメソッドの引数にwdCollapseStartを渡して選択範囲を先頭方向に向かって潰す。

リスト1を実行すると、

f:id:akashi_keirin:20191227075113j:plain

無事に先頭にカーソルを置くことができた。

おわりに

無事に目的は果たせたわけだが、なんかスマートじゃない気がする。

エレガントな方法があったら教えろ教えてください。

なお、なんでテキストボックスの先頭にカーソルを置きたかったのか。

それは、テキストボックスの文字列を狙って検索したかったからです。