Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 在子例程中调用的子例程中的Application.ScreenUpdate_Vba_Excel - Fatal编程技术网

Vba 在子例程中调用的子例程中的Application.ScreenUpdate

Vba 在子例程中调用的子例程中的Application.ScreenUpdate,vba,excel,Vba,Excel,这实际上不是一个特定于代码的问题,但更多的是为了满足好奇心和避免将来的问题,所以我认为这将是一个合适的问题 我的问题的基础是:VBA如何处理Application.ScreenUpdating和来自在子例程中调用的子例程的其他此类调用 为了举例说明,我有一个backupdatea方法,它可以非常快速地从activesheet中获取数据,并将其复制到一个隐藏的工作表中,并附加相同的名称和备份。我使用这个方法为我的用户提供一个Undo宏,因为您不能使用常规方法来撤销子例程的操作。在BackUpdat

这实际上不是一个特定于代码的问题,但更多的是为了满足好奇心和避免将来的问题,所以我认为这将是一个合适的问题

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

为了举例说明,我有一个backupdatea方法,它可以非常快速地从activesheet中获取数据,并将其复制到一个隐藏的工作表中,并附加相同的名称和备份。我使用这个方法为我的用户提供一个Undo宏,因为您不能使用常规方法来撤销子例程的操作。在BackUpdatea中,我将ScreenUpdate切换为False和True,以便对最终用户完全隐藏操作。这个问题产生于这样一个事实:我允许用户自由运行宏,但也选择从其他宏调用它,这些宏也会切换ScreenUpdate属性

因此,如果在宏将ScreenUpdate属性切换为False后从宏中调用BackUpdatea,那么将属性设置为True的BackUpdatea调用是否会覆盖外部例程的调用,从而使该宏的其余部分在屏幕更新打开的情况下运行

现在,很明显,我知道这个问题有很多简单的解决方案。我可以在BackUpdatea中存储一个布尔值,检查ScreenUpdate是否已经为false,如果是这样,则不会将其返回true,或者我可以在运行BackUpdatea后始终重复ScreenUpdate=false调用,或者我甚至可以为BackUpdatea编写一个相同的子函数,它不会切换我在这些其他宏中运行的值,但问题的关键不是找到解决方案

我想这更多的是一个关于VBA如何处理嵌套子例程调用的问题,但我希望这里的人能够用一个明确的答案来满足我的好奇心,即VBA是否会为我处理这个问题,或者我是否需要使用一个受影响的变通方法

TL;博士
我不是在寻找一个变通解决方案,因为我已经找到了很多选择。我只是好奇,是否有人确切地知道VBA是如何处理这类调用的,不仅仅是特定于ScreenUpdate属性,还有其他应用程序属性

这很简单,请使用类似的东西。它将简单地保存屏幕更新的前一个状态,而不是将屏幕更新设置为false,当您想将屏幕更新设置回原处时,它将从备份中恢复。因此,如果您已经将屏幕更新设置为FALSE,那么在更新之后将为FALSE

Dim previousScreenUpdating as boolean
previousScreenUpdating = application.screenUpdating

application.screenUpdating = false

// your code

application.screenUpdating = previousScreenUpdating

这很简单,使用类似的东西。它将简单地保存屏幕更新的前一个状态,而不是将屏幕更新设置为false,当您想将屏幕更新设置回原处时,它将从备份中恢复。因此,如果您已经将屏幕更新设置为FALSE,那么在更新之后将为FALSE

Dim previousScreenUpdating as boolean
previousScreenUpdating = application.screenUpdating

application.screenUpdating = false

// your code

application.screenUpdating = previousScreenUpdating
Application.ScreenUpdate是应用程序的一种设置,在设置和取消设置时全局激活/停用

您的假设是正确的,如果您在子例程中将其设置为False,则该例程调用backupdatea,后者再次将其设置为False,然后在将作用域返回给调用方之前将其设置为True,那么对于调用子例程的其余部分,ScreenUpdate则为True

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

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

您的假设是正确的,如果您在子例程中将其设置为False,则该例程调用backupdatea,后者再次将其设置为False,然后在将作用域返回给调用方之前将其设置为True,那么对于调用子例程的其余部分,ScreenUpdate则为True


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

如果您完整阅读了我的问题,您将看到我已经建议将其作为解决方案。也许这不是提出问题的正确地方,但我正在寻找VBA默认实践性质的答案,而不是解决方案。如果您全面阅读我的问题,您会发现我已经建议将其作为解决方案。也许这不是问这个问题的好地方,但我正在寻找一个答案
r至于VBA默认做法的性质,不是一个变通解决方案谢谢,Dave。将其视为具有全球范围是看待它的一个好方法。如果允许,将此解决方案标记为正确。它不仅仅是一个全局变量,因为它也会影响其他工作簿,而全局变量不会。同意-正如我试图解释的,可能还不够清楚,它是作为工作簿对象父对象的应用程序的全局设置。因此,它适用于在该Excel.exe实例中打开的所有工作簿。如果您打开了第二个Excel.exe实例,则其中一个实例中的设置不会影响另一个实例中的设置…谢谢,Dave。将其视为具有全球范围是看待它的一个好方法。如果允许,将此解决方案标记为正确。它不仅仅是一个全局变量,因为它也会影响其他工作簿,而全局变量不会。同意-正如我试图解释的,可能还不够清楚,它是作为工作簿对象父对象的应用程序的全局设置。因此,它适用于在该Excel.exe实例中打开的所有工作簿。如果您打开了第二个Excel.exe实例,其中一个实例中的设置不会影响另一个实例中的设置…最常见的猜测是单词application,指的是整个应用程序,不是吗?因此,子例程在作用域中的位置无关紧要,因为您正在调用应用程序范围内的方法,它适用于所有工作簿、所有子例程或父例程……最常见的猜测是单词application,指的是整个应用程序,不是吗?因此,子例程在作用域中的位置无关紧要,因为您正在调用应用程序范围内的方法,它适用于所有工作簿、所有子例程或父例程。。。。