- ベストアンサー
Wordマクロの検索で、、、
Wordマクロで、文字を検索したいと思っています。 ところが、たとえば、 ABCDEFGHIという文字列があったときに、 ワイルドカード検索で??を検索すると、 まずABなる文字列が検索されます。 しかし、ABのあと、ほんとうはBCを検索してほしいのに、 CDが検索されます。(次はEF、GH) これを、AB→BC→CDのように連続的に検索するための プロパティなどは用意されているのでしょうか。 (Wordの検索機能では、連続的に検索してくれるのに、 VBに記録した瞬間、非連続的になってしまいます。)
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
'選択状態なら、カーソルを一つ進め、非選択状態にする If (Selection.End <> Selection.Start) Then Selection.Start = Selection.Start + 1 Selection.End = Selection.Start End If ’既存の検索処理 Selection.Find.ClearFormatting With Selection.Find .Text = "??" .Replacement.Text = "" .Forward = True .Wrap = wdFindAsk .Format = False .MatchCase = False .MatchWholeWord = False .MatchByte = False .MatchAllWordForms = False .MatchSoundsLike = False .MatchFuzzy = False .MatchWildcards = True End With Selection.Find.Execute
その他の回答 (1)
- 2ch
- ベストアンサー率51% (64/125)
>永久ループ 既存がどうなっているかを、ちゃんと書かないと、原因はわかりません。 カーソルを左右に動かしてやるなら、これでもいい If (Selection.End <> Selection.Start) Then Selection.MoveLeft Unit:=wdCharacter, Count:=1 Selection.MoveRight Unit:=wdCharacter, Count:=1 End If っていうか If (Selection.End <> Selection.Start) Then Selection.MoveLeft Selection.MoveRight End If でいい
補足
ありがとうございます。 >既存がどうなっているかを、ちゃんと書かないと、原因はわかりません。 既存は、 Do With Selection.Find.replacement.Font .Underline = wdUnderlineDouble End With With Selection.Find .Text = "[a-zA-Z0-9-]{1}?" .Forward = True .Wrap = wdFindStop .Format = True .MatchCase = False .MatchWholeWord = False .MatchByte = False .MatchAllWordForms = False .MatchSoundsLike = False .MatchFuzzy = False .MatchWildcards = True End With If Selection.Find.Execute = False Then Exit Do End If If StrConv(Right(Selection.Text, 1), vbWide) = Right(Selection.Text, 1) And Not Right(Selection.Text, 1) = Chr(13) And Not Selection.Font.Color = wdColorGray50 Then With Selection If .Find.Forward = True Then .Collapse Direction:=wdCollapseStart Else .Collapse Direction:=wdCollapseEnd End If .Find.Execute Replace:=wdReplaceOne If .Find.Forward = True Then .Collapse Direction:=wdCollapseEnd Else .Collapse Direction:=wdCollapseStart End If End With End If Selection.MoveLeft Unit:=wdCharacter, Count:=1 Selection.MoveRight Unit:=wdCharacter, Count:=1 Loop というものでした。 a~z、A~Z、0~9およびハイフンの右隣に、全角文字がある場合、二重下線をつけるというものです。 Loopの前の2行を抜かすと、ABの次にCDを検索してしまいます。かといって、上の2行を入れると、文書末で無限ループしてしまいます。文書末に、半角スペースみたいなものがあって、それを[a-zA-Z0-9-]{1}?であると認識してしまうので無限ループするのではないかと考えましたが、原因はよくわかりません。 教えてもらった方法に直したところ、無限ループしなくなりました。
お礼
Selection.Start/Endなどというプロパティがあったんですね! 勉強になりました。おしえていただいたとおりにやったらできました! たいへんありがとうございました。 ですが、疑問がのこりました。じつは、同じような方法を前にためしたのですが、その方法とは、 Selection.MoveLeft Unit:=wdLine, Count:=1 Selection.MoveRight Unit:=wdLine, Count:=1 を使って、教えていただいたのと同じように、カーソル位置をひとつ右にずらすというものでした(1行目は、選択範囲を解除してカーソルを選択範囲の最初の位置にもってくるため)。 しかしこれを実行したら、文章末で無限ループを起こしてしまいました。 カーソルを右に1つずらすというやり方は同じなのに、どうして教えてもらった方法では、無限ループしないのか不思議に思いました。