![]() |
|
#1
|
|||
|
|||
|
Hello
With the help of some AI bots, the Word macro below was generated to use regex in Find and Replace with a YesNoCancel prompt (macro runs from cursor position). The problem with this macro is that when the Find string and Replace string are not of the same length, the first replacing is done correctly, but then the other search results are incorrectly selected, and no replacing is showing. AI bots are suggesting updating cursor position, but all their solutions don't work! Any help is much appreciated. PS: The pattern and replacementtext in the macro below are just examples. I need the macro for cases that are not supported by wildcards. Here's the macro: Code:
Sub PromptRegExReplace()
Dim regEx As Object
Dim match As Object
Dim matches As Object
Dim rng As Range
Dim response As Integer
Dim replacementText As String
Set regEx = CreateObject("VBScript.RegExp")
regEx.Pattern = "([0-9])"
regEx.Global = True
' Get the current cursor position
Dim cursorPosition As Long
cursorPosition = Selection.Start
' Set the range to start from the cursor position until the end of the document
Set matches = regEx.Execute(ActiveDocument.Range(cursorPosition, ActiveDocument.Range.End).text)
replacementText = "$1abc"
For Each match In matches
Set rng = ActiveDocument.Range(match.FirstIndex + cursorPosition, match.FirstIndex + match.Length + cursorPosition)
rng.Select
response = MsgBox("Replace this instance?", vbYesNoCancel)
If response = vbYes Then
Application.ScreenUpdating = False
rng.text = regEx.replace(rng.text, replacementText)
Application.ScreenUpdating = True
ElseIf response = vbCancel Then
Exit Sub
End If
Next match
End Sub
|
|
#2
|
||||
|
||||
|
Perhaps AI is not as good as you thought? If the idea is to optionally replace numbers with a string then the following will do that from the cursor position:
Code:
Sub Macro1()
Dim oRng As Range
Dim sAsk As String
Const sFindText As String = "[0-9]{1,}"
Const sReplaceText As String = "$1abc"
Set oRng = Selection.Range
oRng.End = ActiveDocument.Range.End
With oRng.Find
.ClearFormatting
.Replacement.ClearFormatting
Do While .Execute(findText:=sFindText, _
MatchWildcards:=True, _
Forward:=True, _
Wrap:=wdFindStop) = True
oRng.Select
sAsk = MsgBox("Replace - " & vbCr & oRng.Text & vbCr + vbCr & _
"with - " & vbCr & sReplaceText, vbYesNo, _
"Replace Number")
If sAsk = vbCancel Then GoTo lbl_Exit
If sAsk = vbYes Then
oRng.Text = sReplaceText
End If
oRng.Collapse wdCollapseEnd
Loop
End With
lbl_Exit:
Set oRng = Nothing
Exit Sub
End Sub
__________________
Graham Mayor - MS MVP (Word) (2002-2019) Visit my web site for more programming tips and ready made processes www.gmayor.com |
|
#3
|
|||
|
|||
|
Hi gmayor
Thank you for replying. AI still needs a lot to deserve even the "I" in it. As I mentioned in my post, ([0-9]) and $1abc are only examples. What I actually need cannot be easily covered by wildcards. To simplify things, let's say that I want, with regex, to replace b([13579]*)c([13579]*)cd with b$1c$2c46d in instances that I choose. I can use the macro here, but this requires creating hundreds of strings! That's why I need to use regex. Last edited by East; 08-05-2023 at 06:46 AM. |
|
#4
|
|||
|
|||
|
I think something like that should work.
Code:
Sub PromptRegExReplace()
Dim regEx As Object
Dim match As Object
Dim matches As Object
Dim rng As Range
Dim response As Integer
Dim replacementText As String
Set regEx = CreateObject("VBScript.RegExp")
regEx.pattern = "([0-9])"
regEx.Global = True
' Get the current cursor position
Dim cursorPosition As Long
cursorPosition = Selection.Start
' Set the range to start from the cursor position until the end of the document
Set matches = regEx.Execute(ActiveDocument.Range(cursorPosition, ActiveDocument.Range.End).text)
replacementText = "$1abc"
Do While matches.Count > 0
Set match = matches(0)
Set rng = ActiveDocument.Range(match.FirstIndex + cursorPosition, match.FirstIndex + match.Length + cursorPosition)
rng.Select
response = MsgBox("Replace this instance?", vbYesNoCancel)
' Check the value that is returned by the MsgBox function
If response = vbYes Then
Application.ScreenUpdating = False
rng.text = regEx.replace(rng.text, replacementText)
Application.ScreenUpdating = True
' Update the cursor position after replacing the text
cursorPosition = rng.End
' No button moves without replacing
ElseIf response = vbNo Then
cursorPosition = rng.End
' Cancel button stops the macro
ElseIf response = vbCancel Then
Exit Sub
End If
' Update the matches collection after replacing the text
Set matches = regEx.Execute(ActiveDocument.Range(cursorPosition, ActiveDocument.Range.End).text)
Loop
End Sub
|
|
| Tags |
| prompt, regex, replacing |
|
|
Similar Threads
|
||||
| Thread | Thread Starter | Forum | Replies | Last Post |
| How to keep a list of search results | Jedothek | Word | 2 | 08-19-2020 07:22 AM |
| 2013 search results take a long time - they fill in as results in reverse date order | themookman | Outlook | 0 | 10-11-2013 12:01 PM |
Outlook search too many results
|
alexb123 | Outlook | 1 | 10-10-2013 09:53 AM |
| Search results disappearing | Emerogork | Office | 3 | 07-17-2011 03:52 PM |
| Instant Search's "Display search results as I type when possible" with Exchange | lwc | Outlook | 0 | 06-01-2011 01:56 AM |