子程序中调用子程序中的Application.ScreenUpdating

这不是一个真正的代码问题,而是更多的东西来满足好奇心(避免未来的问题),所以我认为这是一个合适的地方去问问题。

我的问题的基础是这样的:VBA如何处理Application.ScreenUpdating和其他这样的子程序调用子程序调用?

为了说明一个例子,我有一个方法BackupData ,它只是非常快速地从活动页面中获取数据,并将其复制到一个隐藏表单中,名称相同,并且附加了“Backup”(我使用这个方法为我的用户提供“撤消”macros,因为您不能使用常规方法来撤消子例程的操作)。 在BackupData ,我将ScreenUpdating切换为False和True,以便操作对最终用户完全隐藏。 有问题的问题来自于这样一个事实,即我允许用户自由访问运行macros,而且还可以从其他也触发ScreenUpdating属性的macros中调用它。

因此,如果macros已将ScreenUpdating属性切换为False 之后 ,从macros内调用BackupDataBackupData调用将属性设置为True将覆盖“外部”例程的调用,从而使该macros的其余部分与屏幕一起运行更新?

现在,显然,我知道这个问题有很多简单的解决scheme。 我可以在BackupData中存储一个布尔值,检查ScreenUpdating是否已经是false,如果是这种情况,不会返回true,或者我可以总是在运行BackupData之后重复ScreenUpdating = False ,或者我甚至可以写一个相同的子到BackupData不切换我从这些其他macros内运行的值,但这个问题的重点是找不到解决scheme。

我想这更像是一个VBA如何与嵌套的子程序调用一起工作的问题,但是我希望这里的某个人能够用一个明确的答案来满足我的好奇心,就是VBA是否会为我处理这个问题,或者如果我需要使用其中一种解决方法。

TL; DR

我没有寻找解决方法,因为我已经有很多select。 我只是好奇,如果有人确切知道VBA如何处理这些types的调用(甚至不仅仅是特定于ScreenUpdating属性,但其他应用程序属性)

Application.ScreenUpdatingApplication.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