Excel vba:为什么屏幕不更新,在关闭屏幕更新之前更新单元格

时间:2017-08-30 13:36:04

标签: excel vba excel-vba

我有一个sub,它以调用另一个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 out 有帮助,因为它显然比编辑单元格更早执行。

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

1 个答案:

答案 0 :(得分:2)

我真的不明白为什么这不起作用。 但您可以尝试使用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