![]() |
#1
|
|||
|
|||
![]()
Hi to all,
I’m looking for a) an explanation and b) for some workaround for the following phenomenon ![]() Given: A paragraph completely (=incl. paragraph marker) formatted in bold, next paragraph Font.Bold = False Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Maecenas porttitor congue massa. Fusce posuere, magna sed pulvinar ultricies, purus lectus malesuada libero, sit amet commodo magna eros quis urna.¶ Nunc viverra imperdiet enim. Fusce est. Vivamus a tellus.¶ Selection: First three words of this paragraph. VBA code: Code:
Sub RangeFindProblem() Dim oRng As Range Set oRng = Selection.Range With oRng.Find .ClearFormatting .Replacement.ClearFormatting .Font.Bold = True .Text = "" .Replacement.Text = "<start>^&<end>" .Forward = True .Wrap = wdFindStop .Format = True .Execute Replace:=wdReplaceAll End With End Sub Result: Although the range has been set to the first three words only, the complete paragraph (=incl. paragraph marker) has been searched and 'tagged': <start>Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Maecenas porttitor congue massa. Fusce posuere, magna sed pulvinar ultricies, purus lectus malesuada libero, sit amet commodo magna eros quis urna.¶ <end>Nunc viverra imperdiet enim. Fusce est. Vivamus a tellus.¶ The start of the oRng will always be set correctly according to the selection, but the end will not. The end always seems be set to the very end of the document: all bold passages will be 'tagged'. I’m a bit confused ![]() So, first question: Any explanations? Second question: What can I do to solve this problem? Thanks for any ideas NP |
#2
|
||||
|
||||
![]()
I have noticed this phenomenon and I cannot readily explain it, but you can work around it:
Code:
Dim oRng As Range Set oRng = ActiveDocument.Range With oRng.Find .Font.Bold = True .Text = Selection.Text .Forward = True .Wrap = wdFindStop .Format = True Do While .Execute If oRng.Start = Selection.Start Then oRng.Text = "<start>" & oRng.Text & "<end>" Exit Do End If Loop End With Code:
Dim oRng As Range Set oRng = ActiveDocument.Range With oRng.Find Do While .Execute(FindText:=Selection.Text) If oRng.Start = Selection.Start Then oRng.Text = "<start>" & oRng.Text & "<end>" Exit Do End If Loop End With
__________________
Graham Mayor - MS MVP (Word) (2002-2019) Visit my web site for more programming tips and ready made processes www.gmayor.com |
#3
|
|||
|
|||
![]()
The behavior is discussed here:
http://gregmaxey.com/word_tip_pages/..._property.html Basically: 1) we can't find a "thing" when that thing exactly matches the search range, and 2) when that thing does exactly match the search range, the dynamically redefined range is a "runaway" range. I've modified the PracticalIV code on the page to address your specific issue: Code:
Sub PracticalIV() Dim oRng As Word.Range 'Insert a temporary range modifier. Selection.Range.InsertAfter "~" Selection.MoveEnd wdCharacter, 1 Set oRng = Selection.Range 'Add unique (unanticipated formatting to the modifier). oRng.Characters.Last.Font.Bold = False With oRng.Find .Font.Bold = True .Replacement.Text = "<start>^&<end>" .Execute Replace:=wdReplaceAll End With 'Delete the modifier. oRng.Characters.Last.Delete End Sub |
#4
|
|||
|
|||
![]()
Hi Grahman,
Thanks for your code, it - of course - works. You wrote you Quote:
If there is an explanation, a link would be enough. I'd really like to unerstand what happens. BTW: do you know if this phenomenon only occurs with .FONT properties? Thanks again NP |
#5
|
|||
|
|||
![]()
Ooops,
your sent another post during my typing ... Basically I know your 'How To Search Site', but as it's the first time (for me) a oRng.Find procedure failed, I'm still a bit puzzled. It seems to be illogical somehow - for me. But I'll work it out. Cheers NP |
#6
|
|||
|
|||
![]()
NP,
No the problem is universal. Again it is a result of trying to find something in a range when the range is that something. Here is another demo: Code:
Sub ScratchMacro() 'A basic Word macro coded by Greg Maxey Dim oRng As Word.Range ActiveDocument.Range.Delete ActiveDocument.Range.Text = "Test" Set oRng = ActiveDocument.Words(1) Debug.Print oRng With oRng.Find .Text = "Test" If .Execute Then MsgBox "Found" Else MsgBox "Not found. Why? Because the thing we are looking for exactly matches the search range." & _ " We can't find ""Test"" IN the search range because ""Test"" IS the search range." End If End With 'Now redefine the range. Set oRng = ActiveDocument.Range '(includes Words(1) and the end of document mark. Debug.Print oRng With oRng.Find .Text = "Test" If .Execute Then MsgBox "Found." End If End With End Sub |
#7
|
|||
|
|||
![]()
I think you are confusing gmayor with gmaxey.
|
#8
|
|||
|
|||
![]()
Well, normally I wouldn't, but as I said: I'm a bit confused
![]() NP |
#9
|
||||
|
||||
![]()
There is of course the additional issue that if you are processing the selection, you wouldn't need to use the Range.Find function because you have already found it in order to select it.
Code:
Dim oRng As Range Set oRng = Selection.Range oRng.Text = "<start>" & oRng.Text & "<end>"
__________________
Graham Mayor - MS MVP (Word) (2002-2019) Visit my web site for more programming tips and ready made processes www.gmayor.com |
#10
|
|||
|
|||
![]()
Hi,
I think, I really got it now - no longer confused. But it's not really intuitive ... Thanks again for your help gmayor and gmaxey ![]() NP |
![]() |
|
![]() |
||||
Thread | Thread Starter | Forum | Replies | Last Post |
Onenote 2013 search is not identifying search terms correctly | Delta223 | OneNote | 0 | 08-12-2014 06:40 AM |
Search for date and then apply mutliple search criteria in huge dataset | maxtymo | Excel | 2 | 12-01-2013 04:52 AM |
Looking for Windows Search app with ability to search by content | gopher_everett | Office | 1 | 02-28-2013 09:23 PM |
Search Function Problem | MageWind | Excel | 2 | 06-29-2011 09:46 AM |
![]() |
NewSysAdmin | Windows | 1 | 03-08-2011 05:33 PM |