Excel 执行工作簿时意外显示工作簿。在应用程序运行时关闭。可见=false

Excel 执行工作簿时意外显示工作簿。在应用程序运行时关闭。可见=false,excel,vba,Excel,Vba,关闭新工作簿时出现意外显示 我从命令行启动宏。 应用程序在工作簿中不可见。\u打开: Sub workbook_open() Application.Visible = False UserForm1.Show Application.Visible = True End Sub UserForm1包含一个按钮。 ->仅显示userform 按下按钮可启动以下代码: Sub UnexpectedDisplay() Dim NewBook As Workbo

关闭新工作簿时出现意外显示

我从命令行启动宏。
应用程序在工作簿中不可见。\u打开:

Sub workbook_open()

    Application.Visible = False
    UserForm1.Show
    Application.Visible = True

End Sub
UserForm1包含一个按钮。
->仅显示userform

按下按钮可启动以下代码:

Sub UnexpectedDisplay()

    Dim NewBook As Workbook
    Debug.Print "_______________"

    Application.Visible = False
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False

    Set NewBook = Workbooks.Add

    With NewBook
        .Title = "MyTitle"
        .Subject = "Display"
        .SaveAs Filename:="MyWorkbook"
    End With

    Debug.Print ActiveWorkbook.Name
    MsgBox "New workbook added"

    NewBook.Close SaveChanges:=True

    Debug.Print ActiveWorkbook.Name
    MsgBox "Workbook closed"

    Application.DisplayAlerts = True

End Sub
将显示第一个msgbox:“已添加新工作簿”
->仅显示msgbox

按“确定”

将显示第二个msgbox:“工作簿已关闭”
调试跟踪:

_______________   
MyWorkbook.xlsx   
MyMacroFile.xlsm   
->工作簿变得可见
(何时打开MyMacroFile.xlsm?。

->问题:如何避免此问题。

请尝试此代码

Sub TestInVis()

    Dim Wb As Workbook
    Dim Fn As String

    Fn = FileOpenName("Test")
    Application.ScreenUpdating = False
    Set Wb = Workbooks.Open(Fn)
    Wb.Windows(1).Visible = False
    Application.ScreenUpdating = True
End Sub
执行此操作之前,请将变量
Fn
设置为包含有效的文件名,并填写其路径。(我使用了一个名为
FileOpenName
的函数,该函数调用一个文件选择器对话框。)代码将打开指定的工作簿并隐藏其窗口,将以前显示的窗口保留在顶部

在我的测试中,
Open
操作没有重新恢复屏幕更新,但我不确定禁用它是否会有不同。打开工作簿时会出现短暂的闪烁,我认为在
屏幕更新=False
时不会太明显。但是,如果文件太大,它将被延长。无论如何,文件以不可见的方式打开,您可以通过指定给它的对象变量访问它

接下来,我用
工作簿测试了相同的过程。我所说的关于
Open
的内容同样适用,当然,除了新工作簿非常小之外。因此,更难判断
屏幕更新是否真的起作用。

请尝试此代码

Sub TestInVis()

    Dim Wb As Workbook
    Dim Fn As String

    Fn = FileOpenName("Test")
    Application.ScreenUpdating = False
    Set Wb = Workbooks.Open(Fn)
    Wb.Windows(1).Visible = False
    Application.ScreenUpdating = True
End Sub
执行此操作之前,请将变量
Fn
设置为包含有效的文件名,并填写其路径。(我使用了一个名为
FileOpenName
的函数,该函数调用一个文件选择器对话框。)代码将打开指定的工作簿并隐藏其窗口,将以前显示的窗口保留在顶部

在我的测试中,
Open
操作没有重新恢复屏幕更新,但我不确定禁用它是否会有不同。打开工作簿时会出现短暂的闪烁,我认为在
屏幕更新=False
时不会太明显。但是,如果文件太大,它将被延长。无论如何,文件以不可见的方式打开,您可以通过指定给它的对象变量访问它


接下来,我用
工作簿测试了相同的过程。我所说的关于
Open
的内容同样适用,当然,除了新工作簿非常小之外。因此,更难判断
屏幕更新
是否真的起作用。

打开工作簿的代码在哪里?此按钮是否关闭表单,因为
工作簿中的下一行是application.visible=true。它看起来是对的,因为activeworkbook将是调用代码的那个,您正在关闭newworkbook,所以在打开之前将其放在一起,然后看看它是什么?另一个工作簿本身是否打开另一个工作簿。Workbooks.Add方法使新工作簿成为活动工作簿。它将被分配到活动窗口,在该窗口中它将可见。要避免设置Application.screenUpdate=False,请添加新工作簿,隐藏ActiveWindow,然后重新启用ScreenUpdate。将显示以前的活动窗口。@Nathan_Sav:该按钮不会关闭窗体。它只启动意外的显示宏。按userform十字键退出应用程序。@Nathan_Sav:“另一个工作簿本身是否打开了另一个工作簿。”;NewBook不再打开工作簿。@Variatus:Application.ScreenUpdate=False在执行Workbooks.Add时丢失?打开工作簿的代码在哪里?此按钮是否关闭表单,因为
工作簿中的下一行是application.visible=true。它看起来是对的,因为activeworkbook将是调用代码的那个,您正在关闭newworkbook,所以在打开之前将其放在一起,然后看看它是什么?另一个工作簿本身是否打开另一个工作簿。Workbooks.Add方法使新工作簿成为活动工作簿。它将被分配到活动窗口,在该窗口中它将可见。要避免设置Application.screenUpdate=False,请添加新工作簿,隐藏ActiveWindow,然后重新启用ScreenUpdate。将显示以前的活动窗口。@Nathan_Sav:该按钮不会关闭窗体。它只启动意外的显示宏。按userform十字键退出应用程序。@Nathan_Sav:“另一个工作簿本身是否打开了另一个工作簿。”;NewBook不再打开工作簿。@Variatus:Application.ScreenUpdate=False在执行Workbooks.Add时丢失?