Скрытие приложения 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
Изменение: это в Windows 7, Excel 2016
Edit2: запуск только Application.Visible = True
сам по себе также дает мне эти два фантомных приложения.
Edit3: проблема, безусловно, связана с тем, что макросы хранятся в файле PERSONAL.xlsb
- когда я перехожу на новый компьютер и добавляю новый макрос в эту книгу, я могу воспроизвести проблему. Тем не менее, я все еще не уверен, как этого избежать...
Диспетчер задач:
Скрипт, который открывает 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