![]() |
#1
|
|||
|
|||
![]()
Dear Word VBA Forum,
I am having a recurring problem with infinite loops in a macro containing multiple find and replace functions. Each function is written as follows: Code:
Set oRng = ActiveDocument.Range With oRng.Find .ClearFormatting .Replacement.ClearFormatting .Text = "Trizol" .Replacement.Text = "" .Forward = True .Wrap = wdFindStop .Format = False .MatchWholeWord = True .MatchCase = False .Execute End With Do While oRng.Find.Found = True oRng.Text = "TRIzolŪ" oRng.Collapse Direction:=wdCollapseEnd oRng.Find.Execute Loop The loops happen if even one instance of the target text is found - but only in about 50% of documents, while in the other documents the code works perfectly. I'm not sure what the difference between the 'problem' and 'non-problem' documents is. I tried removing all fields and turning track changes off in one of the problem documents, which did not prevent the infinite loops. Any help would be gratefully appreciated! Thank you Last edited by macropod; 04-06-2017 at 04:21 AM. Reason: Added code tags |
#2
|
||||
|
||||
![]()
There doesn't appear to be anything 'wrong' with your code, but I can't see any point to the loop, either - you could do the same with:
Code:
With ActiveDocument.Range.Find .ClearFormatting .Replacement.ClearFormatting .Text = "Trizol" .Replacement.Text = "TRIzolŪ" .Forward = True .Format = False .MatchCase = False .Wrap = wdFindContinue .MatchWholeWord = True .Execute Replace:=wdReplaceAll End With
__________________
Cheers, Paul Edstein [Fmr MS MVP - Word] |
#3
|
|||
|
|||
![]()
Thanks Macropod! Your code fixed the infinite loop issue for that function and similar ones. The macro seems to run faster too.
However, I'm not sure how to convert other infinite-loop-prone functions that only replace parts of strings to your suggested format. For example: Code:
With oRng.Find .ClearFormatting .Replacement.ClearFormatting .Text = "[0-9]%-[0-9]" .Replacement.Text = "" .Forward = True .Wrap = wdFindStop .Format = False .MatchWildcards = True .MatchWholeWord = False .Execute End With Do While oRng.Find.Found = True oRng.Characters(2).Text = "" oRng.Collapse Direction:=wdCollapseEnd oRng.Find.Execute Loop Last edited by macropod; 04-06-2017 at 03:04 PM. Reason: Replaced quote tags around code with code tags |
#4
|
||||
|
||||
![]()
That's as simple as:
Code:
With ActiveDocument.Range.Find .ClearFormatting .Replacement.ClearFormatting .Text = "([0-9])%(-[0-9])" .Replacement.Text = "\1\2" .Forward = True .Format = False .Wrap = wdFindContinue .MatchWildCards = True .Execute Replace:=wdReplaceAll End With
__________________
Cheers, Paul Edstein [Fmr MS MVP - Word] |
#5
|
|||
|
|||
![]()
Thanks so much. The code you posted and some minor tweaks have solved most of the issues I've been having.
For some reason, having tracked changes on makes the above code behave oddly in some situations (e.g., one function changes "1+1" to "1 + 1" with tracked changes off, but with tracked changes on the output is "11+ "). However, I can work around that by running the macro with tracked changes off then comparing documents to add the tracking. The only thing I still can't automate is to remove the percentage sign in text such as "20%-40% when an en dash is used instead of a hyphen. However, I have about 150 functions in the macro so having only one misbehaving isn't bad. |
#6
|
||||
|
||||
![]() Quote:
Quote:
.Text = "([0-9])%(-[0-9])" to: .Text = "([0-9])%(?[0-9])"
__________________
Cheers, Paul Edstein [Fmr MS MVP - Word] |
![]() |
Thread Tools | |
Display Modes | |
|
![]() |
||||
Thread | Thread Starter | Forum | Replies | Last Post |
![]() |
Aswinraj | Word VBA | 1 | 06-05-2016 04:33 PM |
Find and Replace Macro Need | djpemberton | Word VBA | 2 | 05-04-2016 07:53 PM |
![]() |
amparete13 | PowerPoint | 3 | 03-11-2014 05:29 AM |
![]() |
bennymc | Word VBA | 1 | 01-27-2014 04:23 PM |
Find and Replace Macro - A Better Way | Tribos | Word VBA | 0 | 10-08-2008 03:22 AM |