Word's Find/Replace Modal in VBA
I want to prepare and show the Find/Replace dialog. However, the following code shows the dialog in a modal status, and you can't get to the document text.
Any ideas how make it modeless, just like you get from Ctl-H?
Public Sub AutoFind()
On Error GoTo myErrorHandler
Selection.HomeKey Unit:=wdStory
Dim theDialog As dialog
Set theDialog = Application.Dialogs(wdDialogEditReplace)
theDialog.Find = "the"
theDialog.replace = "an"
theDialog.Show
End Sub
microsoft-word vba microsoft-word-2010 microsoft-word-2013
add a comment |
I want to prepare and show the Find/Replace dialog. However, the following code shows the dialog in a modal status, and you can't get to the document text.
Any ideas how make it modeless, just like you get from Ctl-H?
Public Sub AutoFind()
On Error GoTo myErrorHandler
Selection.HomeKey Unit:=wdStory
Dim theDialog As dialog
Set theDialog = Application.Dialogs(wdDialogEditReplace)
theDialog.Find = "the"
theDialog.replace = "an"
theDialog.Show
End Sub
microsoft-word vba microsoft-word-2010 microsoft-word-2013
add a comment |
I want to prepare and show the Find/Replace dialog. However, the following code shows the dialog in a modal status, and you can't get to the document text.
Any ideas how make it modeless, just like you get from Ctl-H?
Public Sub AutoFind()
On Error GoTo myErrorHandler
Selection.HomeKey Unit:=wdStory
Dim theDialog As dialog
Set theDialog = Application.Dialogs(wdDialogEditReplace)
theDialog.Find = "the"
theDialog.replace = "an"
theDialog.Show
End Sub
microsoft-word vba microsoft-word-2010 microsoft-word-2013
I want to prepare and show the Find/Replace dialog. However, the following code shows the dialog in a modal status, and you can't get to the document text.
Any ideas how make it modeless, just like you get from Ctl-H?
Public Sub AutoFind()
On Error GoTo myErrorHandler
Selection.HomeKey Unit:=wdStory
Dim theDialog As dialog
Set theDialog = Application.Dialogs(wdDialogEditReplace)
theDialog.Find = "the"
theDialog.replace = "an"
theDialog.Show
End Sub
microsoft-word vba microsoft-word-2010 microsoft-word-2013
microsoft-word vba microsoft-word-2010 microsoft-word-2013
asked Mar 2 '17 at 20:59
ForEachLoopForEachLoop
1154
1154
add a comment |
add a comment |
2 Answers
2
active
oldest
votes
It looks like modal is the only behavior by design, but there is a work-around:
CommandBars.FindControl(ID).Execute
With the proper ID, this is analogous to hitting the button with your mouse to open the dialog.
I have never used this myself except to confirm it works in v2010, and my instinct says one ought look for a way to confirm or derive the ID number (or perhaps there's a constant one can use) since this is a hard-coded "magic number" that may change from version to version.
In Word 2010, which I have handy, "Find" is ID:=141, "Replace" is ID:=313.
So you can set up a "programmatic" search, and then call use the above CommandBars method to open the dialog. It ought to be populated the way you want it and ought to be non-modal.
Sub TestMacro()
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = "test find field"
.Replacement.Text = "test replace field"
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
CommandBars.FindControl(ID:=313).Execute
end sub
Of course, non-modal also means code execution continues immediately.
add a comment |
This was my hacky solution:
SendKeys "^h" ' Hack to obtain "Dialogs(wdDialogEditReplace).Show" modelessly.
' MS Disclaimer: SendKeys is unreliable as to there being no certainty as to where focus is when called.
add a comment |
Your Answer
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "3"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fsuperuser.com%2fquestions%2f1184605%2fwords-find-replace-modal-in-vba%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
2 Answers
2
active
oldest
votes
2 Answers
2
active
oldest
votes
active
oldest
votes
active
oldest
votes
It looks like modal is the only behavior by design, but there is a work-around:
CommandBars.FindControl(ID).Execute
With the proper ID, this is analogous to hitting the button with your mouse to open the dialog.
I have never used this myself except to confirm it works in v2010, and my instinct says one ought look for a way to confirm or derive the ID number (or perhaps there's a constant one can use) since this is a hard-coded "magic number" that may change from version to version.
In Word 2010, which I have handy, "Find" is ID:=141, "Replace" is ID:=313.
So you can set up a "programmatic" search, and then call use the above CommandBars method to open the dialog. It ought to be populated the way you want it and ought to be non-modal.
Sub TestMacro()
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = "test find field"
.Replacement.Text = "test replace field"
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
CommandBars.FindControl(ID:=313).Execute
end sub
Of course, non-modal also means code execution continues immediately.
add a comment |
It looks like modal is the only behavior by design, but there is a work-around:
CommandBars.FindControl(ID).Execute
With the proper ID, this is analogous to hitting the button with your mouse to open the dialog.
I have never used this myself except to confirm it works in v2010, and my instinct says one ought look for a way to confirm or derive the ID number (or perhaps there's a constant one can use) since this is a hard-coded "magic number" that may change from version to version.
In Word 2010, which I have handy, "Find" is ID:=141, "Replace" is ID:=313.
So you can set up a "programmatic" search, and then call use the above CommandBars method to open the dialog. It ought to be populated the way you want it and ought to be non-modal.
Sub TestMacro()
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = "test find field"
.Replacement.Text = "test replace field"
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
CommandBars.FindControl(ID:=313).Execute
end sub
Of course, non-modal also means code execution continues immediately.
add a comment |
It looks like modal is the only behavior by design, but there is a work-around:
CommandBars.FindControl(ID).Execute
With the proper ID, this is analogous to hitting the button with your mouse to open the dialog.
I have never used this myself except to confirm it works in v2010, and my instinct says one ought look for a way to confirm or derive the ID number (or perhaps there's a constant one can use) since this is a hard-coded "magic number" that may change from version to version.
In Word 2010, which I have handy, "Find" is ID:=141, "Replace" is ID:=313.
So you can set up a "programmatic" search, and then call use the above CommandBars method to open the dialog. It ought to be populated the way you want it and ought to be non-modal.
Sub TestMacro()
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = "test find field"
.Replacement.Text = "test replace field"
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
CommandBars.FindControl(ID:=313).Execute
end sub
Of course, non-modal also means code execution continues immediately.
It looks like modal is the only behavior by design, but there is a work-around:
CommandBars.FindControl(ID).Execute
With the proper ID, this is analogous to hitting the button with your mouse to open the dialog.
I have never used this myself except to confirm it works in v2010, and my instinct says one ought look for a way to confirm or derive the ID number (or perhaps there's a constant one can use) since this is a hard-coded "magic number" that may change from version to version.
In Word 2010, which I have handy, "Find" is ID:=141, "Replace" is ID:=313.
So you can set up a "programmatic" search, and then call use the above CommandBars method to open the dialog. It ought to be populated the way you want it and ought to be non-modal.
Sub TestMacro()
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
With Selection.Find
.Text = "test find field"
.Replacement.Text = "test replace field"
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
CommandBars.FindControl(ID:=313).Execute
end sub
Of course, non-modal also means code execution continues immediately.
answered Mar 2 '17 at 21:45
YorikYorik
2,6341510
2,6341510
add a comment |
add a comment |
This was my hacky solution:
SendKeys "^h" ' Hack to obtain "Dialogs(wdDialogEditReplace).Show" modelessly.
' MS Disclaimer: SendKeys is unreliable as to there being no certainty as to where focus is when called.
add a comment |
This was my hacky solution:
SendKeys "^h" ' Hack to obtain "Dialogs(wdDialogEditReplace).Show" modelessly.
' MS Disclaimer: SendKeys is unreliable as to there being no certainty as to where focus is when called.
add a comment |
This was my hacky solution:
SendKeys "^h" ' Hack to obtain "Dialogs(wdDialogEditReplace).Show" modelessly.
' MS Disclaimer: SendKeys is unreliable as to there being no certainty as to where focus is when called.
This was my hacky solution:
SendKeys "^h" ' Hack to obtain "Dialogs(wdDialogEditReplace).Show" modelessly.
' MS Disclaimer: SendKeys is unreliable as to there being no certainty as to where focus is when called.
answered Jan 16 at 23:30
AndrewAndrew
1
1
add a comment |
add a comment |
Thanks for contributing an answer to Super User!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fsuperuser.com%2fquestions%2f1184605%2fwords-find-replace-modal-in-vba%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown