我有一个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将解决我的问题,但没有骰子。
答案 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