重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

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

A 回答 (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
    • good
    • 0
この回答へのお礼

Selection.Start/Endなどというプロパティがあったんですね! 勉強になりました。おしえていただいたとおりにやったらできました! たいへんありがとうございました。

ですが、疑問がのこりました。じつは、同じような方法を前にためしたのですが、その方法とは、

Selection.MoveLeft Unit:=wdLine, Count:=1
Selection.MoveRight Unit:=wdLine, Count:=1

を使って、教えていただいたのと同じように、カーソル位置をひとつ右にずらすというものでした(1行目は、選択範囲を解除してカーソルを選択範囲の最初の位置にもってくるため)。

しかしこれを実行したら、文章末で無限ループを起こしてしまいました。

カーソルを右に1つずらすというやり方は同じなのに、どうして教えてもらった方法では、無限ループしないのか不思議に思いました。

お礼日時:2004/11/19 16:56

>永久ループ


既存がどうなっているかを、ちゃんと書かないと、原因はわかりません。


カーソルを左右に動かしてやるなら、これでもいい
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}?であると認識してしまうので無限ループするのではないかと考えましたが、原因はよくわかりません。
教えてもらった方法に直したところ、無限ループしなくなりました。

補足日時:2004/11/24 14:39
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!