Мерцающий экран макросы VBA - PullRequest
0 голосов
/ 25 мая 2020

Настройка

Я создал отчет в Excel, который извлекает данные из API в модель данных PowerPivot, которая запускает несколько сводных таблиц и графиков. Наряду с этим существует очень простой макрос, который обновляет всю книгу, поэтому извлекаются новые данные.

Проблема

Когда я нажимаю кнопку, которую я сделал для макроса заголовки, текстовые поля и изображения внутри отчета начинают мигать, и после завершения процесса они полностью исчезают только для того, чтобы отобразиться при нажатии на них. Они кажутся скрытыми.

Я ищу способ решить эту проблему - искал в Google несколько способов сделать это, но похоже, что это не работает

Пробные решения

Я пробовал несколько решений, а также вставил свой код во что-то подобное, как показано ниже, а также просто обернул его вокруг Application.ScreenUpdating

Sub startcode()
     Application.ScreenUpdating = False
     Call myrunningsub()
     Application.ScreenUpdating = True
End Sub

Sub myrunningsub()
    'MY CODE HERE
End Sub

Я также тестировал это:

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Const WM_SETREDRAW = &HB
Sub DataRefresh()
    SendMessage Application.hwnd, WM_SETREDRAW, 0&, 0&
   MY CODE HERE
    SendMessage Application.hwnd, WM_SETREDRAW, 1&, 0&        
End Sub

Мой код

Sub workbook_refreshAll()

Sheets("Employee Analysis").Range("J5") = ""

ActiveWorkbook.RefreshAll

Sheets("Employee Analysis").Range("J5").Select
ActiveCell.Formula = "=today()"

End Sub

1 Ответ

2 голосов
/ 25 мая 2020

Существуют известные передовые практики для VBA в Excel, которые могут ускорить ваш код.

# 1. Не копируйте и не вставляйте

Функции копирования и вставки (или PasteSpecial ) работают медленно. Примерно в 25 раз быстрее использовать следующее для копирования и вставки значений.

    Range("A1:Z100").value = Range("A101:Z200").value

Если вы делаете это таким образом, ваш код, вероятно, будет работать. Возможно, проблема с Mamory, если вы делаете это на многих строках.

# 2. Вычисление

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

    Application.Calculation = xlCalculationManual

В конце кода вы можете вернуть автоматический c режим вычислений с помощью оператора:

    Application.Calculation = xlCalculationAutomatic

Помните, однако, что, когда режим расчета xlCalculationManual , Excel не обновляет значения в ячейках. Если ваш макрос полагается на обновленное значение ячейки, вы должны вызвать событие Calculate с помощью метода .Calculate, например Worksheets(1).Calculate.

# 3. ScreenUpdating

Каждый раз, когда VBA записывает данные на рабочий лист, он обновляет изображение экрана, которое вы видите. Обновление изображения значительно снижает производительность. Следующая команда отключает обновления экрана.

    Application.ScreenUpdating = False

В конце макроса используйте следующую команду, чтобы снова включить обновления экрана.

    Application.ScreenUpdating = True

# 4 Игнорировать события

Если у вас есть событие Worksheet_Change, реализованное для Sheet1 вашей книги. Каждый раз при изменении ячейки или диапазона на Sheet1 запускается событие Worksheet_Change. Поэтому, если у вас есть стандартный макрос, который управляет несколькими ячейками на листе Sheet1, каждый раз, когда ячейка на этом листе изменяется, ваш макрос должен приостанавливаться на время выполнения события Worksheet_Change. Вы можете себе представить, как такое поведение замедлит ваш макрос.

    Application.EnableEvents = False

В конце кода вы можете вернуть режим EnableEvents в значение True с помощью оператора:

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