vba - 在子例程中调用的子例程中的 Application.ScreenUpdating

标签 vba excel

这实际上并不是一个特定于代码的问题,而是更多地满足好奇心(并避免 future 的问题),所以我认为 SO 是一个合适的地方来问它。

我的问题的基础是:VBA 如何处理 Application.ScreenUpdating以及来自在子例程中调用的子例程的其他此类调用?

举个例子,我有一个方法BackupData这只是非常快速地从事件表中获取数据并将其复制到具有相同名称并附加“备份”的隐藏表(我使用它为我的用户提供“撤消”宏,因为您不能使用常规方法撤消子程序的 Action )。在 BackupData , 我切换 ScreenUpdating为 False 和 True 只是为了使操作对最终用户完全隐藏。有问题的问题是因为我让用户可以自由访问运行宏,但也选择从其他也切换 ScreenUpdating 的宏中调用它。属性(property)。

所以,如果 BackupData在宏切换 ScreenUpdating 后从宏中调用属性为 False,将 BackupData调用将属性设置为 True 会覆盖“外部”例程的调用,从而使该宏的其余部分在屏幕更新时运行?

现在,显然,我知道这个问题有很多简单的解决方案。我可以在 BackupData 中存储一个 bool 值检查是否 ScreenUpdating已经为假,如果是这种情况,则不要将其返回为真,或者我可以简单地重复 ScreenUpdating = False运行后调用BackupData , 或者我什至可以写一个与 BackupData 相同的子这不会切换我从这些其他宏内部运行的值,但是这个问题的重点不是找到那个解决方案。

我想这更多是关于 VBA 如何与嵌套子例程调用一起工作的问题,但我希望这里的某个人能够通过关于 VBA 是否会为我处理这个问题或者我是否需要的明确答案来满足我的好奇心使用上述解决方法之一。

TL;博士

我不是在寻找解决方案,因为我已经制定了很多选择。我只是好奇是否有人确切知道 VBA 如何处理这些类型的调用(甚至不仅特定于 ScreenUpdating 属性,还包括其他应用程序属性)

最佳答案

Application.ScreenUpdating是应用程序的设置,在设置和取消设置时全局激活/停用。

您的假设是正确的,如果您在子程序中将其设置为 False,那么该程序会调用 BackupData再次将其设置为假,然后在将范围返回给调用者之前将其设置为真,ScreenUpdating然后对于调用子例程的其余部分为 True。

将其视为具有全局范围的变量;无论在哪里设置,该值都是全局设置的。它为 Application 全局设置。 level,它是在程序实例中打开的所有工作簿的父对象(在本例中为 excel.exe)。设置它会影响实例中的所有工作簿;但如果你有另一个 excel.exe进程正在运行,它不会影响该实例中的工作簿。

关于vba - 在子例程中调用的子例程中的 Application.ScreenUpdating,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38122480/

相关文章:

VBA 最小化 Excel 中的功能区

excel - 错误处理不处理

excel - 如何禁用 Excel 上下文菜单项

excel - 使用 VBA 代码 Ping IP 地址并在 Excel 中返​​回结果

arrays - VBA 停止使用临时范围

vba - 为什么 VBA.Collection.Count 是一种方法

excel - 在VBA中提取字符串的最后两个单词

regex - Excel中的表达式语法?

VBA代码获取给定日期的周数

vba - 在 Excel-VBA 中为整列添加撇号