プログラムを書いていると、カーソルの位置を調べたり、または
特定の位置にカーソルを移動したいことがあります。
そのときに役立つの1行マクロです。
現在のカーソル位置を取得
文字列が選択されている場合に、選択範囲の開始位置と終了位置を取得するマクロです。
○開始位置 Selection.Start
○終了位置 Selection.End
勘がいい方なら、察しがつくとおり、文字列を選択していない場合、つまり、カーソルが置かれた状態 | を示している状態では、Selection.Start と Selection.End とは同じ値を示します。
使い方
これ、私は理解するのに時間がかかりましたが、プログラム特有の使い方ですね。
「①値を取得する場合」と、「②値を代入する場合」とがあるんです。
①値を取得する場合
これは、現在置かれているカーソル(もしくは、現在選択されている文字列の範囲)から、開始位置と終了位置を取得する場合を意味します。
以下の1行マクロは、カーソルの開始位置をメッセージボックスで表示します。
(おまけの1行マクロ)
MsgBox Selection.Start
上のプログラムは、「Selection.Start で取得した値を表示しなさい」という意味です。
MsgBox を使うと、ワードと対話できるようになるので、プログラミングがいっそう楽しくなります。今回は、説明は省きます。
②値を代入する場合
今度は、逆に、値を入れてあげる方法です。
カーソルを目的の場所に移動させるときに使います。
Selection.Start = 100
Selection.End = 120
こうすると、100文字目から120文字目の文字が選択されます。
それぞれの「値を100や120にしなさい」という意味ですね。
Selection.Start = 100
Selection.End = 100
こうすると、100文字目のところにカーソルが | の状態で表示されます。
なお、文書の一番先頭が0文字目に数えられます。
適当な数値をいれて遊んでみてください。
コメント
Document先頭から選択範囲までの間にハイパーリンクなどがある場合、SelectionなどRangeオブジェクトのStart/Endプロハティ値と文字数は一致しません。Word VBAでRegExpオブジェクトを使用して正規表現検索をする際、文字位置が一致しません。Document自体がXMLアーカイブなためで、現在有効な方法を探索中です。
Lune Rouge さん、コメントをありがとうございます。本件の解決方法は私自身もよくわかっておりません。
私も同じようなことに遭遇したことがありました。そのときには、フィールドでリンクを設定したのですが、このときもStart/Endプロパティを正確に取得できませんでした。このときはどうしようもなかったので、応急処置としてフィールドコードを表示して内部の文字列を検証して、、、、などと汎用性のない方法で乗り切りました。
この他にも、コメントの挿入位置にもなにかタグを埋め込んでいるらしく、ワイルドカードで検索するときに誤判定になったりします。悩ましいですね。