文章を作成しているときに、カーソル位置を覚えておきたいことがよくあります。
文書中を先頭から読み直したり、検索したり、置換をしたり。いろいろと作業をしたあと、元の位置に戻ります。
特許明細書のように段落番号が記載されていれば戻る位置を特定しやすいのですが問題はありません(こちらの記事「日英特許明細書の段落番号を探すマクロ(改良版)」のマクロを使います)。しかし、通常の文書の場合、同じ位置に戻ることが困難なことがあります。
そのようなとき、カーソル位置を記録しておき、その位置に戻れると便利だと思います。
私は、このマクロは単独では使っていませんが、上書き翻訳ツールや山猫の手など、他のソフトに搭載しています。
<目次>
このマクロでできること
最初のマクロで、現在のカーソル位置を記録します。
別のマクロを実行すると、カーソル位置が記録した位置に戻ります。
マクロの解説
「カーソルの位置を記録するマクロ」と「記録した位置にカーソルを戻すマクロ」の2種類あります。
この2つのマクロで共通で用いる変数として、カーソル位置の保存用のRangeオブジェクト(myPosRange)を宣言します。
通常はモジュールの一番上に変数を宣言します。
(後に追記) 変数の宣言をモジュールの先頭に記載する方法がわからない場合には、 この記事に書かれているマクロ全体を新しいモジュールにコピペしてください。 【VBE】モジュールの先頭にマクロを記載する
単にカーソル位置であればLong型の変数でもよさそうな気がします。
しかし、Long型の変数に保存される値は固定されたものであるため、文字列を削除したり挿入したりすると、カーソルを戻したときに意図していた位置からずれてしまいます。
たとえば、以下の文章の13文字目(赤い部分)のカーソル位置で、マクロを実行して値を記録します。
私は「みんなのワードマクロ|」の新田です。
次に、文頭の2文字「私は」を削除した場合、文章は以下のようになります。
「みんなのワードマクロ」の新田です。
保存した値は13文字目です。マクロを実行して13文字目にカーソルを戻すと、以下のようになります。つまり、記録したときとずれが生じるということです。
「みんなのワードマクロ」の|新田です。
それに対して、Rangeオブジェクトの場合、値ではなく文章における相対的な場所が保存されます。
つまり、上記のように文字を削除した場合であっても、Rangeオブジェクトに保存された場所は以下のようになります。
「みんなのワードマクロ|」の新田です。
そのため、文字列の挿入、削除に関わらず、記録した位置にカーソルを戻すことができるのです。
マクロ
Private myPosRange As Range Sub カーソル位置を記録() Set myPosRange = Selection.Range End Sub Sub 記録したカーソル位置へ戻る() Dim myStart As Long If myPosRange Is Nothing Then MsgBox "移動先が指定されていません。" Exit Sub End If myStart = myPosRange.Start Selection.SetRange Start:=myStart, End:=myStart Set myPosRange = Nothing End Sub