如何防止Excel中的屏幕瑕疵

时间:2016-01-29 12:22:39

标签: excel vba excel-vba

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

我正在使用Excel和VBA编写一些数据捕获和报告工具。我的系统生成工作表并使用用户可以输入数据的格式化表填充它们。用户完成后,需要对数据进行一些处理并生成一个或多个带有额外图表和表格的新工作表,所有这些工作都很适合打印。

Example Screen Artifacts - While showing sheet A, excel displays some cells from sheet B

在上面的屏幕截图中,数据输入表很高兴正常显示,直到我开始尝试从C14中的验证列表中进行选择,此时第9行决定消失并让下一张表的内容显示出来。您可以看到列没有正确排列。这也发生在其他方面,尤其是在初始生成数据输入表之后。

我不知道这是否相关,但我在欢迎表上有一组ActiveX CommandButtons,并且在整个过程中的各个点显示和启用,并不总是正确更新。有时他们在被展示后不会出现(尽管通过Watch窗口阅读属性表明Visible为True);有时它们会在启用时显示为已禁用(实际上它们仍然可以点击,但从用户的角度来看它并不是很有用)。

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

我确实设置了Application.ScreenUpdating,在任何工作表生成例程之前将其设置为True,然后将其设置为false。

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

2 个答案:

答案 0 :(得分:1)

有时如果写一个使用大部分系统资源的循环,这可能会阻止屏幕正确更新。如果在此循环中插入命令 DoEvents (我通常将其置于顶部),则可以释放计算机以进行屏幕刷新,并防止工作表冻结,从而完成计算。你试过DoEvents命令吗?

答案 1 :(得分:0)

DoEvents通常对我不起作用,特别是对于命令按钮。这是我用来清理屏幕文物的内容,包括:

  • 在实际上不存在的窗口中显然分割
  • 其他工作表中的Ghost命令按钮

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