段落の末尾に文字列を追加する(Word)


段落の末尾に文字列を追加する(Word)

単なる個人的な覚え書き。

段落の末尾に文字列を追加するぐらい、簡単にできると思っていたが、意外に苦戦したので、記録として残しておく。

手っ取り早く結論だけ知りたい方はコチラ以降をどうぞ。

f:id:akashi_keirin:20210905110949p:plain

このようなドキュメント(笑)の最初の段落の末尾に文字列を挿入することを考える。

【失敗】[Paragraph].Range.InsertAfterメソッドを使う

対象の段落のParagraphオブジェクトを取得し、そのRangeプロパティが返すRangeオブジェクトのInsertAfterメソッドを使えばよいと考えた。

イミディエイトに次のコードを書く。

ActiveDocument.Paragraphs(1).Range.InsertAfter("ち~んw")

f:id:akashi_keirin:20210905110951p:plain

こいつを実行すると……。

f:id:akashi_keirin:20210905110954p:plain

あえなく失敗。まさに、「ち~んw」である。

【失敗】[Paragraph].Range.InsertBeforeメソッドを使う

では、〝2段落の前に挿入する〟と考えてはどうか。

イミディエイトに次のコードを書く。

ActiveDocument.Paragraphs(2).Range.InsertBefore("ち~んw")

f:id:akashi_keirin:20210905110957p:plain

対象の段落の次の段落のParagraphオブジェクトを取得し、そのRangeプロパティが返すRangeオブジェクトのInsertBeforeメソッドを使えばよいと考えたのである。

結果は……。

f:id:akashi_keirin:20210905111000p:plain

ち~ん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メソッドを使っている。

f:id:akashi_keirin:20210905111003p:plain

やっとできた。

【成功】段落末尾の位置を取得して[Range].InsertAfterメソッドを使う②

しかし、先のやり方は、あまりにもぶさいくである。

よく考えたら、[Paragraph].RangeRangeオブジェクトが取れる、ということは、その開始位置と終了位置が取れる、ということだ。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

うん。この方がスマートだね。

実行すると、

f:id:akashi_keirin:20210905111114p:plain

ほれ、このとおり。挿入語の文字列が無駄に選択状態にならないから、この方がやっぱりいいね。

おわりに

WordのVBAは、地味~な罠が至るところにあるので、ほんとに面白い。

まさに、〝男坂〟……。

f:id:akashi_keirin:20210905111615p:plain