Скрытие приложения Excel во время выполнения - PullRequest
0 голосов
/ 26 сентября 2018

Я пытаюсь скрыть Excel во время длинного сценария, в котором я делаю некоторые операции по просмотру веб-страниц.Я могу просто скрыть приложение, проблема в том, что когда я изменяю .Visible обратно на True, я получаю еще 1-2 дополнительных приложения (только пустые оболочки Excel).Я предполагаю, что одна из них - моя PERSONAL.xlsb рабочая книга, но я не уверен, что другая - иногда я получаю одну дополнительную, иногда я получаю две.Единственный способ закрыть эти файлы оболочки - это завершить процесс EXCEL.EXE через диспетчер задач.

Я пытался скрыть только главное окно (Windows(1)), но безрезультатно (оно просто скрываетРабочая тетрадь, а не приложение):

Sub Test()

Windows(ThisWorkbook.Name).Visible = False

Application.Wait (Now + TimeValue("0:00:05"))

Windows(ThisWorkbook.Name).Visible = True

End Sub

Как я могу просто повторно отобразить мою главную рабочую книгу?

Пример кода:

Sub Test()

Application.Visible = False

Application.Wait (Now + TimeValue("0:00:05"))

Application.Visible = True

End Sub

enter image description here

Редактировать: это в Windows 7, Excel 2016

Редактировать 2: Запуск только Application.Visible = True сам по себе также дает мне эти два фантомных приложения.

Edit3: проблема определенно связана с тем, что макросы хранятся в файле PERSONAL.xlsb - когда я перехожу на новый компьютер и добавляю новый макрос в эту книгу, я могу воспроизвести проблему.Тем не менее, я все еще не уверен, как этого избежать ...

Диспетчер задач:

img1

Скрипт, который открывает Excelот Filemaker Pro:

Open URL [With dialog:Off; "C:\Users\Username\Desktop\TestFile.xlsm"]

Внутри TestFile.xlsm:

Private Sub Workbook_Open()

Application.Visible = False

'Refresh a query in the Excel workbook that is linked to Filemaker Pro

'Webscrape, webscrape, webscrape from a worksheet inside this Excel document
'to a hidden Internet Explorer Window (ewww, IE!)

Application.Wait (Now + TimeValue("0:00:05"))

Application.Visible = True

'Either close Excel completely or reload my main instance of Excel

End Sub

Я понял, что могу просто полностью выйти из Excel с Excel.Application.Quit, но я не решил, хочу ли я сразу выйти или перекрасить пользовательскую форму в Excel, которая суммирует процесс импорта

Ответы [ 3 ]

0 голосов
/ 04 октября 2018

Я также могу воспроизвести это поведение, но если установить для свойства Visible окна значение false, то оно будет решено.

Private Sub Workbook_Open()
Dim x As Workbook
With Application
    .Visible = False
    .Wait (Now + TimeValue("0:00:05"))
    .Visible = True
        For Each x In .Workbooks
            If x.Name = "PERSONAL.XLSB" Then 'maybe also other addins(?)
                x.Windows(1).Visible = True
                x.Windows(1).Visible = False 'toggle
                x.Saved = True 'for not getting save-alerts
            End If
        Next
End With
End Sub

Редактировать:

или изменить значение для каждого цикла на:

    For Each myAdd In AddIns
        myAdd.Installed = False
    Next myAdd

работает на моей стороне (но: при закрытии вы должны установить свои предыдущие установленные надстройки обратно в True)

0 голосов
/ 05 октября 2018

Если я вас правильно понял, вы хотите остаться невидимым для пользователя во время определенной операции, а затем снова появиться после ее завершения?

Если это так, взгляните на код, который я использовал для созданиямоё приложение на самом деле запускается с невидимым Excel с только определенной формой на шоу:

Когда пользователь закончил и хочет выйти из приложения, он нажимает командную кнопку cmdQuit.Код за этим заставит Excel снова появиться: Код вставлен ниже.Я надеюсь, что это поможет вам найти решение для вашей ситуации.

Примечания:
1. В идеале мы хотели бы сделать весь Excel невидимым!Таким образом, если на компьютере открыт только один экземпляр Excel, используйте Application.visible = true.Однако, возможно, что другие электронные таблицы открыты.Если это так, то скрыть только текущую рабочую книгу.Следовательно, ThisWorkbook.Windows(1).Visible = False используется после в блоке Else.

2. Как только Excel становится невидимым, мы загружаем наши формы.Это окна, которые обеспечивают интерфейс переднего плана для взаимодействия с пользователем.Таким образом, я могу создать правильное приложение из Excel практически без указания того, что Excel работает за кулисами.

3. Как только пользователь закончил, он нажимает кнопку выхода, которую я назвал cmdExit.Вы можете увидеть код согнуть эту кнопку ниже.Он выгружает формы графического интерфейса и делает Excel снова видимым для пользователя.Это похоже на то, чего вы хотите достичь.

Private Sub Workbook_Open()

    Stop

    ' Hide Excel...
'    ActiveWorkbook.Windows(1).Visible = False
    If Workbooks.Count < 2 Then
        Application.Visible = False
    Else
        ThisWorkbook.Windows(1).Visible = False
    End If

    Load frmMain
    frmMain.Show vbModal

End Sub


Private Sub cmdQuit_Click()

    'ThisWorkbook.Windows(1).Visible = True
    Application.Visible = True
    Unload frmMoreOccupationLines
    Unload Me

End Sub


Я думаю, что причина, по которой вы можете видеть более одной книги, может заключаться в том, что вы по неосторожности оставили предыдущие экземплярыExcel все еще открыт, но скрыт (невидим).Они не были выгружены и остаются в памяти.Имеет ли это смысл?Поэтому, когда вы делаете Application.visible=true, вы видите все предыдущие экземпляры, которые вы не правильно выполнили.Таким образом, решением для m может быть обеспечение правильной стратегии выгрузки и выхода в вашем коде.

Так что я думаю, что вы, возможно, ищете решение, как показано ниже:

Sub Test()
    If Workbooks.Count < 2 Then
        Application.Visible = False
    Else
        ThisWorkbook.Windows(1).Visible = False
    End If

    Application.Wait (Now + TimeValue("0:00:05"))

    If Workbooks.Count < 2 Then
        Application.Visible = True
    Else
        ThisWorkbook.Windows(1).Visible = True
    End If
End Sub


Private Sub cmdQuit_Click()
    Application.Visible = True
    'Unload Me
    Application.Quit
End Sub
0 голосов
/ 02 октября 2018

Мне удалось воспроизвести вашу проблему.Сначала я протестировал скрытие приложения без загрузки PERSONAL.xlsb, и оно работало нормально.Затем я загрузил PERSONAL.xlsb и получил то же поведение, что и вы: дополнительная оболочка Excel стала видимой после Application.Visible = True.

Я не уверен, почему иногда вы получаете две дополнительные оболочки, но, возможно, у вас естьдругой аддин (.xlam) загружен?Вы могли бы попытаться добавить некоторый код, чтобы сначала выгрузить все надстройки, но у меня есть альтернативное решение: почему бы просто не запустить новый экземпляр Excel, загрузить в него вашу книгу макросов и запустить макрос?Например, если ваша рабочая книга называется C: \ Book1.xlsb, а макрос в ней - «MyMacro», то создайте вторую рабочую книгу с кодом, который запустит Book1.Например:

Sub LaunchIt()

    Dim xlApp As Excel.Application
    Dim wb As Workbook

    Set xlApp = New Excel.Application

    With xlApp
        Set wb = .Workbooks.Open("C:\Book1.xlsb")
        .Run "'" & wb.Name & "'!MyMacro"
        wb.Close SaveChanges:=False
        .Quit
    End With

End Sub

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...