Проблема с кодом VBA MsgBox с опцией Да / Нет - PullRequest
0 голосов
/ 15 марта 2020

У меня проблема с моим кодом, поэтому я хочу, чтобы при нажатии кнопки Да открывался документ Word, созданный в другом модуле. Я использовал следующий код для этого;

Option Explicit
Sub Review_Report_Open()
Dim Sheet5 As Worksheet
Dim Status As VbMsgBoxResult
Dim fileName As String
Dim WordDoc, WordApp As Object

Set Sheet5 = Sheets(5)

Sheets(5).Activate

Status = MsgBox("Do you want to View the Report?", vbQuestion + vbYesNo + vbDefaultButton1, "Review Report")

fileName = ThisWorkbook.Path & "\Reports" & Sheets("4. Word Doc").Range("H9").Value & "_" & ".docx"

If Status <> vbYes Then Exit Sub

'Open Word Template
    On Error Resume Next 'If Word is already running
    Set WordApp = GetObject("Word.Application")
    If Err.Number <> 0 Then
    'Launch a new instance of Word
    Err.Clear
    'On Error GoTo Error_Handler
    Set WordApp = CreateObject("Word.Application") 'launches word application
    WordApp.Visible = True 'Make the application visible to the user
    Documents.Open fileName

End If
End Sub

У меня очень странная проблема: код работает только в том случае, если он запускается дважды, один запускается, когда ничего не происходит, но если вы запускаете его снова, ничего не делая, он делает то, что должен !

Я понятия не имею, почему это происходит, если кто-то может пролить свет, который был бы великолепен.

Ответы [ 2 ]

0 голосов
/ 15 марта 2020

Ваш код хорошо работает с точки зрения поведения «MsgBox». Вам нужно правильно объявить свои переменные и правильно использовать их.

Затем вы должны найти существующий сеанс Word и открыть новый, если не любой. Рабочий фрагмент кода должен выглядеть следующим образом:

Sub Review_Report_Open()
Dim Sheet5 As Worksheet, boolFound As Boolean
Dim Status As VbMsgBoxResult, fileName As String
Dim WordDoc As Object, WordApp As Object

Set Sheet5 = Sheets(5)

Sheets(5).Activate

Status = MsgBox("Do you want to View the Report?", vbQuestion + vbYesNo + vbDefaultButton1, "Review Report")

fileName = ThisWorkbook.path & "\Reports" & Sheets("4. Word Doc").Range("H9").value & "_" & ".docx"

 If Status <> vbYes Then Exit Sub
    'Looking for the Word open session:
    On Error Resume Next
    Set WordApp = GetObject(, "Word.Application")
    If Err.Number <> 0 Then
        Err.Clear: On Error GoTo 0
        boolFound = True
    End If
    On Error GoTo 0 'mandatory to avoid VBA surprises
    If Not boolFound Then
        Set WordApp = CreateObject("Word.Application") 'create a new session
        WordApp.Visible = True
    End If
    Documents.Open fileName
    'Do what is to be done...
 End If
End Sub

Код не проверен по понятным причинам, я думаю. Он пытается логически исправить вещи, плохо используемые в вашем коде вопроса ...

0 голосов
/ 15 марта 2020

Ваш код очень неточный. Чтобы решить эту проблему, вы должны сначала ввести точность.

  1. Dim Sheet5 As Worksheet . Sheet5 является значением по умолчанию CodeName. Это имя Excel по умолчанию дает рабочему листу. Мы не знаем, существует ли лист с этим CodeName в вашей книге. Я думаю, что вряд ли кто-нибудь знает, будет ли Excel избегать присвоения этого имени новому листу, если вы присвоите это же имя переменной объекта. «Лист5» - не очень описательное имя. Найдите имя, которое может служить вам лучше, и которое не несет такой же балласт.
  2. Set Sheet5 = Sheets(5). Sheet(5) выглядит как CodeName. Если у вас есть лист с таким именем, синтаксис должен быть Set Sheet5 = Worksheets("Sheet(5)"). Я предлагаю вам прочитать свойства CodeName и tab Name и избегать использования той же системы создания имен generi c, как в Excel. То есть, если вы не можете придумать имена, которые помогут вам понять ваш собственный код.
  3. Documents.Open fileName - это команда из библиотеки приложения Word. Вам необходимо создать экземпляр приложения Word, чтобы успешно открыть в нем документ. Поскольку вы говорите, что ваш код работает каждый раз, кажется, что такой объект плавает в фоновом режиме. Вам необходимо объявить его в рамках своего кода, чтобы получить контроль над ним.
  4. Открытие документа Word не обязательно означает, что Excel закроется. На самом деле, неясно, работает ли предлагаемый вами код в Excel или Word. По своему названию это выглядит как процедура события. Поскольку вы не даете никаких знаний по этому вопросу, мы можем только догадываться. Пожалуйста, уточните свой вопрос по этому поводу.
  5. В Excel действительно есть одно активное окно, как и в Word. При открытии нового документа этот документ получает активное окно этим приложением. Итак, вы открываете документ Word, активное окно приложения Word будет занято новым документом. Но ваш код не сообщает, что должно происходить с активным окном Excel, которое до этого момента было активным окном. Вполне возможно, что ваш код все делает правильно - только он не управляет активным окном, и поэтому вновь открытый документ Word вежливо остается в фоновом режиме. Вы можете проверить это, если у вас есть переменный объект для приложения Word, который вы можете запросить об именах открытых документов и статусе windows.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...