Excel vba withevents как использовать

Обновлено: 06.07.2024

Создать обработчик события для динамически созданного NumericUpDown
Приветствую. Имеется несколько динамически созданных numericupdown-оф, и пользователю нужно.

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

Обработчик событий для динамически связанного запроса в подформе
Добрый день, форумчане! Суть проблемы: Есть главная форма. На ней добавлена область для.

Обработчик событий нескольких контролов?
Вообще-то я программирую на Delphi, а тут понадобилось сделать проект на VBA в Excel и.

dimas5552, определитесь, кнопка называется Button или Command1?
Вся проблема в этом, кажется. Кнопка называется Command1, это можно даже проверить вызвав
А Button это переменная, которая создает эту кнопку. dimas5552, всё работает, если с головой подходить -

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

Например если так:

на форме три кнопки и как у каждой тогда клик узнать? на форме три кнопки и как у каждой тогда клик узнать? Или массив контролов, но первый должен быть на форме по-любому. Либо для каждой кнопки свой обработчик, либо динамически менять обработчик при смене текущей кнопки (т.к. один контрол может быть активным в данный момент) смотри. Апострофф, а что это дает?
dimas5552, можно сделать имитацию массива контролов через класс обертку (возможно это хотел показать уважаемый Апострофф)

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

Добавлено через 1 минуту
Там я для вас лично отвечу на любые вопросы по кнопкам и помогу Вам, до связи !

Не будем повторяться. О методах было сказано уже достаточно. Любая процедура ( Sub ) или функция ( Function ), описанная в разделе методов класса, является его методом. Напомним синтаксис методов класса:

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

  • Один или несколько конструкторов класса, в том числе конструктор по умолчанию, заданный обработчиком события Initialize .
  • Обычно, по паре процедур - свойств, определенных для каждого свойства класса.
  • Метод, задающий печать свойств класса.
  • Метод, позволяющий в диалоге с пользователем определять значения свойств класса, - своеобразный конструктор.
  • Остальные методы, определяющие специфику класса.

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

Внутри класса при реализации операций над рациональными числами доступ к закрытым свойствам объекта, естественно, разрешен, и можно обращаться непосредственно к переменным m и n . Однако нельзя обратиться к закрытым свойствам параметров класса Rational , передаваемых методам Plus , Minus , Mult , Divide . Точно также, нельзя обратиться к свойствам локальных объектов (объекту R ), объявленных внутри методов. Единственный выход состоит в том, чтобы использовать для них Public Property Let и Public Property Get . Но тогда и вне класса можно использовать эти процедуры - свойства, изменяя, например, значение знаменателя дроби. Разрешать этого не хотелось бы.

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

Приведем процедуру, которая работает с рациональными числами:

При ее запуске получены следующие результаты:

Friend методы

Методы класса , в том числе процедуры - свойства Get , Let и Set могут иметь описатель Friend наряду с описателями Public и Private . Каждый из них задает свою область видимости метода, область программы, где метод доступен для вызова. Напомним, Private делает метод видимым только внутри класса, Public - делает метод доступным и область действия может распространяться не только на тот проект, в котором определен данный класс , но и на другие проекты. Чтобы управлять этим процессом, расширяя или сужая область видимости Public объектов, применяют специальные спецификаторы, например, опцию Option Private , которая закрывает модуль от других проектов. Методы с описателем Friend называют дружественными . Описатель Friend , действуя только на один метод, распространяет его область видимости на проект, в котором описан класс с Friend методом. Но для других проектов дружественные методы не доступны, даже в том случае, когда там доступны Public методы. Так что метод дружит только со своим проектом и не более. Кто программировал на С++ и других языках, где есть наследование классов, знаком с дружественными методами, - там они дружат с классами - потомками родительского класса, в котором задан Friend метод. Вне семейства классов дружественные методы не доступны. На VBA роль семейства играет проект.

События

VBA позволяет работать с объектами Office 2000, которым несть числа, и собственными объектами, классы которых мы умеем определять. Большинство из объектов Office 2000 не имеет событий, например, прославленный объект Range имеет множество свойств и методов, но ни одно из событий с ним не связывается. С другой стороны все объекты, предназначенные для организации интерфейса с пользователем, - формы, кнопки, списки и прочие объекты обладают набором событий. Но не только интерфейсные объекты имеют события. Объекты, задающие документы Word и Excel , страницы рабочих книг Excel , объекты Application также имеют встроенный набор событий. Для большинства из них мы подробно рассмотрели, как создаются обработчики событий для конкретных экземпляров. Напомним, есть специальный тип модулей, связанных с объектами, имеющими события, - сюда относятся модули форм, документов и другие. В окне кода этого модуля можно выбрать конкретный объект , выбрать для него возможное событие, построить заготовку обработчика события и наполнить затем ее содержанием. Подробнее об этом сказано в предыдущей лекции, посвященной модулям. Нам осталось рассмотреть две серьезные задачи:

  • Есть важная группа объектов Office 2000, которая обладает встроенным набором событий. Однако эти объекты могут существовать в двух ипостасях, как объекты без событий и объекты с событиями With Events . В эту группу входят, например, объекты Application . По умолчанию эти объекты появляются как объекты, не имеющие событий, поэтому у них нет специального модуля, в окне кода которого можно было бы найти объект, найти список его возможных событий, создать обработчик события. Первая задача состоит в том, чтобы для таких стандартных объектов, классы которых обладают событиями, уметь создавать объекты с событиями ( With Events ), создавать для них модуль, в котором будут появляться заготовки обработчиков событий.
  • Для собственных объектов нужно решить более сложную задачу, - необходимо не только уметь строить обработчики событий, но предварительно в классе определить сам набор возможных событий.

К решению этих двух важных задач мы сейчас и приступим.

Классы, объекты With Events и обработчики событий

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

  • Создать модуль, в котором можно строить обработчики событий:
  • Создать сам объект Excel.Application With Events и связать его с текущим Excel приложением.

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

Модуль класса с объектом WithEvents

Модуль, в котором будут появляться обработчики событий объекта Excel.Application , синтаксически является модулем класса, который нужно создать. Этот класс очень прост по своей структуре и при создании он содержит единственное закрытое свойство - соответствующий объект Application , объявленный со спецификатором WithEvents . Так что в нашем примере все описание создаваемого класса, который назовем, например, ExcelWithEvents сводится к одной содержательной строке:

Как только такое свойство определено в классе, в окне кода этого модуля появляется объект xlApp , обладающий событиями, тут же можно выбрать из списка соответствующее событие, создать заготовку и затем наполнить ее содержанием. Взгляните на соответствующий рисунок:


увеличить изображение
Рис. 4.4. Класс с объектом Excel.Application WithEvents

Мы ограничились созданием двух обработчиков события NewWorkbook и OpenWorkbook . Вот их текст:

Как видите, первая проблема решается достаточно просто и не требует введения новых средств. Но, обратите внимание, остается непонятным, что характеризует наш единственный объект xlApp , - конкретный экземпляр приложения, для которого создаются обработчики событий, или эти обработчики распространяются на множество экземпляров объектов класса ExcelWithEvents Но, поскольку объекты Application присутствуют в одном экземпляре, то не будем сейчас вдаваться в эти тонкости, позже мы еще вернемся к этому вопросу.

Объект WithEvents

Вторая проблема решается также довольно просто. Но здесь есть одна тонкость, которую следует понимать. Реально создаются два объекта, мы называем их двойниками. Один из них это обычный объект Excel.Application , другой - объект Excel.ApplicationWithEvents из класса ExcelWithEvents . Эти два объекта должны быть связаны одной ссылкой. Вот процедура, которая в нашем примере вызывается в документе Word в тот момент, когда пользователь решит начать работу с книгами Excel:

Поверьте, обработчики событий действительно вызывались, как при создании новой книги, так и открытии книги, основанной на существующем шаблоне. Осталось сказать несколько слов о том, как это все могло выглядеть, если всю эту процедуру осуществлять в самом Excel. Обратите внимание, в нашем примере Excel Application с событиями появляется до того, как открыта какая либо из его книг. Если же работать в Excel, то описание объекта с событиями и связывание необходимо поместить в первую из открываемых книг. Мы проделали эту работу и в проекте книги BookOne создали класс ExcelWithEvents , а в одном из стандартных модулей создали процедуру:

Как видите, эта процедура отличается от процедуры CreateExApp лишь незначительными деталями. Возникает вопрос, как и когда запускать эту процедуру. Можно это делать по-разному, например, вызывать ее в обработчике события Click командной кнопки, можно вызывать ее в обработчике события OpenDocument . В последнем случае, обработчики событий объекта Application будут выполняться для всех книг, сразу после открытия книги BookOne.

Макросы – это полноценная программа, просто она выполняется на базе другого приложения. Следовательно, все принципы программирования соблюдаются. А все языки программирования разделяются на две категории: процедурные и объектно-ориентированные.

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

Объектно-ориентированный подход имеет некоторые принципиальные отличия от процедурного. Сейчас этот тип программирования является наиболее популярным. Поэтому его нужно рассмотреть более детально применительно к макросам Excel.

Общие сведения и определения

Все подпрограммы, которые есть в объектно-ориентированном программировании, тесно связаны между собой. Основное понятие, которое нужно знать на этом этапе – это класс.

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

Выражаясь проще, класс – это шаблон, по которому генерируется объект.

  1. Поле. Это такой элемент класса, в котором непосредственно содержатся данные.
  2. Свойство. Это составная часть класса, в которой также хранятся данные, которые в дальнейшем могут быть обработаны.
  3. Метод. По сути та же процедура или функция, просто в рамках класса. Методы – одно из главных понятий любого объектно-ориентированного языка программирования.
  4. Событие. Это ситуация, при которой активируется метод. Это может быть изменение содержимого ячеек или выполнение другого метода.

VBA не является полноценным объектно-ориентированным языком программирования, поскольку в нем есть только два принципа:

  1. Абстракция. С помощью этого метода можно создать объект, который больше всего напоминает некомпьютерный. Например, можно создать объект «собака», в котором будут такие свойства, как «количество ушей», «длина шерсти» и другие.
  2. Инкапсуляция. Она дает возможность спрятать класс от других процедур, которые не используют его в своей работе. Но этот принцип допускает использование отдельных свойств класса другими процедурами, если это требуется.

Как создать класс в VBA

Переходим к практическим аспектам использования классов в языке программирования VBA. Чтобы создать класс, в редакторе нужно нажать на пункт «Class Module», который можно найти в меню «Insert». Далее нужно классу дать определенное имя. Это можно сделать только одним способом – изменить имя, сгенерированное автоматически.

VBA предусматривает возможность спрятать класс от другой книги, если она ссылается на эту. За эту возможность отвечает свойство Instancing. Если его значение выставлено на Private, то этот класс будет обнаруживаться только той книгой, в которой макрос открыт. Если такой макрос открыт на нескольких документах, то класс будет доступен только той книге, к которой он привязан. Если же установить параметр PublicNotCreateable, то класс будет обнаруживаться в том случае, если он создан в книге, но все равно не будет доступен для других книг.

Способы создания экземпляра класса

Итак, под классом подразумевается описание объекта, но не сам объект. Чтобы на основе класса его создать, необходимо воспользоваться одним из доступных способов.

Способ №1

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

Private Sub TestClass()

Dim cl As ExampleClass

Set cl = New ExampleClass End Sub

Способ №2

Dim cl As ExampleClass

Private Sub TestClass()

Set cl = New ExampleClass End Sub

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

Способ №3

Dim cl WithEvents As ExampleClass

Private Sub TestClass()

Set cl = New ExampleClass End Sub

В данном примере объект создается с событиями, и только в связи с ними они становятся доступными. Этот метод имеет ограниченную сферу использования, его можно применять лишь в рамках объектного модуля (например, листа или книги).

Способ №4

Private Sub TestClass()

Dim cl As New ExampleClass

End Sub

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

Как удалить экземпляр класса?

Хорошая привычка – очистить выделенную память, если этот объект уже не нужен. Это позволит значительно увеличить быстродействие макроса. Особенно это важно, если он будет использоваться на слабом компьютере.

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

Set cl = Nothing

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

Как создать поля класса

Созданный нами ранее класс не содержит ничего, ни полей, ни свойств, ни других описанных выше элементов. Следовательно, от него никакой пользы. Поэтому давайте начнем с создания полей класса. Это переменные, которые используются для хранения данных.

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

Но отличаются другим – невозможно указать значение, которое будет отображаться в поле по умолчанию, а также невозможно запретить средствами VBA его редактирование. Информация в поле хранится до того момента, как она не будет перезаписана или же пока существует соответствующая переменная.

Чтобы создать поле, необходимо выполнить такой код.

Dim sBody As String

Также можно воспользоваться таким вариантом кода, который выдает тот же результат.

Private sBody As String

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

Public Head As String

После этих манипуляций становится возможным использование свойства Head у объекта. С ним можно выполнять разные операции, включая запись:

Debug.Print cl.Head

Тип данных для поля строго определен. Поэтому нельзя изменить его на числовой или формат числа с плавающей точкой.

Процесс определения свойств класса

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

Для чтения данных используется функция Property Get, а для записи – Property Let. Конечно, языком предусмотрена еще и третья конструкция –– Property Set, но на практике она используется редко из-за того, что ссылку на другой объект (а именно для этого и нужна указанная функция) можно записать и с помощью процедуры Property Let.

Давайте детальнее опишем синтаксис всех описанных функций. Итак, вот скриншот, описывающий синтаксис функции Property Get.

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

Основы работы с модулями классов

2

При чтении свойства класса нужно учитывать такие нюансы:

  1. С помощью элемента Exit Property осуществляется выход из метода. Допустимо использование сразу нескольких подобных элементов в рамках одного метода. Это может быть полезным, например, если используются циклы и условные операторы.
  2. Несмотря на то, что сама функция Property Get может содержать неограниченное количество процедур внутри, она сама не может быть составной частью других функций.

Теперь давайте более подробно рассмотрим синтаксис функции Property Let. Он виден на этом скриншоте.

Основы работы с модулями классов

3

Этой функции касаются все замечания, рассмотренные выше.

Ну и наконец, как выглядит синтаксис функции Property Set. Несмотря на то, что она считается бесполезной, знать, как с ней работать нужно хотя бы потому, что другой человек может использовать именно ее. И нужно уметь читать чужой код. Сам синтаксис приводится на этом скриншоте.

Основы работы с модулями классов

4

Пример создания свойства в модуле класса

А теперь давайте детальнее рассмотрим некоторые практические примеры. Будем приводить фрагменты кода с краткими пояснениями.

Основы работы с модулями классов

5

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

Теперь давайте взглянем немного на другой фрагмент кода.

Основы работы с модулями классов

6

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

Основы работы с модулями классов

7

В этом примере свойство не может быть отредактировано, и в нем содержится постоянное значение (константа). Ее можно открыть только из модуля, который находится в данном объекте. Если мы попробуем использовать конструкцию Public Const sHeight As Single = 2, то у нас ничего не получится.

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

Методы класса

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

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

События класса

Внутри каждого класса содержится уже несколько событий:

  1. Class_Initialize. Событие, которое осуществляется в момент создания класса. Здесь можно легко настроить значения переменных и свойств, которые будут использоваться всегда, если не указано обратное.
  2. Class_Terminate. Это событие происходит, когда объект удаляется. Это происходит в двух случаях. Первый – деинициализация объекта. Второй – прекращение работы той процедуры, в рамках которой был объявлен класс.

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

Само же событие указывается в рамках самого модуля.

Синтаксис конструкции, с помощью которой происходит объявление события, следующий.

Основы работы с модулями классов

9

Выводы

Конечно, это нелегкая тема для понимания. Но это всего лишь два принципа объектно-ориентированного программирования. В случае же с другими языками все еще сложнее. VBA вообще-то считается очень легким языком. Поэтому если приложить должное упорство, все должно получиться. Успехов.


Когда мы пишем огромные коды, мы всегда попадаем в ловушку VBA. Когда код большой, VBA тратит свое время на завершение запуска и выполнения процесса. Что может занять время от минуты до нескольких минут. Это период времени, когда все раздражаются. И мы не можем больше ничего делать в этот период времени. Но чтобы избежать этого, у нас в VBA есть функция DoEvents. С помощью DoEvents мы можем запускать код в фоновом режиме, и одновременно мы можем делать и другие вещи. Мы можем не только работать с другим инструментом или программным обеспечением, но также можем прерывать код или останавливаться между процессами исполнения.

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

Как использовать функцию DoEvents в Excel VBA?

Ниже приведены различные примеры использования функции DoEvents в Excel с использованием кода VBA.

Вы можете скачать этот шаблон VBA DoEvents Excel здесь - Шаблон VBA DoEvents Excel

Excel VBA DoEvents - Пример № 1

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

Шаг 1: Откройте модуль в VBA из вкладки меню Вставка, как показано ниже.


Шаг 2: Напишите подпроцедуру VBA DoEvents, или мы можем выбрать любое имя, чтобы определить код в соответствии с нашими потребностями.

Код:


Шаг 3: Теперь определите переменную в любом имени с типами данных Long. Цель рассматривать тип данных как Long, потому что мы будем брать любую длину данных, которую мы хотим, что невозможно, если мы рассмотрим Integer.

Код:


Шаг 4: Теперь откройте цикл For-Next, в который мы поместим условия.

Код:


Шаг 5: Рассмотрите диапазон числа по вашему выбору, который может быть замечен при реализации. Здесь мы берем диапазон от 1 до 2000 в определенной переменной A.

Код:


Шаг 6: Как только мы определим диапазон чисел, мы выберем диапазон ячеек, где мы увидим изменения в числах, которые мы выбрали выше. Допустим, диапазон ячеек от А1 до А5. Это может быть и отдельная клетка.

Код:


Шаг 7: Теперь запустите код, нажав кнопку Play, расположенную под строкой меню.

Мы увидим, что код завершился печатью чисел от 1 до 20000, но мы не смогли это остановить.

Шаг 8: Чтобы получить полный контроль над кодом, примените DoEvents после условий цикла, как показано ниже.

Код:


Шаг 9: Теперь снова запустите код. И в это время мы пытаемся остановить код, нажав кнопку «стоп», и мы заметим, что код будет остановлен между процессами до завершения пробной версии 20000.

Excel VBA DoEvents - Пример № 2

Существует другой тип процесса для реализации DoEvents. Но для этого нам также понадобится огромный код, как показано в примере-1. Для этого выполните следующие шаги:

Шаг 1: Напишите подпроцедуру VBA DoEvents, как показано ниже.

Код:


Шаг 2: Непосредственно открыть цикл For-next без определения переменной.

Код:


Шаг 3: Выберите диапазон номеров, который будет работать. Пусть диапазон будет от 1 до 20000, как в примере-1.

Код:


Шаг 4: Теперь непосредственно поместите любую работу для вывода, скажем, вывод такой, как показано ниже. И диапазон значений будет +1 от фактического значения.

Код:


Шаг 5: Теперь выберите диапазон, в котором мы хотим увидеть результат. Пусть клетка будет A1.

Код:


Шаг 6: И наконец, мы поставим DoEvents в конце условия цикла For.

Код:


Шаг 7: Затем запустите код, нажав клавишу F5. Мы увидим, что мы можем делать что угодно, даже когда код работает. Для демонстрации я выбрал ячейки B1 и C1. Цифры достигли только 4348, что намного меньше установленного нами лимита.


Шаг 8: Если мы удалим DoEvents и запустим код, мы не сможем ничего сделать, пока код не завершит свой процесс. Давайте посмотрим это тоже.

Код:


Шаг 9: Теперь запустите код снова. Как мы видим, пока мы пытались нажать «Стоп», код не останавливался. И функция воспроизведения все еще была включена.

Плюсы и минусы Excel VBA DoEvents

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

То, что нужно запомнить

  • Если мы делаем что-либо без применения DoEvents, то существует большая вероятность того, что код сделает систему и файл заблокированными. И что мы либо возобновим файлы после того, как код будет полностью запущен, либо сломаем файл несколькими щелчками мыши.
  • Мы можем видеть изменения в процессе, одновременно работая над другой работой.
  • После завершения кода сохраните файл в формате Excel с поддержкой макросов, чтобы избежать потери кода.
  • Попробуйте применить код в огромном и большом наборе кодирования, там мы увидим фактическую реализацию и использование.

Рекомендуемые статьи

Это руководство по VBA DoEvents. Здесь мы обсуждаем, как использовать функцию DoEvents в Excel с использованием кода VBA, а также с практическими примерами и загружаемым шаблоном Excel. Вы также можете просмотреть наши другие предлагаемые статьи -

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