2

次のコードは機能しますが、ドキュメント全体に対してすべてを実行します。テキストのブロックを強調表示したいのですが、マクロを実行すると、強調表示されたテキストに対してのみ機能します。それ、どうやったら出来るの?ありがとう...

Sub DoCodeNumberStyle(numchars As String)

    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = "(^13)([0-9]{" + numchars + "}) "
        .Replacement.Text = "\1###\2$$$ "
        .Forward = True
        .Wrap = wdFindAsk
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchWildcards = True
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    Selection.Find.Replacement.Style = ActiveDocument.Styles("CodeNumber")
    With Selection.Find
        .Text = "###([0-9]{" + numchars + "})$$$"
        .Replacement.Text = "\1"
        .Forward = True
        .Wrap = wdFindAsk
        .Format = True
        .MatchCase = False
        .MatchWholeWord = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchWildcards = True
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
End Sub

Sub CodeNumberStyle()
    DoCodeNumberStyle ("1")
    DoCodeNumberStyle ("2")
End Sub

PostScript:

私が発見したもう1つのこと:選択範囲で複数の検索を行うと、最初の検索結果は選択範囲を失う/変更するため、他の検索結果は元の選択範囲に制限されなくなります(wdReplaceAllは資料)。これを修正するには、選択範囲を範囲にキャプチャします。これが私のメソッドの最終バージョンです。これで必要なすべてが実行され、元の強調表示された選択に制限され(3つの検索と置換がある場合でも)、コードごとに最小化されています。

Sub AAACodeNumberStyleHighlightedSelection()

    With Selection.Range.Find
        .ClearFormatting
        .Style = ActiveDocument.Styles("Code")
        .Replacement.ClearFormatting
        .Forward = True
        .Wrap = wdFindStop
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False

        ' First line:
        .Text = "1   //"
        .Replacement.Text = "###1$$$   //"
        .MatchWildcards = False
        .Execute Replace:=wdReplaceAll

        ' Rest of lines:
        .Text = "(^13)([0-9]{1,2}) "
        .Replacement.Text = "\1###\2$$$ "
        .MatchWildcards = True
        .Execute Replace:=wdReplaceAll

        ' Now style the line numbers:
        .Text = "###([0-9]{1,2})$$$"
        .Replacement.Text = "\1"
        .Replacement.Style = ActiveDocument.Styles("CodeNumber")
        .MatchWildcards = True
        .Execute Replace:=wdReplaceAll

    End With

End Sub
4

3 に答える 3

2

.WrapをwdFindStopに変更すると、これでうまくいくはずです。これはWordのマイナーなバグかもしれないと思います。ドキュメントには、ラップ値が記載されています

ドキュメントの先頭以外のポイントで検索が開始され、ドキュメントの末尾に到達した場合(または、ForwardがFalseに設定されている場合はその逆)、または指定された選択範囲に検索テキストが見つからない場合にどうなるかを設定します。範囲。

しかし、選択を考慮に入れるのではなく、検索をドキュメントの最後に移動するように強制しているようです。とにかく、選択範囲でこれを実行することだけを計画している場合は、wdFindAskは必要ありません。

于 2013-01-25T18:03:33.397 に答える
0

私も、範囲でFINDループを開始した場合でも、範囲はFINDによって再定義されるため、.executeの連続ループは、元の範囲を超えてドキュメントの最後まで到達することを発見しました。wdFindStopは、元の範囲の終わりではなく、ドキュメントの終わりでのみ停止します。

そこで、IFステートメントを挿入しました。

do while .find.found ... If .find.parent.InRange(doc.Bookmarks( "BODY")。Range)= False Then Exit Do ... .execute loop

于 2013-10-18T17:54:17.580 に答える
0
Set myRange = Selection.Range
 myRange.Select
    With Selection.Find
        .Text = "Apple"
        .Replacement.Text = "Banana"
        .Forward = True
        .Wrap = wdFindStop
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        '.MatchWildcards = True
    End With
    Selection.Find.Execute Replace:=wdReplaceAll

   myRange.Select
        With Selection.Find
        .Text = "red"
        .Replacement.Text = "yellow"
        .Forward = True
        .Wrap = wdFindStop
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        '.MatchWildcards = True
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
于 2016-10-18T00:21:36.400 に答える