前回の記事(【コード】カーソルを移動するWordマクロ(その2) )の改良版です。
前回紹介したマクロでは、カーソルが以下のように句読点の直後に移動しました。
これは要望があって作ったものなので想像で動きを決めたのですが、自分で使ってみて違和感がないように少し改良してみました。
<目次>
このマクロでできること
下図のようにカーソルが句読点の直後に移動します。移動した箇所が段落の末尾やタブ、スペースの直前だった場合には文章の先頭(つまり、文字列の直前)にカーソルが位置します。前回のマクロとの違いは、下図における赤色の箇所です。
前回のマクロ同様、英文でも同じように動作します。
マクロの解説
前回のマクロの「カーソル_進む」処理において、カーソル位置を修正しました。
28行目で、句読点の直後の文字の判定をします。
myRange.Characters.Last.Next(wdCharacter, 2) にて、現在の選択範囲から末尾に向けて2つ目の文字列を取得します。
この取得した文字列が、スキップする文字列(21行目にて定義された Chr(9) & Chr(11) & Chr(13) & Chr(32) & Chr(-32448) )であるかどうかをLike 演算子で比較します。
Chr(9) タブ記号 Chr(11) 段落内改行の改行記号(ソフトリターン) Chr(13) 段落記号(ハードリターン) Chr(32) 半角スペース Chr(-32448) 全角スペース
29行目~34行目の処理で、取得した文字がこれら文字列の場合にはカーソルを文書末尾方向に進めて実際の文頭を探します。MoveEndWhile メソッドを利用します。結果、カーソル位置を文頭に移動します。
マクロ
Private Const myCset As String = "。、?!:;.,?!:;" Sub カーソル_戻る() Dim myRange As Range Set myRange = Selection.Range myRange.Start = myRange.Start - 1 myRange.MoveStartUntil cset:=myCset, Count:=wdBackward Selection.SetRange Start:=myRange.Start, End:=myRange.Start End Sub Sub カーソル_進む2() Dim myRange As Range Dim myCset2 As String myCset2 = Chr(9) & Chr(11) & Chr(13) & Chr(32) & Chr(-32448) Set myRange = Selection.Range myRange.End = myRange.End + 1 myRange.MoveEndUntil cset:=myCset, Count:=wdForward If myRange.Characters.Last.Next(wdCharacter, 2) Like "[" & myCset2 & "]" Then With myRange .End = .End + 2 .MoveEndWhile cset:=myCset2, Count:=wdForward Selection.SetRange Start:=myRange.End, End:=myRange.End End With Else Selection.SetRange Start:=myRange.End + 1, End:=myRange.End + 1 End If End Sub