vba - 全屏编码

标签 vba excel

我有以下代码,它使用完全相同的方法以全屏方式加载工作表 1 分钟,然后移至工作簿中的下一个工作表。

这是为了在大屏幕上显示统计数据,循环显示多个统计页面。

这在 Excel 2007 和 2010 上完美运行。 然而,当在 Excel 2013 上执行相同的代码时,Excel 只是最大化了我的 CPU 的 1 个核心,并且一直没有响应。我什至无法使用 Escape 来中断代码执行。逐行单步执行代码在所有版本上都可以正常工作。

'Loads up Daily Dispatch Figures worksheet
Application.ScreenUpdating = False
Sheets("Daily Dispatch Figures").Select
Range("A1").Select
Range("A1:C36").Select
ActiveWindow.Zoom = True
Range("A1").Select
ActiveWindow.DisplayHeadings = False
Application.DisplayFormulaBar = False
Application.DisplayFullScreen = True
Application.ScreenUpdating = True

' Stays on this screen for 1 min
TimVal = Now + TimeValue("0:01:00")
Do Until Now >= TimVal
Loop

最佳答案

噢,不要这样做:

' Stays on this screen for 1 min
TimVal = Now + TimeValue("0:01:00")
Do Until Now >= TimVal
Loop

试试这个:

Application.OnTime Now + TimeValue("0:01:00"), "ProcedureToRun"

您不想让您的应用程序陷入无限循环且没有 sleep 。

任何时候你坐在无限循环中而不 sleep ,它都会使用 100% 的处理器时间而不做任何事情。 Application.OnTime“安排”一个事件并将控制权返回给 Excel UI 线程,而不是无限循环。

您可以在这里阅读更多信息:https://msdn.microsoft.com/en-us/library/office/ff196165.aspx

我不确定循环后您在做什么,但您需要确保代码位于单独的子例程中并调用它。

这是一个转到下一张纸的子例程。

Sub MoveNext()
On Error Resume Next
Sheets(ActiveSheet.Index + 1).Activate
If Err.Number <> 0 Then Sheets(1).Activate
On Error Goto 0
End Sub

您可以将 Application.OnTime 添加到其末尾并让它调用自身:

Sub MoveNext()
On Error Resume Next
Sheets(ActiveSheet.Index + 1).Activate
If Err.Number <> 0 Then Sheets(1).Activate
On Error Goto 0
Application.OnTime Now + TimeValue("00:01:00"), MoveNext
End Sub

这样,它将永远循环并从一张纸转到另一张纸(或者直到您以您选择使用的任何方法停止它为止)。

最后,您可以通过存储预定时间并使用 Scheduled:=False 来取消此操作。

您的最终代码可能如下所示:

Public scheduledTime as Date

Sub StartDisplaying()
'Your start code:
'---------------------------------------------
Application.ScreenUpdating = False
Sheets("Daily Dispatch Figures").Select
Range("A1").Select
Range("A1:C36").Select
ActiveWindow.Zoom = True
Range("A1").Select
ActiveWindow.DisplayHeadings = False
Application.DisplayFormulaBar = False
Application.DisplayFullScreen = True
Application.ScreenUpdating = True
'---------------------------------------------
scheduledTime = Now + TimeValue("00:01:00")
Application.OnTime scheduledTime, MoveNext
End Sub

Sub StopDisplaying()
'Your stop code:
'---------------------------------------------
Application.ScreenUpdating = False
Sheets("Daily Dispatch Figures").Select
ActiveWindow.Zoom = False
ActiveWindow.DisplayHeadings = True
Application.DisplayFormulaBar = True
Application.DisplayFullScreen = False
Application.ScreenUpdating = True
'---------------------------------------------
Application.OnTime EarliestTime:=scheduledTime, Procedure:="MoveNext", Schedule:=False
End Sub

Sub MoveNext()
On Error Resume Next
Sheets(ActiveSheet.Index + 1).Activate
If Err.Number <> 0 Then Sheets(1).Activate
On Error Goto 0
scheduledTime = Now + TimeValue("00:01:00")
Application.OnTime scheduledTime, MoveNext
End Sub

关于vba - 全屏编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28903173/

相关文章:

excel:根据条件列出范围内列的所有值

arrays - 如何让 VBA 子程序调用一个函数,该函数将数组传递给子程序中的另一个函数

html - 从vba中的下拉框中选择各种选项

vba - 删除空列时Excel内存通过屋顶

vba - 自动定义工作表名称

java - 每次调用函数时将数据写入 Excel 文件中的新行

VBA - 获取数组长度时限定符无效

vba - excel vba函数可以打开文件吗?

VBA - 使用数字选择列?

基于另一个单元格的 VBA 过滤器