• ベストアンサー

Wordマクロの検索で、、、

Wordマクロで、文字を検索したいと思っています。 ところが、たとえば、 ABCDEFGHIという文字列があったときに、 ワイルドカード検索で??を検索すると、 まずABなる文字列が検索されます。 しかし、ABのあと、ほんとうはBCを検索してほしいのに、 CDが検索されます。(次はEF、GH) これを、AB→BC→CDのように連続的に検索するための プロパティなどは用意されているのでしょうか。 (Wordの検索機能では、連続的に検索してくれるのに、 VBに記録した瞬間、非連続的になってしまいます。)

質問者が選んだベストアンサー

  • ベストアンサー
  • 2ch
  • ベストアンサー率51% (64/125)
回答No.1

'選択状態なら、カーソルを一つ進め、非選択状態にする 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

crooked_man
質問者

お礼

Selection.Start/Endなどというプロパティがあったんですね! 勉強になりました。おしえていただいたとおりにやったらできました! たいへんありがとうございました。 ですが、疑問がのこりました。じつは、同じような方法を前にためしたのですが、その方法とは、 Selection.MoveLeft Unit:=wdLine, Count:=1 Selection.MoveRight Unit:=wdLine, Count:=1 を使って、教えていただいたのと同じように、カーソル位置をひとつ右にずらすというものでした(1行目は、選択範囲を解除してカーソルを選択範囲の最初の位置にもってくるため)。 しかしこれを実行したら、文章末で無限ループを起こしてしまいました。 カーソルを右に1つずらすというやり方は同じなのに、どうして教えてもらった方法では、無限ループしないのか不思議に思いました。

その他の回答 (1)

  • 2ch
  • ベストアンサー率51% (64/125)
回答No.2

>永久ループ 既存がどうなっているかを、ちゃんと書かないと、原因はわかりません。 カーソルを左右に動かしてやるなら、これでもいい 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 でいい

crooked_man
質問者

補足

ありがとうございます。 >既存がどうなっているかを、ちゃんと書かないと、原因はわかりません。 既存は、 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}?であると認識してしまうので無限ループするのではないかと考えましたが、原因はよくわかりません。 教えてもらった方法に直したところ、無限ループしなくなりました。

関連するQ&A

専門家に質問してみよう