1

Я хочу подготовить и показать диалог поиска / замены. Однако следующий код показывает диалог в модальном состоянии, и вы не можете получить доступ к тексту документа.

Любые идеи, как сделать его немодальным, как вы получаете от 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

2 ответа2

2

Похоже, что модальное поведение - это единственное поведение, но есть обходной путь:

CommandBars.FindControl(ID).Execute

При правильном идентификаторе это аналогично нажатию кнопки мышью, чтобы открыть диалоговое окно.

Я никогда не использовал это сам, кроме как для подтверждения того, что это работает в v2010, и мой инстинкт говорит, что нужно искать способ подтвердить или получить идентификационный номер (или, возможно, есть константа, которую можно использовать), так как это жестко закодированное номер ", который может меняться от версии к версии.

В Word 2010, который мне удобен, "Найти" - это ID:= 141, "Заменить" - это ID:= 313.

Таким образом, вы можете настроить "программный" поиск, а затем вызвать, используя вышеуказанный метод CommandBars, чтобы открыть диалоговое окно. Он должен быть заполнен так, как вы хотите, и должен быть немодальным.

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

Конечно, немодальное также означает, что выполнение кода продолжается немедленно.

0

Это было мое хакерское решение:

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.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .