段落の末尾に文字列を追加する(Word)
段落の末尾に文字列を追加する(Word)
単なる個人的な覚え書き。
段落の末尾に文字列を追加するぐらい、簡単にできると思っていたが、意外に苦戦したので、記録として残しておく。
手っ取り早く結論だけ知りたい方はコチラ以降をどうぞ。
このようなドキュメント(笑)の最初の段落の末尾に文字列を挿入することを考える。
【失敗】[Paragraph].Range.InsertAfterメソッドを使う
対象の段落のParagraph
オブジェクトを取得し、そのRange
プロパティが返すRange
オブジェクトのInsertAfter
メソッドを使えばよいと考えた。
イミディエイトに次のコードを書く。
ActiveDocument.Paragraphs(1).Range.InsertAfter("ち~んw")
こいつを実行すると……。
あえなく失敗。まさに、「ち~んw」である。
【失敗】[Paragraph].Range.InsertBeforeメソッドを使う
では、〝2段落の前に挿入する〟と考えてはどうか。
イミディエイトに次のコードを書く。
ActiveDocument.Paragraphs(2).Range.InsertBefore("ち~んw")
対象の段落の次の段落のParagraph
オブジェクトを取得し、そのRange
プロパティが返すRange
オブジェクトのInsertBefore
メソッドを使えばよいと考えたのである。
結果は……。
ち~んw
【成功】段落末尾の位置を取得して[Range].InsertAfterメソッドを使う①
[Paragraph].Range
プロパティが返すRange
オブジェクトというのは、末尾の改段落まで含んでいるらしい。(当たり前だ。)
ならば、末尾の改段落を含まない部分のRange
オブジェクトを取得すればいいじゃないか。そう考えた。
リスト1
Private Sub test01() Dim tgtDoc As Document Set tgtDoc = ActiveDocument Call tgtDoc.Paragraphs.Item(1).Range.Select '……(1)' Call Selection.MoveLeft(wdCharacter, 1, wdExtend) '……(2)' Call Selection.Range.Collapse(wdCollapseEnd) '……(3)' Call Selection.Range.InsertAfter("ち~んw") End Sub
我ながら、バカ丸出しのコードである。
(1)で第1段落のRange
オブジェクト全体を選択し、(2)で選択範囲を左に1文字分だけ縮めて、(3)で選択範囲の末尾に向けて選択範囲を潰す。
これで、第1段落の改段落マーク直前のところにカーソルが置かれるので、そのRange
オブジェクトのInsertAfter
メソッドを使っている。
やっとできた。
【成功】段落末尾の位置を取得して[Range].InsertAfterメソッドを使う②
しかし、先のやり方は、あまりにもぶさいくである。
よく考えたら、[Paragraph].Range
でRange
オブジェクトが取れる、ということは、その開始位置と終了位置が取れる、ということだ。Start
プロパティとEnd
プロパティで。
だったら、対象のDocument
オブジェクトのRange
メソッドで〝最後の改段落マークを含まないRange
オブジェクト〟を取得すれば良いだけのことである。
リスト2
Private Sub test02() Dim tgtDoc As Document Set tgtDoc = ActiveDocument Dim tgtRange As Range Set tgtRange = tgtDoc.Paragraphs.Item(1).Range Call tgtDoc.Range(tgtRange.Start, _ tgtRange.End - 1).InsertAfter("ち~んw") End Sub
うん。この方がスマートだね。
実行すると、
ほれ、このとおり。挿入語の文字列が無駄に選択状態にならないから、この方がやっぱりいいね。
おわりに
WordのVBAは、地味~な罠が至るところにあるので、ほんとに面白い。
まさに、〝男坂〟……。