【Word VBA】カーソル位置よりも下位のアウトラインレベルの段落を選択するWordマクロ(その1)

2016年12月18日

最近、Wordをアウトライナーとして使っています(参考:【読み物】Wordをアウトライナーとして使う!)。

アウトライナーでもマウスを使いたくないので、文字列の選択をショートカットキーで実行したいと思っています。

そのような中で作ったのが今回のマクロです。

アウトライナーとして使うときに、アイディアの塊を移動することがあります。

そのときに下位の概念まで含めてブロックとして選択できると、移動作業がスムーズになると思います。

このマクロはもちろんショートカットキーに登録して使っています。

このマクロでできること

カーソルがある段落のアウトラインレベルよりも下位の段落を選択します。

(実行前)

アウトライナー

(実行後)

以下の通り、一番深い階層まで選択して終わります。

果物のアウトラインレベルよりも下の「柿」も選択できるほうがいいかもしれません。

ただ、ここ10日間ほど使ってみたのですが、「柿」も選択するようにしてしまうと選択範囲が延びすぎることがありました。なので、現時点ではあえてやっていません。

アウトライナー

少し癖があるかもしれませんが、けっこう便利です。

マクロの解説

アウトラインレベルの取得は、Paragraphs.OutlineLevel プロパティParagraph.OutlineLevel プロパティParagraphFormat.OutlineLevel プロパティがあります。

文字列の自由な選択にはRangeオブジェクトを使うのが便利です。なので、今回はRangeオブジェクトと相性のよいParagraphFormat.OutlineLevel プロパティを使ったマクロを紹介します。

なお、別の記事でParagraph.OutlineLevel プロパティによるマクロを紹介します。

もうすこしスマートに書けそうですが、ひとまずはこれで事足りているのでいいとします。

マクロ


Sub 下位のアウトラインレベルを選択1()

 Dim myLevel As Long
 Dim myRange As Range
 Dim myNextRange As Range
 
 '選択範囲(カーソル位置)の最初の段落をRangeオブジェクトに設定
 Set myRange = Selection.Paragraphs(1).Range
 
 'myRange(Rangeオブジェクト)のアウトラインレベルを取得
 'このアウトラインレベルを基準にする
 myLevel = myRange.ParagraphFormat.OutlineLevel
 
 'myRangeの次の段落をmyNextRange(Rangeオブジェクト)に設定
 Set myNextRange = myRange.Next(Unit:=wdParagraph, Count:=1)
 
 'アウトラインレベルが低い場合に限りmyRangeの範囲を拡大
 Do While myNextRange.ParagraphFormat.OutlineLevel >= myLevel
  
  'myNextRangeのアウトラインレベルを取得
  myLevel = myNextRange.ParagraphFormat.OutlineLevel
  
  'myRangeの範囲を再設定(末尾を次の段落myNextRangeの末尾にする)
  With myRange
   .SetRange .Start, myNextRange.End
  End With
  
  'myRangeの次の段落をmyNextRangeに設定
  Set myNextRange = myRange.Next(Unit:=wdParagraph, Count:=1)
 
  '最終段落の場合に終了
  If myNextRange Is Nothing Then Exit Do
 
 Loop
 
 'myRangeを選択する
 myRange.Select

End Sub

-コード
-,