Workbook.Activate方法行为异常

时间:2018-06-12 19:23:24

标签: excel vba excel-vba userform

我有一个Excel加载项,运行一个过程,如果不满足某个条件,则显示OKOnly MsgBox,并尝试关闭用户窗体,激活特定工作簿并终止代码执行。在UserForm_Terminate()事件中,我有:

Private Sub UserForm_Terminate()

    Debug.Print ActiveWorkbook.Name
    Application.ScreenUpdating = True
    wbk.Activate
    sht.Activate
    Debug.Print ActiveWorkbook.Name
    End

End Sub

如果我在新的空白工作簿处于活动状态时开始运行该过程,则当代码终止时该工作簿仍然是活动工作簿,但上面的两个print语句都表明目标wbk实际上是活动的。但是,如果我使用断点并逐步执行wbk.Activate,则会按预期激活目标wbk。工作簿和工作表对象都可用,并且没有错误。任何想法为什么Workbook.Activate在执行过程中表现不如预期?我预计转换screenupdating将解决我的问题,但没有骰子。

2 个答案:

答案 0 :(得分:1)

@barX他不依赖于ActiceWorkbook代码,他只是检查它是否有效......

BTW Welcome to the Excel 2013 SDI bug!

也许遵循初始化/使用Userform的正确方法会有所帮助。请参阅Userform.Show

上的Mathieu的RubberDuck文章

在相关的说明中,也许在关闭之前更改窗体的父窗口句柄也可以。见Keeping Userforms On Top Of SDI Windows In Excel 2013 And Up

答案 1 :(得分:0)

我不确定SDI错误是否是我的问题,但它确实引导我回答(感谢@Profex)。我无法重现该错误,并且我的过程中还有另一条路径以相同的Userform_Terminate()事件结束, 重新激活目标wbk,但我无法确定导致什么原因不同的功能。尽管如此,该问题的一个解决方案是隐藏然后显示活动窗口,在这种情况下就足够了,但在许多情况下可能并不理想:

Private Sub UserForm_Terminate()

    Dim win As Window

    wbk.Activate
    sht.Activate

    Set win = Application.ActiveWindow
    win.visible = False
    win.visible = True

    End

End Sub