Workbook.Activate 方法行为异常

Workbook.Activate method acting strangely

我有一个 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

如果我开始 运行 该过程时有一个新的空白工作簿处于活动状态,当代码终止时该工作簿仍然是活动工作簿,但上面的两个打印语句都表明目标 wbk 实际上是活动的。但是,如果我使用断点并单步执行 wbk.Activate,目标 wbk 将按预期激活。工作簿和工作表对象都可用,没有错误。知道为什么 Workbook.Activate 在执行期间没有按预期表现吗?我希望打开屏幕更新可以解决我的问题,但没有成功。

@barX 他不依赖 ActiceWorkbook 代码,他只是检查它是否正常工作....

顺便说一句 Welcome to the Excel 2013 SDI bug!

也许遵循 initializing/using 用户表单的正确方法会有所帮助。在 Userform.Show

上查看 Mathieu 的 RubberDuck 文章

在相关说明中,也许在关闭之前更改表单的父 Window 句柄也可能有效。参见 Keeping Userforms On Top Of SDI Windows In Excel 2013 And Up

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

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