Скрытие приложения Excel во время выполнения

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

Edit2: запуск только 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, но я не решил, хочу ли я сразу же выйти или перерисовать UserForm в Excel, который суммирует процесс импорта

Ответы

Ответ 1

Я смог воспроизвести вашу проблему. Сначала я протестировал скрытие приложения без загрузки файла 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 не отображается по умолчанию, поэтому нет необходимости настраивать видимость. Я проверил это, и это сработало для меня.

Ответ 2

Я также могу воспроизвести это поведение, но установка 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)

Ответ 3

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

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

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

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

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

3. Как только пользователь закончит, он нажмет кнопку выхода, которую я назвал cmdExit. Вы можете увидеть, как код сгибает эту кнопку ниже. Он выгружает GUI-формы и делает 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