翻訳の納品コメントを書いている時に、対応する段落番号を取得したいと感じました。
カーソルがある箇所の段落番号がわかるとなにかと便利で応用がきくと思います。
特許明細書の見出しは特定の書式で書かれているので、そのルールさえ分かれば比較的簡単に見出しを取得できます。
今回のコードはメッセージボックスに表示するだけなのであまり意味はないかも知れませんが、サンプルコードとしてご利用ください。
<目次>
このマクロでできること
カーソルがある箇所がどの段落番号や見出しに関連するのかを調べ、メッセージボックスで表示します。
例1 段落番号のある段落の場合
例2 見出しのある段落の場合
マクロの解説
段落から文字列を取り出す方法としてちょうどいい例だと思います。
和文特許明細書の場合、段落番号や見出しが隅付き括弧("【"と"】")で囲まれています。英文明細書の場合は半角の角括弧("["と"]")で囲まれています。
このように特許明細書の場合には比較的わかりやすいので見出しとなる文字列を探す方法を確立できます。
ほかのルールを適用する場合には処理方法を別に考える必要があります。
処理としては、カーソル位置の段落から始まり(13行目)、段落の先頭に特許段落番号が見つからない場合にはひとつずつ上の段落に向けて(29行目)処理をします。
段落先頭の段落番号の有無を判定するために、まずはMoveStartWhile メソッドにて段落先頭のタブやスペースを除外します(24行目)。
括弧の有無を確認します。このためにLike 演算子を使います(25行目)。
Like 演算子では正規表現のような記述ができます。選択範囲の一文字目(myParaRange.Characters.First.Text)が【または[ であるかを判定するために、[【^[] としています。
Wordのワイルドカードを使うと [【\[] という意味ですから記述が似ています。
見つけた場合には、閉じ括弧まで選択範囲を狭めれば段落番号や見出しを取得できます(26行目)。
3行目をコメントにして4行目のコメントを解除すれば、ステータスバーに段落番号を表示できるようになります。
マクロ
Sub 特許段落番号を表示するマクロ() MsgBox GetHeading(Selection.Range) ' Application.StatusBar = GetHeading(Selection.Range) End Sub Function GetHeading(myRange As Range) As String Dim myPara As Paragraph Dim myParaRange As Range Set myPara = myRange.Paragraphs(1) Do If myPara Is Nothing Then myParaRange.SetRange 0, 0 Exit Do End If Set myParaRange = myPara.Range myParaRange.MoveStartWhile Cset:=vbTab & Chr(32) & Chr(-32448) If myParaRange.Characters.First.Text Like "[【^[]" Then myParaRange.MoveEndUntil Cset:="】]", Count:=wdBackward Exit Do Else Set myPara = myPara.Previous End If Loop GetHeading = myParaRange.Text If GetHeading = "" Then GetHeading = "見つかりませんでした。" End If Set myPara = Nothing Set myParaRange = Nothing End Function