如何防止在Excel中的屏幕工件

即使他们不是Excel中的活动工作表(2013和2015),我也遇到了表单部分的问题。

我正在使用Excel和VBA编写一些数据捕获和报告工具。 我的系统生成工作表并使用用户可以input数据的格式表填充它们。 用户完成后,数据会进行一些处理,并生成一张或多张带有额外图表和表格的新页面,所有页面都打印好。

示例屏幕工件 - 在显示工作表A时,Excel将显示工作表B中的某些单元格

在上面的屏幕截图中,数据input表正在愉快地显示,直到我开始尝试从C14中的确认列表中select,此时第9行决定消失,并让下一张纸的内容显示出来。 你可以看到列没有正确排列。 这也发生在其他地方,特别是在数据input表的初始生成之后。

我不知道这是否是相关的,但我有一个欢迎工作表上的ActiveX命令button,并在整个过程中的各个点显示和启用并不总是正确更新。 有时在显示之后它们不会出现(尽pipe通过Watch窗口读取属性表明Visible为True)。 有时他们会显示为禁用,而启用是真实的(事实上,他们仍然是可点击的,尽pipe从用户的angular度来看,这并不是很有帮助)。

切换工作表,最小化和恢复程序并打入单元格有时可以解决这些问题。

我做了适当的设置Application.ScreenUpdating ,在任何工作表生成例程之后,然后将其设置为True。

有谁知道我可能做错了什么? 另外,我如何触发屏幕重绘?

有时如果写一个使用大量系统资源的循环,可能会阻止屏幕正确更新。 如果你在这个循环中插入命令DoEvents (我通常把它放在最前面),那么这将释放计算机进行屏幕刷新,并防止工作表冻结实现计算。 你尝试了DoEvents命令吗?

DoEvents通常不适用于我,特别是对于命令button。 这是我用来清除屏幕文物,包括:

  • 在实际上不存在的窗口中明显分裂
  • 其他工作表中的Ghost命令button

Sub ClearScreenArtifacts()

  DoEvents With Application .EnableEvents = True .ActiveWindow.SmallScroll down:=1 .ActiveWindow.SmallScroll up:=1 .WindowState = .WindowState End With ' Toggle Screen Updating With Application Dim updatingState As Boolean updatingState = .ScreenUpdating .ScreenUpdating = Not updatingState .ScreenUpdating = updatingState End With ' Toggle Freeze Panes Dim ws As Worksheet Set ws = ActiveSheet With ActiveWindow ' Remember currently selected range Dim originalSelection As Range Set originalSelection = Application.Selection ' Freeze panes below 1st row. If .FreezePanes Then .FreezePanes = False ws.Range("A2").Select .FreezePanes = True ' Freeze panes at last row. .FreezePanes = False ws.Range("A" & ws.UsedRange.Rows.Count).Select .FreezePanes = True ' Unfreeze panes. .FreezePanes = False .Split = False ' Re-select original selected range originalSelection.Select End With 

End Sub