VBA Excel ячейка refre sh проблема перед ScreenUpdating false - PullRequest
1 голос
/ 24 марта 2020

Я столкнулся с проблемой, это не должно быть большим делом, но я не нахожу способ ее решить, даже если это кажется простым.

У меня есть код, который должен * l oop через файлы в папку и скопируйте их содержимое в 1 окончательный файл.

Чтобы избежать мигания экрана, я использую Application.ScreenUpdating = False перед запуском l oop и в конце l oop я возвращаю его в True.

Я также записывая в A1 «Обработка, пожалуйста, подождите», и в конце l oop я очищаю A1.

Я вызываю функцию LoopThroughFiles через активную командную кнопку x, размещенную на MySheet.

Проблема в том, что сообщение в ячейке «А1» не всегда появляется! иногда это появляется, а иногда нет. В большинстве случаев, когда я впервые запускаю код, он появляется, после 3-4 тестов он перестает появляться, затем после нескольких тестов он появляется снова и так далее. это случайно. вот что я заметил:

Если я удаляю Application.ScreenUpdating = False, он всегда появляется. Если я поставлю точку останова или окно сообщения перед Application.ScreenUpdating = False, оно также всегда будет отображаться.

Я думаю, что Application.ScreenUpdating = False очень быстро появляется после обработки A1.value = " Пожалуйста, подождите ", поэтому A1 заполнен, но Application.ScreenUpdating = False приходит слишком быстро, поэтому он вступает в силу до того, как появится содержимое A1, и экран не обновится. Я пытался поставить Doevents перед Application.ScreenUpdating = False, но все еще та же проблема, любая идея, как решить эту проблему и сделать всегда содержимое A1, появляется перед Application.ScreenUpdating = False?

вот как выглядит как мой код

Private Sub CommandButton1_Click()
Call LoopThroughFiles
End Sub

Public Function LoopThroughFiles() As String
'Declare Variables etc...

'I change the Value of A1
With ThisWorkbook.Sheets(MySheet).Range("A1")
.Font.Color = -16776961
.Font.Bold = True
.Value = "Processing, Please Wait ..."
End with

Application.ScreenUpdating = False

'MyLoop
'The Rest of code

Application.ScreenUpdating = True
'I clear A1
With ThisWorkbook.Sheets(MySheet).Range("A1")
.Value = vbNullString
.Font.ColorIndex = xlAutomatic
.Font.Bold = False
End with

End function

Ответы [ 2 ]

0 голосов
/ 25 марта 2020

Просто, если это кому-то поможет, я исправил свою проблему, добавив al oop, чтобы замедлить код. Я предпочитаю не использовать Ожидание, потому что Ожидание не менее 1 секунды, и мне не нужно ждать 1 секунду, я предпочитаю не использовать Sleep, потому что это API, и я предпочитаю использовать нативный vba, это будет лучше для совместимости версии Мне пришлось выбирать между al oop debug.print или doevents, я предпочел сделать это так:

Dim cptWait as integer
For cptWait = 1 To 75
Debug.Print "Wait 75"
Next cptWait

Так функция стала такой

Public Function LoopThroughFiles() As String
'Declare Variables etc...

'I change the Value of A1
With ThisWorkbook.Sheets(MySheet).Range("A1")
.Font.Color = -16776961
.Font.Bold = True
.Value = "Processing, Please Wait ..."
End with

Dim cptWait as integer
For cptWait = 1 To 75
Debug.Print "Wait 75"
Next cptWait

Application.ScreenUpdating = False

'MyLoop
'The Rest of code

Application.ScreenUpdating = True
'I clear A1
With ThisWorkbook.Sheets(MySheet).Range("A1")
.Value = vbNullString
.Font.ColorIndex = xlAutomatic
.Font.Bold = False
End with

End function

Спасибо всем кто пытался помочь

0 голосов
/ 24 марта 2020

попробуйте поставить

Application.ScreenUpdating = True

после записи содержимого в А1. это будет выглядеть как

With ThisWorkbook.Sheets(MySheet).Range("A1")
.Font.Color = -16776961
.Font.Bold = True
.Value = "Processing, Please Wait ..."
End with
Application.ScreenUpdating = True
Application.ScreenUpdating = False

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...