Hi, programmers,

I have a question on a very helpful macro posted here for finding and
underlining text between quotation marks. It works great--except when quotes
are preceded or followed by a comma or Wildcard.

In that case, the range extends right on through to the next instance of
quotes that DONâ??T have any commas right before or after them.

Is there a way to keep the range from extending in these instances? Thank
you for all your help.

Here is the code:

Sub FindAndUnderlineTextInQuotes()
Dim oRng As Range
Set oRng = ActiveDocument.Content
With oRng.Find
.ClearFormatting
.Text = "[^0034^0147]<*>[^0034^0148]"
.Forward = True
.Wrap = wdFindStop
.MatchWildcards = True
Do While .Execute
If oRng.Find.Found = True Then
With oRng
.MoveEnd Unit:=wdCharacter, Count:=-1
.MoveStart Unit:=wdCharacter, Count:=1
.Font.Underline = True
.Collapse wdCollapseEnd
End With
End If
Loop
End With
End Sub


Thanks!

-Lynne

Re: HOW TO KEEP A RANGE INSIDE QUOTES? by Jay

Jay
Thu Feb 28 17:13:21 PST 2008

The problem you describe is caused by the angle brackets around the asterisk in
the middle of the search expression. It specifies that in order to get a match,
the stuff between the quote marks _must_ start at the beginning of a word and
end at the end of a word. When you get a comma (or, for that matter, any
punctuation or space) before the closing quote, that isn't recognized as a
match. However, as Word continues to extend the search range, it may eventually
find a quote mark at the end of a word, which it takes as the end of the match.
The solution is simply to remove the angle brackets, letting the asterisk match
any sequence of characters.

There's another problem with the code. The .Collapse near the end of the Do loop
leaves the oRng to the left of the ending quote mark (because of the preceding
.MoveEnd statement), so that's where the next search is going to start. You need
to move oRng to the right of that quote mark.

A minor nit-pick is that the If oRng.Find.Found test isn't needed -- whenever
.Execute returns True, that automatically makes oRng.Find.Found = True also.

Here's the fixed-up version:

Sub FindAndUnderlineTextInQuotes()
Dim oRng As Range
Set oRng = ActiveDocument.Content
With oRng.Find
.ClearFormatting
.Text = "[^0034^0147]*[^0034^0148]"
.Forward = True
.Wrap = wdFindStop
.MatchWildcards = True
Do While .Execute
With oRng
.MoveEnd Unit:=wdCharacter, Count:=-1
.MoveStart Unit:=wdCharacter, Count:=1
.Font.Underline = True
.Move Unit:=wdCharacter, Count:=2
End With
Loop
End With
End Sub

--
Regards,
Jay Freedman
Microsoft Word MVP FAQ: http://word.mvps.org
Email cannot be acknowledged; please post all follow-ups to the newsgroup so all
may benefit.

On Thu, 28 Feb 2008 15:04:00 -0800, Elessvie
<Elessvie@discussions.microsoft.com> wrote:

>Hi, programmers,
>
>I have a question on a very helpful macro posted here for finding and
>underlining text between quotation marks. It works great--except when quotes
>are preceded or followed by a comma or Wildcard.
>
>In that case, the range extends right on through to the next instance of
>quotes that DON?T have any commas right before or after them.
>
>Is there a way to keep the range from extending in these instances? Thank
>you for all your help.
>
>Here is the code:
>
>Sub FindAndUnderlineTextInQuotes()
>Dim oRng As Range
>Set oRng = ActiveDocument.Content
>With oRng.Find
> .ClearFormatting
> .Text = "[^0034^0147]<*>[^0034^0148]"
> .Forward = True
> .Wrap = wdFindStop
> .MatchWildcards = True
> Do While .Execute
> If oRng.Find.Found = True Then
> With oRng
> .MoveEnd Unit:=wdCharacter, Count:=-1
> .MoveStart Unit:=wdCharacter, Count:=1
> .Font.Underline = True
> .Collapse wdCollapseEnd
> End With
> End If
> Loop
>End With
>End Sub
>
>
>Thanks!
>
>-Lynne

Re: HOW TO KEEP A RANGE INSIDE QUOTES? by Elessvie

Elessvie
Fri Feb 29 07:27:04 PST 2008

Thank you, once again, so much, for all three points!

I always learn a lot from this board, whether posting directly or searching
subjects.

-Lynne


"Jay Freedman" wrote:

> The problem you describe is caused by the angle brackets around the asterisk in
> the middle of the search expression. It specifies that in order to get a match,
> the stuff between the quote marks _must_ start at the beginning of a word and
> end at the end of a word. When you get a comma (or, for that matter, any
> punctuation or space) before the closing quote, that isn't recognized as a
> match. However, as Word continues to extend the search range, it may eventually
> find a quote mark at the end of a word, which it takes as the end of the match.
> The solution is simply to remove the angle brackets, letting the asterisk match
> any sequence of characters.
>
> There's another problem with the code. The .Collapse near the end of the Do loop
> leaves the oRng to the left of the ending quote mark (because of the preceding
> ..MoveEnd statement), so that's where the next search is going to start. You need
> to move oRng to the right of that quote mark.
>
> A minor nit-pick is that the If oRng.Find.Found test isn't needed -- whenever
> ..Execute returns True, that automatically makes oRng.Find.Found = True also.
>
> Here's the fixed-up version:
>
> Sub FindAndUnderlineTextInQuotes()
> Dim oRng As Range
> Set oRng = ActiveDocument.Content
> With oRng.Find
> .ClearFormatting
> .Text = "[^0034^0147]*[^0034^0148]"
> .Forward = True
> .Wrap = wdFindStop
> .MatchWildcards = True
> Do While .Execute
> With oRng
> .MoveEnd Unit:=wdCharacter, Count:=-1
> .MoveStart Unit:=wdCharacter, Count:=1
> .Font.Underline = True
> .Move Unit:=wdCharacter, Count:=2
> End With
> Loop
> End With
> End Sub
>
> --
> Regards,
> Jay Freedman
> Microsoft Word MVP FAQ: http://word.mvps.org
> Email cannot be acknowledged; please post all follow-ups to the newsgroup so all
> may benefit.
>
> On Thu, 28 Feb 2008 15:04:00 -0800, Elessvie
> <Elessvie@discussions.microsoft.com> wrote:
>
> >Hi, programmers,
> >
> >I have a question on a very helpful macro posted here for finding and
> >underlining text between quotation marks. It works great--except when quotes
> >are preceded or followed by a comma or Wildcard.
> >
> >In that case, the range extends right on through to the next instance of
> >quotes that DONâ??T have any commas right before or after them.
> >
> >Is there a way to keep the range from extending in these instances? Thank
> >you for all your help.
> >
> >Here is the code:
> >
> >Sub FindAndUnderlineTextInQuotes()
> >Dim oRng As Range
> >Set oRng = ActiveDocument.Content
> >With oRng.Find
> > .ClearFormatting
> > .Text = "[^0034^0147]<*>[^0034^0148]"
> > .Forward = True
> > .Wrap = wdFindStop
> > .MatchWildcards = True
> > Do While .Execute
> > If oRng.Find.Found = True Then
> > With oRng
> > .MoveEnd Unit:=wdCharacter, Count:=-1
> > .MoveStart Unit:=wdCharacter, Count:=1
> > .Font.Underline = True
> > .Collapse wdCollapseEnd
> > End With
> > End If
> > Loop
> >End With
> >End Sub
> >
> >
> >Thanks!
> >
> >-Lynne
>