2016-10-13 3 views
2

Я пытаюсь сделать изображение исчезающим и вновь появляться во время цикла. Код работает по назначению, когда я его просматриваю, но когда я его запускаю, экран не обновляется до тех пор, пока цикл не будет завершен.Excel VBA: Экран не обновляется во время цикла

Я попытался добавить такие вещи, как DoEvents и ActiveWindow.SmallScroll, как найдено here, но ничего не работает. У меня такое ощущение, что эта проблема может иметь какое-то отношение к моему компьютеру/настройкам/версии 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")) <и удалить Sleep lib и сон? – Vityata

+0

Эй, Витята. К сожалению, у меня такая же проблема при использовании 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) или меньше. Это не будет иметь никакого эффекта. –

Смежные вопросы