Word's Find/Replace Modal in VBA












1















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









share|improve this question



























    1















    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









    share|improve this question

























      1












      1








      1








      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









      share|improve this question














      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






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Mar 2 '17 at 20:59









      ForEachLoopForEachLoop

      1154




      1154






















          2 Answers
          2






          active

          oldest

          votes


















          2














          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.






          share|improve this answer































            0














            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.





            share|improve this answer























              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
              });


              }
              });














              draft saved

              draft discarded


















              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









              2














              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.






              share|improve this answer




























                2














                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.






                share|improve this answer


























                  2












                  2








                  2







                  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.






                  share|improve this answer













                  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.







                  share|improve this answer












                  share|improve this answer



                  share|improve this answer










                  answered Mar 2 '17 at 21:45









                  YorikYorik

                  2,6341510




                  2,6341510

























                      0














                      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.





                      share|improve this answer




























                        0














                        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.





                        share|improve this answer


























                          0












                          0








                          0







                          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.





                          share|improve this answer













                          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.






                          share|improve this answer












                          share|improve this answer



                          share|improve this answer










                          answered Jan 16 at 23:30









                          AndrewAndrew

                          1




                          1






























                              draft saved

                              draft discarded




















































                              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.




                              draft saved


                              draft discarded














                              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





















































                              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







                              Popular posts from this blog

                              How to make a Squid Proxy server?

                              Is this a new Fibonacci Identity?

                              19世紀