Vba excel отключить обновление экрана

Обновлено: 05.07.2024


И отключает обновление экрана, кроме одного. Когда я активирую другую книгу (с помощью Windows(bo).Activate), экран меняется на эту другую книгу. Поскольку это внутри цикла, это происходит много раз.

И это чрезвычайно замедляет выполнение макроса, что я пытался устранить, установив ScreenUpdating=False в первую очередь. Есть ли более тщательный способ отключить ВСЕ обновления экрана, чтобы этот макрос мог выполняться быстрее и не отображал изменяющиеся окна при попадании в оператор Windows.Activate?

Факты об Excel

MARK858

MrExcel MVP
  1. 365
  2. 2010
    1. Окна
    2. Мобильный

    ТомКон

    Активный участник

    Копирование большого количества информации из одной книги в другую. Возможно, его можно было бы разработать более эффективно. однако я просто хотел написать несколько быстрых и грязных строк кода и позволить процессору сделать всю работу. Был разочарован тем, что Application.ScreenUpdating=False, похоже, имеет это «исключение». Итак, вернемся к вопросу, есть ли способ «действительно» отключить обновление экрана? Я представляю, как Excel сидит там, а экран абсолютно ничего не делает, пока макрос не завершится. Возможно?
    Спасибо!

    MARK858

    MrExcel MVP
    1. 365
    2. 2010
      1. Окна
      2. Мобильный

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

      И да, был код для лучшего обновления экрана, но "напишите несколько быстрых и грязных строк кода" это не так

      ТомКон

      Активный участник

      Большое спасибо! Я думал, что должен активировать книгу, чтобы обеспечить «контекст» для ячейки назначения. Но, как вы говорите, в этом нет необходимости; полный контекст может быть представлен как:
      Workbooks(bnw).Sheets(sht).Range(addr).Formula = ftxt (как вы знаете). Даже если активная книга не является этой книгой.

      Это действительно ускорило его. хотя меньше, чем я надеялся. Может быть, примерно на 25%.

      У меня есть "сильно поврежденная" книга, которую я пытаюсь восстановить, и поэтому я хочу попробовать скопировать все в виде текста, а не любую копию формул или содержимого ячеек, чтобы посмотреть, смогу ли я воссоздать книгу, которая способ. «открыть и восстановить» и ничего больше не сработало. У меня также есть диаграммы и сводные таблицы, поэтому восстановление займет много времени.

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

      Часто мы можем чувствовать, что экран Excel сходит с ума во время работы макроса, и мы почти расстраиваемся из-за этого. Но как справиться с такими ситуациями и заставить код работать быстрее, чем обычно медленно?

      Обновление экрана — это то, что мы можем заметить, когда макрос Excel Макрос Excel Макрос в Excel представляет собой серию инструкций в виде кода, который помогает автоматизировать ручные задачи, тем самым экономя время. Excel выполняет эти инструкции шаг за шагом для заданных данных. Например, его можно использовать для автоматизации повторяющихся задач, таких как суммирование, форматирование ячеек, копирование информации и т. д., тем самым быстро заменяя повторяющиеся операции несколькими щелчками мыши. читать дальше работает. Когда задача выполняется, мы можем заметить, что наш экран обновляет значения, пока макрос не завершит назначенную задачу. Поскольку наш экран мерцает или обновляется, это приводит к замедлению работы программы Excel и занимает больше времени, чем обычно, для выполнения задачи.

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

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

      VBA-Screen- Обновление

      Когда использовать функцию обновления экрана?

      Предположим, у вас есть сомнения, когда использовать эту технику. Ознакомьтесь с приведенными ниже пунктами.

      • Когда вы перебираете большое количество ячеек.
      • Отправка электронных писем из Excel VBAОтправка электронных писем из Excel VBAМы можем использовать VBA для автоматизации нашей функции рассылки в Excel, чтобы отправлять электронные письма нескольким пользователям одновременно. Чтобы использовать функции Outlook, мы должны сначала включить сценарии Outlook в VBA, а затем использовать метод приложения. Подробнее .
      • Переключение между книгами Excel.
      • Открытие новых книг.

      Как использовать функцию обновления экрана в коде VBA?

      Например, взгляните на приведенный ниже код.

      Код:

      В приведенном выше примере есть вложенный цикл VBA Цикл VBA Цикл VBA в Excel — это инструкция для запуска кода или многократного повторения действия. читать дальше, чтобы вставить серийные номера из первого столбца в 50-й столбец и снова вернуться и вставить серийный номер, начиная с 51 из второй строки в 50-й столбец.

      Таким образом, он будет вставляться до тех пор, пока не достигнет 50-й строки.

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

      Чтобы избежать всего этого, мы можем добавить для обновления экрана значение FALSE.

      Чтобы сначала получить доступ к функции обновления экрана, нам нужно получить доступ к объекту приложения.

      Пример обновления экрана VBA 1-1

      Как видно из объекта Application, у нас есть много свойств и методов. Итак, выберите «Обновление экрана» в списке IntelliSense.

      Примечание. Вы должны применить функцию обновления экрана сразу после объявления переменных.

      Пример 1-2

      После выбора свойства «Обновление экрана» поставьте знак равенства (=).

      Пример 1-3

      Как мы видим, два логических значения, то есть FALSE и TRUE.

      Чтобы остановить обновление экрана, установите статус FALSE.

      Пример 1-4

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

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

      Всегда устанавливать для обновления экрана значение TRUE в конце

      Я видел, как многие люди устанавливали для обновления экрана значение FALSE, но забывали вернуть его обратно в значение TRUE в конце макроса.

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

      Когда я впервые начал использовать VBA, я всегда предполагал, что он просто используется, чтобы не пугать конечных пользователей и не думать, что их компьютер вот-вот выйдет из строя. Когда я начал больше читать о повышении эффективности вашего кода, я понял, для чего это нужно, но насколько действительно обновление экрана влияет на время выполнения вашего кода?


      В зависимости от того, что делает ваш код, установка Application.Calculation на "ручной" часто также дает вам значительное увеличение скорости. Обычно вы делаете и то, и другое для долго выполняющегося макроса. Не забудьте сбросить вычисления — это постоянная настройка.

      Кроме того, при выключенном обновлении экрана вы можете сообщать пользователю о ходе выполнения через Application.Statusbar = . Затем установите значение False, чтобы вернуть его в нормальное состояние. Некоторым людям нужно видеть прогресс, иначе они решат, что их компьютер завис, и принудительно закроют все.

      Я также читал, что форматом данных по умолчанию в Excel на самом деле является Валюта, поэтому лучше использовать Валюту в качестве значения данных вместо Двойного, когда это возможно, чтобы избежать преобразования данных.

      Небольшое примечание: вы можете время от времени добавлять DoEvents в свой код, чтобы ваш Excel не зависал. Я делаю что-то вроде, если n mod 5000, то DoEvents в моих циклах, чтобы Excel отвечал, но также предотвращал замедление. Кажется, это работает хорошо.

      5 ответов 5

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

      Другие параметры приложения, которые могут повлиять на время выполнения, — это расчет и обработка событий. Используйте этот шаблон кода в качестве отправной точки (обработчик ошибок гарантирует, что эти свойства снова будут включены в конце подпрограммы, даже если это приведет к ошибке)

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

      Самое полезное включает

      1. По возможности избегайте Select , Activate и ActiveCell/Sheet/Workbook. Вместо этого объявляйте и назначайте переменные и ссылайтесь на них.
      2. При ссылке на большие диапазоны скопируйте данные диапазона в массив вариантов для обработки, а затем скопируйте результат обратно в диапазон.
      3. Используйте Range.SpecialCells , Range.Find и Range.AutoFilter, чтобы ограничить количество ячеек, на которые ссылаются.

      Есть много примеров этих методов на SO.

      @FreeSoftwareServers повышает скорость, в первую очередь потому, что код, использующий Active* (или Select, или Selection), включает в себя дополнительные ненужные шаги по взаимодействию с Excel, которые требуют времени. Для вашего варианта использования: проведите несколько тестов!

      Если вы хотите увидеть довольно яркий пример важности обновления экрана, запустите следующий код. В Excel 2011 мне требуется примерно в 45 раз больше времени, чтобы запустить этот обмен без ScreenUpdating = false ! Это огромная разница во времени.

      Кроме того, пока мы говорим о способах повышения эффективности, еще один ключевой момент заключается в том, что Select , Selection и Activate редко (если вообще) необходимы. Когда вы записываете макросы, они всегда будут использоваться, но очень мало ситуаций, когда вам действительно нужно использовать их в коде. Точно так же все, что содержит Active в заголовке (например, ActiveCell ), обычно указывает на то, что у вас будет более медленный код, потому что вы предположительно выбираете ячейки.

      Вы почти всегда можете обращаться к ячейкам/рабочим листам конкретно и не выбирать. Например:

      будет работать независимо от того, находитесь ли вы в данный момент на первом рабочем листе. Распространенная новая ошибка VBA заключается в том, чтобы сделать что-то вроде:

      Свойство приложения ScreenUpdating в VBA используется для включения/выключения обновления экрана. Если мы установим для свойства ScreenUpdating значение TRUE, оно включит обновление экрана, иначе отключит обновление экрана. Когда мы устанавливаем для свойства ScreenUpdating объекта приложения значение false, это ускорит макрос. Это один из методов оптимизации.

       Свойство приложения Excel VBA ScreenUpdating

      В этой теме:

      Свойство приложения VBA ScreenUpdating — синтаксис

      Вот синтаксис для свойства ScreenUpdating объекта приложения в VBA.

      Где ScreenUpdating как логический тип данных.
      В приведенном выше синтаксисе Application представляет объект, а ScreenUpdating — свойство объекта Application.

      Свойство приложения VBA ScreenUpdating: пример 1

      Найдите приведенный ниже пример свойства ScreenUpdating объекта приложения в Excel VBA.

      Объяснение. В приведенном выше примере в первом столбце листа Sheet1 будут отображаться числа от 1 до 100. Мы можем заметить обновление экрана при обновлении Sheet1.

      Свойство приложения VBA ScreenUpdating: пример 1

      Пожалуйста, найдите приведенный ниже пример свойства ScreenUpdating объекта приложения в Excel VBA.

      Объяснение. В приведенном выше примере в первом столбце листа Sheet1 будут отображаться числа от 1 до 100. Мы можем заметить, что до запуска макроса нет обновления экрана. Не забудьте сбросить значение параметра ScreenUpdating как TRUE в конце макроса.

      Свойства приложения VBA ScreenUpdating — инструкции

      Выполните следующие действия, чтобы выполнить код VBA для сохранения файла Excel.
      Шаг 1. Откройте любое существующее приложение Excel.
      Шаг 2: Нажмите Alt+F11 — откроется редактор VBA.
      Шаг 3: Вставьте модуль кода из меню вставки.
      Шаг 4: Скопируйте приведенный выше код и вставьте модуль кода, который был вставлен на предыдущем шаге.
      Шаг 5. Теперь нажмите F5, чтобы выполнить код, и посмотрите, когда функция обновления экрана включена, а когда выключена.

      Читайте также: