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