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
Vba Excel 2013中的状态栏和屏幕更新_Vba_Excel_Excel 2013 - Fatal编程技术网

Vba Excel 2013中的状态栏和屏幕更新

Vba Excel 2013中的状态栏和屏幕更新,vba,excel,excel-2013,Vba,Excel,Excel 2013,我刚刚进入Excel 2013,注意到宏的工作方式有一些不同(因为微软不能放任一件好事) 我总是在长宏开始时使用Application.screenupdating=False,以加快运行时间。通常在这些情况下,我还使用了Application.StatusBar=“基于宏的随机文本”,让自己(或其他用户)了解正在发生的事情和/或宏需要完成的工作量 2013年,我从中学到,DoEvents现在是必需的。但是,当我在状态栏更新后添加DoEvents时,似乎会重新打开屏幕更新,除非Excel之外的窗

我刚刚进入Excel 2013,注意到宏的工作方式有一些不同(因为微软不能放任一件好事)

我总是在长宏开始时使用
Application.screenupdating=False
,以加快运行时间。通常在这些情况下,我还使用了
Application.StatusBar=“基于宏的随机文本”
,让自己(或其他用户)了解正在发生的事情和/或宏需要完成的工作量

2013年,我从中学到,
DoEvents
现在是必需的。但是,当我在状态栏更新后添加
DoEvents
时,似乎会重新打开屏幕更新,除非Excel之外的窗口(例如打开的文件资源管理器窗口)被指定为焦点

我注意到的另一个问题是,对于代码中的DoEvents,我似乎无法手动中断宏(即,按住ESC键不会停止代码)

所以有几个问题: A) 真的需要吗? B) 有没有办法防止DoEvents“打开”屏幕更新? C) 如何手动断开运行时包含DoEvents的代码

如果有帮助的话,我可以提供我正在研究的当前宏,但是因为我对一般概念更感兴趣,所以我不想为任何陷入困境的读者提供细节


提前谢谢

我今天遇到了一个类似的问题,所以我想我会分享我在调试该问题时发现的问题:

对我来说,我注意到在宏运行时,状态栏正在恢复为以前的状态栏方法。我发现旧消息是我禁用屏幕更新之前打印的最后一条状态栏消息。但是,新的状态栏消息正在临时打印,因此屏幕更新不会阻止显示新消息。我将问题追溯到宏中的一个点,在那里我使用以下命令运行可执行文件:

Set wsh = VBA.CreateObject("WScript.Shell")
errorCode = wsh.Run(exeCMD, windowStyle, waitOnReturn)
似乎调用可执行文件中断了状态栏显示,excel恢复显示禁用屏幕更新之前显示的任何状态栏消息。为了解决这个问题,我在运行可执行文件之前重新激活了屏幕更新,然后在运行可执行文件后禁用了屏幕更新:

Set wsh = VBA.CreateObject("WScript.Shell")
Application.ScreenUpdating = True
errorCode = wsh.Run(exeCMD, windowStyle, waitOnReturn)
Application.ScreenUpdating = False

希望这对其他人有所帮助。

因此,我尝试了另一个宏,该宏不会在两个工作簿之间移动数据,并且我没有看到屏幕更新。但是,在此宏中,
DoEvents
不会导致状态栏更新。。。所以我现在很迷茫,不用statusbar,你可以使用一个用户表单,它不会被application.screenUpdate(或application.enableevents)所困扰,也不需要DoeEvents。DoeEvents可能会导致循环中的错误,特别是在递归中。我猜它是否有问题取决于您在其中使用的代码。我最近刚刚遇到了这个问题,我很高兴看到一个解决方案,这样我就可以继续使用状态栏发送消息了。@robotik我最终创建了一个小小的用户表单,它只是一个文本字段和一个按钮。我将状态信息发布到文本字段,当宏完成时,按钮用于关闭表单。随着我越来越多地使用2013,StatusBar似乎将用于较小的宏,这些宏不需要太多的更新,也不需要处理太多的数据,但已经不能胜任更大程序的工作。