2016-10-13 41 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

Hey Vityata。残念ながら、私はSleepの代わりにWaitを使用するときに同じ問題を抱えます。また、1秒未満の時間を行うこともできないため、20回のループ処理には長すぎます(20秒間)。しかし、ありがとう。 – Lucas

+0

私はアイディアを持っています。ループ内に1から5000までの数字を表示するdebug.printを置くだけで、画像を見るのに十分な速度のコードを作成できます。 :)寝ることなく、待ってください。それは確かに動作します。 – 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)以下を試してください。何の効果もありません。 –

関連する問題