質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.37%

ループ処理終了後、検索を始めた部分までカーソルを移動するWordマクロ

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 2,393

score 341

ループ処理終了後、検索を始めた部分までカーソルを移動するWordマクロ

題目通りです。
私はこの掲示板内でアドバイスいただき、あるループ処理をするマクロを作りました。(そのお二方には感謝しかありません。)

しかし、最近そのマクロにある機能を追加する必要が出てきました。それは「ループ処理終了後、検索を始めた部分までカーソルを移動する」という機能です。

文書の最初なら、ActiveDocument.Range(0, 0).Selectとすればいいとは調べて分かったのですが、検索を始めた部分まではわかりませんでした。

これはどういうふうに実現できるのでしょうか?
どうかご教授いただけると助かります・・・

以下に、とあるループ処理をするマクロを記します。

Sub PlusNumber()
    Dim sel As Word.Selection
    Set sel = Selection

    '「カーソルより下を検索する部分」
    Do
        With sel.Find
            .Text = "([0-9]{1,3})"
            .MatchFuzzy = False
            .MatchWildcards = True

            '.Execute()がTrueなら当該文字が見つかった
            If Not .Execute() Then
                'Falseなら見つからなかった
                Exit Do
            End If
        End With 'sel.Find


        '数字に+1
        sel.Text = sel.Text + 1

        sel.Collapse Direction:=wdCollapseEnd
  Loop
 'ここで初めにカーソルを置いた部分まで戻りたい
End Sub

追記

「ループ処理終了後、検索を始めた部分までカーソルを移動する」について以下に例を示します。

処理前のword文書
(カーソルよりしたの数字に+1するマクロを使う)

1
2
(ここにカーソルがあるとする)
3
4
5


処理後のword文書

1
2
(本来なら一番下にカーソルがいったままだが、ここにカーソルを戻したい。)
4(ループ処理で+1されている)
5(ループ処理で+1されている)
6(ループ処理で+1されている)

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • m.ts10806

    2018/09/26 08:49

    ソースコードは ``` で「囲う」必要があります。閉じ部分が抜けていますね。あとは「lang-言語」となっている場所は言語名を入れてください。今回だと「VBA」でしょうか。

    キャンセル

  • m.ts10806

    2018/09/26 08:50

    また「検索を始めた部分」というのは例えばどういう場所になるのでしょうか?例示は可能ですか?

    キャンセル

  • hood

    2018/09/26 09:29

    ご指摘ありがとうございます。つい、うっかりして、```と言語名を入れ忘れてしまいました。また、例示のほうものせるべきだったと今更ながら思いました。合わせて修正させていただきました・・・。

    キャンセル

回答 1

checkベストアンサー

+1

Rangeのプロパティ、Start、End で位置が取得できます。

なので、処理の前に位置を特定しておき、
処理が終わった後に開始位置をSelectする等で戻れると思います。

WordVBAはマイナーなので頑張ってください。

余談ながら、テキストが大量かつ、処理も大量だと、
たまに正常に処理してくれない事があります。。。

もしそんな挙動があった場合は、
クリップボードをAPIできっちりクリアする、
という意味不明な事を試してみてください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/09/26 11:21

    回答ありがとうございます!
    ExcelVBAerさんのアドバイスを元に、ループ処理前に
      Dim s As Long
    s = Selection.Start
    Dim e As Long
    e = Selection.End
    処理後に、
    ActiveDocument.Range(s, e).Select
    とすることで狙い通りの動きになりました!

    キャンセル

  • 2018/09/26 12:03

    できれば、ActiveDocument は、ThisDocument にするか、
    処理開始時にDocument型の変数に入れて使用することをお勧めします。

    ※Excel では質問欄に頻出しているのですが、Active〇〇を使っていると、
     別のブックや文書を開く処理が追加された場合に、
     処理がおかしくなってしまいますので。。。

    キャンセル

  • 2018/09/27 21:47

    返信遅れてすいませんでした!
    なるほど、そんな都合があるのですね・・・
    分かりましたそうします!
    親切にも教えてくださり、ありがとうございました!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.37%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る