みなさん、こんにちは!
タカハシ(@ntakahashi0505)です。
Word VBAで便利なカーソル移動のショートカットキーを作る方法をお伝えしています。
前回の記事はこちらです。
MoveUntilメソッドを使って、句読点単位で移動をするプロシージャを作りました。
ただ、このプロシージャ、ちょっと挙動がおかしいところがあるんですよね。
今回は、その欠点を直しつつ、句読点単位のカーソル移動をショートカットキー化していきます。
では、行ってみましょう!
前回のおさらいと課題
まずは前回のおさらいなのですが、以下プロシージャは句読点単位で文書の末尾方向(順方向)にカーソル移動をするものです。
Sub moveForward()
Const STR_CSET As String = "。、"
With Selection
.MoveUntil STR_CSET, wdForward
.Move wdCharacter, 1
End With
End Sub
「。」か「、」が見つかる位置までカーソルを移動するという処理ですね。
しかし、実はちょっと欠点がありまして…、連続して実行して、文書の末尾に近くなると…
最後のほうの挙動、微妙ですよね。
MoveUntilで「。」と「、」がもう見つからない状態になるとMoveUntilは実行されないのですが、1文字移動するMoveメソッドだけ実行されちゃうんですね。
んー、ちょっとカッコ悪い。
逆方向に句読点単位でカーソル移動するプロシージャ
Sub moveBackward()
Const STR_CSET As String = "。、"
With Selection
.MoveUntil STR_CSET, wdBackward
.Move wdCharacter, -1
End With
End Sub
こちらも同様で、文書の先頭のほうになると…
1文字ずつの移動になっちゃいますね。
やっぱりカッコ悪い…
MoveUntilメソッドで移動できたかどうかを判定する
これをカッコよくするためには、MoveUntilメソッドで移動があったときとなかったときで処理をわけていけばよいです。
文書の末尾または先頭に近づいて、もう目的の文字が存在していないときには、実行時に末尾または先頭にカーソル移動をするようにしちゃいましょう。
つまり、以下のような処理を入れるのです。
- もしMoveUntilメソッドで目的の文字が見つかってカーソル移動できたら
- 1文字だけその方向にカーソル移動する
- さもなくば
- 文書の末尾(または先頭)にカーソル移動する
MoveUntilメソッドの移動文字数を取得する
さて、その判断のための心強い味方なのですが、MoveUntilメソッドは実行後にその移動数を戻り値として返します。
この変数の値が0でなければ、MoveUntilメソッドでカーソル移動があったということですよね。
If~Then文で条件分岐を作る
条件によって処理を分岐するときには、If~Then文を使いますよね。今回は、条件が満たされなかったときの処理も必要なので、Else文も使います。
’処理1
Else
’処理2
End If
条件式が満たされている(条件式がTrue)のであれば処理1が実行され、そうでなければ(条件式がFalse)であれば処理2が実行されます。
Word VBAでは条件分岐はあまり使わないかも知れませんが、重要な構文なのでしっかり使えるようにしておきたいですね。
カーソル位置を文書の末尾または先頭に移動する
さて、MoveUntilメソッドの移動数がゼロだった場合は、カーソル位置を文書の末尾(または先頭)に移動したいのです。
その方法はどうしましょうか?
これは、これまでちょこちょこお世話になっている、Moveメソッドを活用できます。
UnitにwdStoryを設定して、Countは順方向であればプラスの値(例えば1またはwdForward)、逆方向であればマイナスの値(例えば-1またはwdBackward)を指定すればOKです。
句読点単位でカーソル移動をするプロシージャ
以上を踏まえて、MoveUntilで移動があったかどうかを条件として、処理を分岐するようにしてみましょう。
順方向への句読点単位カーソル移動をショートカットキーに登録する
句読点単位で順方向へカーソル移動するプロシージャはこちらです。
Sub moveForward()
Const STR_CSET As String = "。、"
Dim lenMove As Long
With Selection
lenMove = .MoveUntil(STR_CSET, wdForward)
If lenMove <> 0 Then
.Move wdCharacter, 1
Else
.Move wdStory, wdForward
End If
End With
実行をしてみましょう。
末尾に近づき句読点がもうないときには、文書の末尾にカーソルが移動しましたね。
このプロシージャはショートカットキー Alt + . に設定をしました。なんとなくそれっぽいでしょ?
Wordマクロのショートカットキーの登録方法はこちらの記事をご覧ください。
逆方向への句読点単位カーソル移動をショートカットキーに登録する
今度は、句読点単位で逆方向にカーソル移動するプロシージャです。
Sub moveBackward()
Const STR_CSET As String = "。、"
Dim lenMove As Long
With Selection
lenMove = .MoveUntil(STR_CSET, wdBackward)
If lenMove <> 0 Then
.Move wdCharacter, -1
Else
.Move wdStory, wdBackward
End If
End With
End Sub
これを連続実行します。
先頭に近くなり、句読点が見つからないならカーソルは先頭に移動しますね。
こちらのプロシージャは、ショートカットキー Alt + , に設定しました。
まとめ
Word VBAで句読点単位のカーソル移動をショートカットキー化する方法をお伝えしました。
これで、Word文書の同じページ内などは縦横無尽にカーソル移動できますね。
さて、次回ですが、別のショートカットキー「見出し単位で移動」を作っていきたいと思います。
どうぞお楽しみに!