みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
Word VBAで便利なカーソル移動のショートカットキーを作成する方法をお伝えしています。
前回の記事はコチラ。
見出し単位でカーソル移動をするプロシージャを作成しました。
こちら、文書の先頭または末尾に移動しきったときの挙動を追加しつつ、見出し単位のカーソル移動をショートカットキー化していきます。
では、行ってみましょう!
前回のおさらいとお題
前回作成したプロシージャですが、おさらいをしましょう。
まず、文書の末尾方向(順方向)に次の見出しに移動するプロシージャがこちら。
Sub gotoForward()
Selection.GoToNext wdGoToHeading
End Sub
このプロシージャを何度か実行をすると、文書の最後の見出しである以下「見出し2」のところで止まって動かなくなります。
一方で、文書の先頭方向(逆方向)に前の見出しに移動するプロシージャがこちらです。
Sub gotoBackward()
Selection.GoToPrevious wdGoToHeading
End Sub
こちらも何度か実行すると、文書の先頭の見出しから先はカーソル移動をしません。
まあ、これはこれでよいのですが、普通に長い文書ですと、本当に最後(または最初)の見出しに到達したから動かないのかがちょっとわかりづらいです。
なので、この状態のときには、文書の末尾(または先頭)にカーソル移動をしてあげるほうが親切であることも多いかなと思いまして、その処理を追加していきたいと思います。
見出し単位のカーソル移動で文末の末尾・先頭での処理を追加する
アルゴリズムとしては以下のようになるかと思います。
- GoToNextメソッド(またはGoToPrevious)を実行
- 実行前と実行後でEnd(またはStart)の位置に変更がなければ
- 文書の末尾(または先頭)にカーソルを移動
MoveUntilメソッドのときは、戻り値でカーソルの移動数が得られたので、それをもとに条件分岐できました。
GoToNextメソッド、GoToPreviousメソッドの戻り値
ですが、GoToNextメソッド、GoToPreviousメソッドの場合は、ちょっぴり違います。
戻り値として移動先のカーソル位置をRangeオブジェクトで返します。
ですから、移動前のRangeオブジェクトを保管しておいて、移動後に上記のように取得したRangeオブジェクトのEnd(またはStart)と比較すればよいですね。
それを踏まえて、以下のようなプロシージャを作りました。
Sub gotoForward()
Dim rng As Range, rngNext As Range
With Selection
Set rng = .Range
Set rngNext = .GoToNext(wdGoToHeading)
If rngNext.End = rng.End Then .Move wdStory, 1
End With
移動後のカーソル位置の別の取得方法
これでOKはOKなのですが、移動後のカーソル位置…わざわざ戻り値を使わなくても
とすれば取得できますね。
こちらのほうが変数少ない分、若干シンプルですね。
見出し単位のカーソル移動のショートカットキーを作る
次の見出しにカーソル移動するショートカットキー
以上を踏まえて、一つ次の見出しにカーソル移動するプロシージャは以下のようになりますね。
Sub gotoForward()
Dim rng As Range
With Selection
Set rng = .Range
.GoToNext wdGoToHeading
If .Range.End = rng.End Then .Move wdStory, 1
End With
End Sub
GoToNextの前後で範囲のEndに変更がなければ、Moveメソッドを実行して文書の末尾にカーソル移動をしちゃいます。
一応、動作確認しておきましょうか。
上記のプロシージャを実行してみると、以下のように文書の最後の見出しの位置から先は、文書の末尾にカーソル移動しますね。
あとはこのプロシージャをショートカットキー登録すればOKですね。
以下記事を参考に Alt + ] に指定してみました。
前の見出しにカーソル移動するショートカットキー
同様に、一つ前の見出しにカーソル移動するプロシージャはこちらです。
Sub gotoBackward()
Dim rng As Range
With Selection
Set rng = .Range
.GoToPrevious wdGoToHeading
If .Range.Start = rng.Start Then .Move wdStory, -1
End With
End Sub
実行結果はこちらです。
こちらはショートカットキー Alt + [ に設定しました。
まとめ
Word VBAで見出し単位のカーソル移動をショートカットキー化する方法をお伝えしました。
これで見出し単位でビュンビュン移動できるようになりました。
本シリーズのテクニックをちょっと使えば、好みのカーソル移動のショートカットキーが作れると思いますので、ぜひトライしてみてください。
次回、また別のWord VBAのテクニックをお伝えしますね。以下記事から始まる文書一括処理に関するシリーズがおすすめです。
どうぞお楽しみに!