【问题标题】:Excel vba: Why doesn't the screen update, update cells right before turning off screen updatingExcel vba:为什么屏幕不更新,在关闭屏幕更新之前更新单元格
【发布时间】:2017-08-30 13:36:04
【问题描述】:

我有一个子程序,它首先调用另一个子程序(编辑工作簿的单元格),然后关闭屏幕更新和警报。问题是,即使编辑工作簿的第一个子位于第二个子之前,单元格也不会更新。

当我关闭第二个 sub 时,单元格会更新。如何更新单元格然后关闭屏幕更新?

Sub mainSub()
        Call editSub 'edit cell's value: ThisWorkbook...Cells(i, j).Value=...
        Call setupApp 'turns off scren updating, when uncommented prevents the previous sub from getting visible results
        ...
End Sub

Sub setupApp()
        Application.ScreenUpdating = False
        Application.DisplayAlerts = False
End Sub

编辑:当mainSub 开始时,屏幕更新已经为真;将setupApp 子注释掉帮助,因为它显然在单元格被编辑之前就被执行了。

Sub editSub()
    Dim resultArray() As String
    resultArray = getStateNames()  'just returns an array of Strings

    displayStateNameArray (resultArray)
End Sub

Sub displayStateNameArray(resultArray As Variant)
    ThisWorkbook.Worksheets("sheet 1").Range("C6:C97").Clear
    Dim k As Integer
    Dim i As Integer
    i = 1
    For k = LBound(resultArray) To UBound(resultArray)
            ThisWorkbook.Worksheets("sheet 1").Cells(5 + i, 3).Value = resultArray(k)
            i = i + 1
    Next
End Sub

【问题讨论】:

  • getStateNames 中是否有 Application.ScreenUpdating = False?
  • @Moosli 不,没有
  • 好的,让我们去卡赫特。您可以在我的答案中的评论中看到它。

标签: vba excel


【解决方案1】:

我真的不明白为什么这不起作用。 但是您可以尝试使用 If 语句调用 SetupApp。为此,您必须将 editSub 转换为函数,最后只返回一个真值。像这样的:

Sub mainSub()
        If editSub = True Then Call setupApp
End Sub

Sub setupApp()
        Application.ScreenUpdating = False
        Application.DisplayAlerts = False
End Sub

Function editSub() As Boolean
'Code stuff in her
editSub = True
End Function

第二个解决方案

您可以尝试使用DoEvents 强制事件来更新屏幕。

像这样:

Call editSub 
DoEvents
Call setupApp 

或者您在单元格中写入后立即放置 DoEvents。


如果这不起作用,您可以尝试等待方法:

Application.Wait "00:00:01"  


第一个解决方案

您是否尝试在执行 Sub 之前打开 ScreenUpdating?

Sub mainSub()
            Call setupApp(true)
            Call editSub 'edit cell's value: .Cells(i, j).Value=...
            Call setupApp (false)'turns off scren updating, when uncommented prevents the previous sub from getting visible results
            ...
    End Sub

    Sub setupApp(bol as Boolean)
            Application.ScreenUpdating = bol 
            Application.DisplayAlerts = bol 
    End Sub

【讨论】:

  • 没有帮助。当子程序启动时,屏幕更新已经为真。评论第二个子帮助,因为它显然比需要的更早执行。
  • editSub 中有多少代码?因为如果只有几行,可能是UpdateEvent比较慢,在Updating the Screen之前会关闭
  • 好几行。它需要一些数据,检查它,添加到数组中,然后才使用数组中的值编辑单元格。
  • @Ans 好的,我添加了我的 Awnser
  • 不幸的是两者都没有帮助.....等待只会导致更长的执行时间,而单元格仍然是空的,DoEvents 不会影响任何事情。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-15
  • 1970-01-01
相关资源
最近更新 更多