子程序中调用子程序中的Application.ScreenUpdating
这不是一个真正的代码问题,而是更多的东西来满足好奇心(避免未来的问题),所以我认为这是一个合适的地方去问问题。
我的问题的基础是这样的:VBA如何处理Application.ScreenUpdating
和其他这样的子程序调用子程序调用?
为了说明一个例子,我有一个方法BackupData
,它只是非常快速地从活动页面中获取数据,并将其复制到一个隐藏表单中,名称相同,并且附加了“Backup”(我使用这个方法为我的用户提供“撤消”macros,因为您不能使用常规方法来撤消子例程的操作)。 在BackupData
,我将ScreenUpdating
切换为False和True,以便操作对最终用户完全隐藏。 有问题的问题来自于这样一个事实,即我允许用户自由访问运行macros,而且还可以从其他也触发ScreenUpdating
属性的macros中调用它。
因此,如果在macros已将ScreenUpdating
属性切换为False 之后 ,从macros内调用BackupData
, BackupData
调用将属性设置为True将覆盖“外部”例程的调用,从而使该macros的其余部分与屏幕一起运行更新?
现在,显然,我知道这个问题有很多简单的解决scheme。 我可以在BackupData
中存储一个布尔值,检查ScreenUpdating
是否已经是false,如果是这种情况,不会返回true,或者我可以总是在运行BackupData
之后重复ScreenUpdating = False
,或者我甚至可以写一个相同的子到BackupData
不切换我从这些其他macros内运行的值,但这个问题的重点是找不到解决scheme。
我想这更像是一个VBA如何与嵌套的子程序调用一起工作的问题,但是我希望这里的某个人能够用一个明确的答案来满足我的好奇心,就是VBA是否会为我处理这个问题,或者如果我需要使用其中一种解决方法。
TL; DR
我没有寻找解决方法,因为我已经有很多select。 我只是好奇,如果有人确切知道VBA如何处理这些types的调用(甚至不仅仅是特定于ScreenUpdating
属性,但其他应用程序属性)
Application.ScreenUpdating
是Application.ScreenUpdating
的一个设置,在设置和取消设置时全局激活/取消激活。
你的推定是正确的,如果你在一个子程序中设置了False,那么这个例程会调用BackupData
,它将其设置为false,然后在将范围返回给调用者之前将其设置为True,对于调用子例程的其余部分, ScreenUpdating
则为True。
把它看作是一个全局范围的variables; 无论在哪里设置,该值都是全局设置的。 它是为Application
级别全局设置的,这是在程序实例中打开的所有工作簿的父对象(在本例中为excel.exe
)。 设置它会影响实例中的所有工作簿; 但如果您有另一个excel.exe
进程正在运行,则不会影响该实例中的工作簿。
这是简单的使用这样的东西。 它将简单地保存以前的屏幕更新状态,而不是将屏幕更新设置为假,并且当您想要设置屏幕更新时,它将从备份中恢复。 所以如果你已经把屏幕更新为FALSE,那么它将会是false。
Dim previousScreenUpdating as boolean previousScreenUpdating = application.screenUpdating application.screenUpdating = false // your code application.screenUpdating = previousScreenUpdating