コラム

ワードのカーソル位置の段落番号を取得する

公用文テンプレートにカーソル位置のインデントをVBAで調節する機能を追加しようとしたところ、見事にハマったので、そのてんまつを記録しておきたいと思います。

選択範囲の段落番号は直接取得できない

カーソルがある段落のインデントをVBAで調整するためには、まずカーソルがある段落を特定する必要があります。
ところが、ワードVBAには、選択範囲(カーソル位置を含む)の段落番号を取得するプロパティが準備されていません

段落番号を数えれば良い

ネットを検索すると次の記事が見つかりました。

すばらしい!
これで選択されている段落の番号を取得できるようになります。

段落の先頭にカーソルがある場合に問題が...

ところが、この方法には1つ問題がありました。
段落の先頭にカーソルがある場合には、(その段落の番号ではなくて)その直前の段落番号を返してしまうのです。
(段落の先頭以外にカーソルがある場合や範囲を選択している場合には問題が生じません。)

最初に気付いたのは、このように新しい段落を追加した場合、「2」を返して欲しいのですが、「1」が返されてしまうことでした。

新しい段落を追加した場合(段落番号は「1」になってしまう。)

良く調べると、そもそも段落の先頭にカーソルがある場合には、前の段落の番号を返してしまうことが分かりました。

入力済みの段落の先頭にカーソルを置いた場合(この場合も段落番号が「1」になってしまう。)

直前が改行の場合に補正を加えることで解決!

選択範囲(カーソル)の直前の文字を取得する方法は、次の記事に書かれているのを見つけることができました。

ありがとうございます!
これを使って、カーソルの直前が改行(vbCr)の場合に段落番号に補正を加えてやると、段落の先頭にカーソルがある場合も正しい段落番号を取得することができるようになりました。

'選択範囲の開始段落と終了段落の番号を取得する。
With Selection
    '開始段落を取得する
    iStart = ActiveDocument.Range(0, .Start).Paragraphs.Count
    
    '終了段落を取得する
    iEnd = ActiveDocument.Range(0, .End).Paragraphs.Count

    'ページ先頭の場合は処理を行わない
    If .Range.Start <> 0 Then
        '選択範囲の前が改行の場合に補正を加える
        If .Characters.First.Previous = vbCr Then
            If iStart = iEnd Then iEnd = iEnd + 1
            iStart = iStart + 1
        End If
    End If
End With

コメント

タイトルとURLをコピーしました