在运行时隐藏Excel应用程序

时间:2018-09-26 18:34:55

标签: excel vba excel-vba

我试图在一个长脚本中隐藏Excel,在该脚本中进行一些网络爬取。我可以很好地隐藏应用程序,问题是当我将.Visible改回True时,我会得到1-2个其他应用程序(只是空的Excel外壳)。我猜其中的一个是我的PERSONAL.xlsb工作簿,但是我不确定另一个是什么-有时我多了一个,有时又得到了两个。我可以关闭这些Shell文件的唯一方法是通过任务管理器结束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

从Filemaker Pro中打开Excel的脚本:

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.Application.Quit完全退出Excel,但是我还没有决定是否要立即退出或重新绘制Excel中的UserForm来总结导入过程

3 个答案:

答案 0 :(得分:3)

我能够重现您的问题。首先,我测试了在未加载PERSONAL.xlsb的情况下隐藏应用程序的情况,并且工作正常。然后,我加载了PERSONAL.xlsb并获得了与您相同的行为:在Application.Visible = True之后,一个额外的Excel Shell变得可见。

我不确定为什么有时会增加两个shell,但是也许您又加载了另一个插件(.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实例不可见,因此无需设置可见性。我对其进行了测试,并且对我有用。

答案 1 :(得分:0)

我也可以重现此行为,但是将窗口的“可见性”设置为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)

答案 2 :(得分:0)

如果我对您的理解正确,那么您希望在特定操作期间对用户不可见,然后在该操作完成后重新出现吗?

如果是这样,那么请看一下我用来使我的应用程序实际上以不可见的Excel开头的代码,并且只显示特定的表格:

当用户完成并希望退出该应用程序时,他按cmdQuit命令按钮。其背后的代码将使Excel重新出现:下面粘贴的代码。我希望这有助于激发您找到适合您情况的解决方案。

注释:
1.理想情况下,我们希望使整个excel不可见!因此,如果计算机上仅打开一个一个 Excel实例,则使用Application.visible = true。但是,可能其他电子表格已打开。如果是这种情况,则仅隐藏当前工作簿。因此,在ThisWorkbook.Windows(1).Visible = False块之后使用Else

2.一旦使Excel变得不可见,我们就会加载表单。这些是提供与用户交互的前端GUI的窗口。这样,我几乎可以从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