2016-10-13 56 views
2

我試圖讓一個圖像消失並在循環發生時重新出現。當我逐步完成代碼時,代碼會按預期運行,但是當我運行它時,屏幕不會更新,直到循環結束。Excel VBA:循環期間不刷新屏幕

我試着添加像DoEvents和ActiveWindow.SmallScroll的東西,如發現here但似乎沒有工作。我有一種感覺,這個問題可能與我的PC /設置/版本的Excel有關,並且該循環可能在某些人的機器上工作。如果你想試試,我已經上傳了sample file here

我的代碼是:

Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) 

Sub ToggleImage() 

For i = 1 To 20 

Application.ScreenUpdating = True 

ActiveSheet.Shapes("Picture 1").Visible = False 
ActiveSheet.Shapes("Picture 2").Visible = True 

ActiveSheet.Shapes("Picture 1").Visible = True 
ActiveSheet.Shapes("Picture 2").Visible = False 

Sleep 50 


Next 


End Sub 

示例工作簿連接。

+1

爲什麼不嘗試使用> Application.Wait(Now + TimeValue(「0:00:50」)) <並刪除睡眠庫和睡眠? – Vityata

+0

嘿Vityata。不幸的是,當使用Wait而不是Sleep時,我遇到了同樣的問題。此外,你不能做一個短於1秒的時間,因此循環20次需要很長的時間(20秒)。不過謝謝。 – Lucas

+0

我有一個想法 - 你可以簡單地把一個debug.print,打印循環中從1到5000的數字,它會減慢代碼足以看到圖片。 :)沒有任何睡眠和等待。這肯定會起作用。 – Vityata

回答

2

DoEvents必須有時間做事件;-)。因此,如果您在睡眠之後調用一次,則完全沒用。它必須在暫停期間工作

下面應該工作:

Sub ToggleImage() 

Dim dTime As Double 

For i = 1 To 20 

    'ActiveSheet.Range("a1").Value = i 

    ActiveSheet.Shapes("Picture 1").Visible = False 
    ActiveSheet.Shapes("Picture 2").Visible = True 

    dTime = Time 
    Do While Time < dTime + 1/24/60/60/2 
    DoEvents 
    Loop 

    ActiveSheet.Shapes("Picture 1").Visible = True 
    ActiveSheet.Shapes("Picture 2").Visible = False 

    dTime = Time 
    Do While Time < dTime + 1/24/60/60/2 
    DoEvents 
    Loop 

Next 


End Sub 

但你將無法縮短暫停至50毫秒。即使刷新工作表也需要更多時間。

+0

這個工程!感謝您的建議。所以沒有辦法將停頓時間縮短到<1秒? – Lucas

+1

問題不在於「減少停頓時間<1秒」。在我的例子中是0.5秒(1/24/60/60/2)。但是,如果此時表單的刷新過程未準備好,則可以根據需要減少暫停。嘗試0.25秒(1/24/60/60/4)或更少。它不會有任何效果。 –