EnableEvents Property of Application Object VBA
EnableEvents Application Property in Excel VBA is used to enable events for the specified object. It has Boolean value that is either True or False. Please find more details about EnableEvents Application Property in the following section. When EnableEvents property set to True, while running any procedure it will enable the events.
- VBA EnableEvents Application Property – Syntax
- VBA EnableEvents Application Property: Example 1
- VBA EnableEvents Application Property- Instructions
VBA EnableEvents Application Property – Syntax
Here is the syntax for EnableEvents Property of application object in Excel VBA.
Application. EnableEvents
Where EnableEvents as String.
In the above syntax Application represents object and EnableEvents is the Property of Application object.
VBA EnableEvents Application Property: Example 1
Please find the below example for EnableEvents Property of application object in excel VBA. The below example disables the event and saves the workbook. So that the events cannot perform any task.
Sub Appl_EnableEvents() Application.EnableEvents = False ThisWorkbook.Save Application.EnableEvents = True End Sub
VBA EnableEvents Application Property – Instructions
Please follow the below steps to execute the VBA code to save the excel file.
Step 1: Open any existing Excel Application.
Step 2: Press Alt+F11 – This will open the VBA Editor Window.
Step 3: Insert a code module from then insert menu.
Step 4: Copy the above code and paste in the code module which have inserted in the above step.
Step 5: Now press F5 to execute the code.
A Powerful & Multi-purpose Templates for project management. Now seamlessly manage your projects, tasks, meetings, presentations, teams, customers, stakeholders and time. This page describes all the amazing new features and options that come with our premium templates.
Save Up to 85% LIMITED TIME OFFER
All-in-One Pack
120+ Project Management Templates
Essential Pack
50+ Project Management Templates
Excel Pack
50+ Excel PM Templates
PowerPoint Pack
50+ Excel PM Templates
MS Word Pack
25+ Word PM Templates
Ultimate Project Management Template
Ultimate Resource Management Template
Project Portfolio Management Templates
-
-
- In this topic:
-
- VBA EnableEvents Application Property – Syntax
- VBA EnableEvents Application Property: Example 1
- VBA EnableEvents Application Property – Instructions
VBA Reference
Effortlessly
Manage Your Projects
120+ Project Management Templates
Seamlessly manage your projects with our powerful & multi-purpose templates for project management.
120+ PM Templates Includes:
One Comment
-
Hans Schulze
May 19, 2020 at 9:07 AM — ReplyEnable WHAT events? Multithreading? Examples?
Effectively Manage Your
Projects and Resources
ANALYSISTABS.COM provides free and premium project management tools, templates and dashboards for effectively managing the projects and analyzing the data.
We’re a crew of professionals expertise in Excel VBA, Business Analysis, Project Management. We’re Sharing our map to Project success with innovative tools, templates, tutorials and tips.
Project Management
Excel VBA
Download Free Excel 2007, 2010, 2013 Add-in for Creating Innovative Dashboards, Tools for Data Mining, Analysis, Visualization. Learn VBA for MS Excel, Word, PowerPoint, Access, Outlook to develop applications for retail, insurance, banking, finance, telecom, healthcare domains.
Page load link
Go to Top
Application.EnableEvents is a property in Excel VBA where you can specify whether you want events to take place when the VBA code is running or not.
An event is usually attached to an object. VBA Events could include things such as activating a worksheet or saving a workbook or double-clicking on a cell.
Excel VBA allows you to create event-specific code, where you can specify what code to run in case the user double-clicks on a cell. In this case, this would be the double-click event.
Similarly, you can have a code that is run as soon as a new worksheet is activated in the workbook.
Now, these events are useful, but sometimes you may not want them to work.
For example, if you’re running a code that will activate and loop through all the open worksheets one by one, you may not want to execute the event code (in case you have it) when each sheet is activated.
In such cases, you can set the Application.EnableEvents property to false, making sure the events are turned off when the code is running.
Now that you have a better understanding of what Application.EnableEvents does (I hope), let’s see the syntax and some examples.
Below is the syntax of the Application.Events
Application.Events
where, the application is the object (when using this in Excel VBA, Excel is the application), and Events is the property.
So you can set the Application.Events property to either True or False.
Application.Events = True
or
Application.Events = False
When you set this to TRUE, events will run as usual in Excel VBA, and if you set this to FALSE, events would stop working (for the whole VBA).
One caveat here is that if you set this to FALSE, remember to set it back to TRUE again (which is the default and expected behavior of this property)
Now let’s see an example of how to use it
Application.EnableEvents Example
Below is a code where the main code is flanked by the Application.EnableEvents property.
Sub ExampleCode() Application.EnableEvents = False ThisWorkbook.Save Application.EnableEvents = True End Sub
In the above code, the ThisWorkbook.Save is flanked by Application.EnableEvents properties being set first to FALSE and then to TRUE.
When you run this code, in case there are any events associated with the workbook getting saved, it will not be run. And since you have set the property back to TRUE in the last line, this will not impact other macros in your workbook.
Note: In case you’re calling other subroutines from one of the subroutines that use Application.EnableEvents, you need to remember to make sure you turn it back on. Also, remember that when you run this code and in case of Excel finds any errors while the code is running, the last line will not be executed (and Application.EnableEvents will not get back to TRUE).
Application.EnableEvents Not Working
Remember that Application.EnableEvents would not work with Userforms events and controls.
Here is an article that talks about some of the disadvantages of using Application.EnableEvents and an alternative way to handle events in Excel VBA.
So this is all that you needed to know about the Application.EnableEvents property in Excel VBA.
Hope you found this tutorial useful!
Other Excel tutorials you may like:
- How to Remove Macros from Excel? 3 Simple Methods
- How to Delete a Sheet in Excel Using VBA
- How to Unhide All Rows in Excel with VBA
- Using Application.GetSaveAsFilename in VBA in Excel (Examples)
- SetFocus in Excel VBA – How to Use it?
- How to Open Excel Files Using VBA
- Subscript Out of Range Error in VBA – How to Fix!
Чем больше познаём мы макросы, тем интересней выгледят наши программы. А бывает, что их выполнение происходит очень долго, при сложных и долгих математических расчётах или составлении каких-то отчётов и табилц. В ходе выполнения макроса на мониторе происходит мелькание различных окон, открытие и закрытие книг, и прочая светомузыка. Для того чтобы этого не происходило, и чтобы время выполнение нашего макроса сократить раз в 100, можно воспользоваться командами описанные ниже.
Application.ScreenUpdating
Application.ScreenUpdating — отвечает за обновление экрана и может принимать два значения — False (обновление экрана отключено) и True (обновление экрана включено). В коде это обычно прописывается в том месете, где происходит мелькание различных окон или видно как производится расчёт и происходит заполнение таблицы. Ниже показан пример заполнения ячеек, и данную команду вставили в начало и конец макроса, т.е. сначала отключаем обновление экрана, а потом включаем обновление экрана. При такой записи мы не увидим процесс заполнения ячеек. А вот если убрать эти команды, то мы сможем наблюдать за процессом заполнения этих ячеек.
Sub Primer()
Application.ScreenUpdating = False
For a = 1 To 100
For b = 1 To 100
Cells(a, b) = «Пример»
Next b
Next a
Application.ScreenUpdating = True
End Sub
Application.Calculation
Application.Calculation — отвечает за автоматический расчёт в книге Excel и может принимать два значения — xlCalculationManual(ручной расчёт) и xlCalculationAutomatic (автоматический расчёт — по умолчанию установлен в Excel). Но тут есть одна осторожность, если вы перевели Excel в ручной расчёт, и в макросе произошла ошибка и он так и не выполнился до конца — т.е. не включился автоматический расчёт формул, то все ваши вычисления в дальнейшем будут в пустую. Так как формулы не будут автоматически пересчитываться, Excel превратиться в обычную таблицу. Но данная команда играет одну из основных ролей в быстроте выполнеия макроса. Вообщем лучше сделать код, который исключает ошибки, чтобы макрос полюбому выполнился и Excel перевёлся в автоматический расчёт. Если у Вас имеется большая таблица с многочисленными формулами, и часть вычислений вы производите при помощи макросов, то для быстроты выполнения расчётов разумно в начало и конец кода поместить команду Application.Calculation.
Sub Primer2()
Application.Calculation = xlCalculationManual
……………….
……………….
……………….
Application.Calculation = xlCalculationAutomatic
End Sub
Application.EnableEvents
Application.EnableEvents — команда отвечающая за выполнение сторонних событий. Эту команду мы уже затрагивали в этом уроке. И она также может принимать два значения — это False (отключить собтие) и True (включить выполнение промежуточных событий). Но теперь ещё известно, что она играет значительную роль в скорости выполнения некоторых кодов макроса. Пример можно взять из Урока №23.
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
Target.Cells = «Привет»
Application.EnableEvents = True
End Sub
ActiveSheet.DisplayPageBreaks
ActiveSheet.DisplayPageBreaks — отображение границ листа. Может принимать два значения — False (отключить отображение границ) и True (включить отображение границ). Не знаю как это помогает на скорости выполнения макроса, лично я этого не ущутил, но некоторые говорят, что помогает. Я вообще не люблю когда отображаются границы листа, мне кажется, что это нужно только при распечатке. Помещать этот код можно в начало и конец макроса.
Private Sub Worksheet_Change(ByVal Target As Range)
ActiveSheet.DisplayPageBreaks = False
…………………….
…………………….
…………………….
ActiveSheet.DisplayPageBreaks = True
End Sub
Application.DisplayStatusBar
Application.DisplayStatusBar — строка состояния. Может принимать два значения — False (отключить строку состояния) и True (включить строку состояния). При выполнении макросов в строке состояния отображаются все происходяще события. Для того чтобы не тратить время на просчёт событий и прорисовку их в статусбаре, отключаем её на время выполнения макроса, и включаем её когда макрос закончил выполняться.
Private Sub Worksheet_Change(ByVal Target As Range)
Application.DisplayStatusBar = False
…………………….
…………………….
…………………….
Application.DisplayStatusBar = True
End Sub
Application.DisplayAlerts
Application.DisplayAlerts — команда, отвечающая за события в Excel. Может принимать два значения — False (отключаем запросы Excel) и True (включаем события Excel). Это чень интересная и полезная команда при помощи, которой можно отключить запросы Excel, например, чтобы он не спрашивал нужно ли сохранить изменения в книге, или отключить запрос на совместимость версий Excel. Ниже приведён пример, в котором книга закрывает сама себя, при этом независимо от того внесли вы изменения или нет в книгу, при закрытии книги вам не поступит запрос «Сохранить изменения», а книга просто закроется без сохранения и уведомления пользователя.
Sub Primer()
Application.DisplayAlerts = False
ThisWorkbook.Close
Application.DisplayAlerts = True
End Sub
Глобальное ускорение
Из всего выше сказанного можно сделать вывод, что для ускорения работы макроса можно воспользоваться нужными нам командами, теми которые подходят в нашем случае. Бывает, что код очень сложный и включает в себе различные математические и другие операции и использовать можно несколько команд сразу как показано на этом примере:
sub Primer()
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
Application.DisplayStatusBar = False
Application.DisplayAlerts = False
…………………….
…………………….
…………………….
…………………….
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
Application.DisplayStatusBar = True
Application.DisplayAlerts = True
End Sub
title | keywords | f1_keywords | ms.prod | api_name | ms.assetid | ms.date | ms.localizationpriority |
---|---|---|---|---|---|---|---|
Application.EnableEvents property (Excel) |
vbaxl10.chm133240 |
vbaxl10.chm133240 |
excel |
Excel.Application.EnableEvents |
5e14ce7b-02f6-03d4-2dfc-1df05a032301 |
04/04/2019 |
medium |
Application.EnableEvents property (Excel)
True if events are enabled for the specified object. Read/write Boolean.
Syntax
expression.EnableEvents
expression A variable that represents an Application object.
Example
This example disables events before a file is saved so that the BeforeSave event doesn’t occur.
Application.EnableEvents = False ActiveWorkbook.Save Application.EnableEvents = True
[!includeSupport and feedback]
На чтение 31 мин. Просмотров 19.3k.
Когда вы создаете или записываете макрос в Excel, вам нужно запустить макрос, чтобы выполнить шаги в коде.
Несколько способов запуска макроса включают использование диалогового окна макроса, назначение макроса кнопке, использование ярлыка и т.д.
Помимо этих запускаемых пользователем макросов, вы также можете использовать события VBA для запуска макроса.
Содержание
- События Excel VBA — Введение
- Различные типы событий Excel VBA
- Где поставить код, связанный с событием
- Понимание последовательности событий
- Понимание роли аргументов в событиях VBA
- События на уровне рабочей книги (поясняются примерами)
- События уровня рабочего листа (объясненные с примерами)
- Событие Excel VBA OnTime
- Событие Excel VBA OnKey
- Отключение событий в VBA
- Влияние событий Undo Stack
Позвольте мне сначала объяснить, что такое событие в VBA.
Событие — это действие, которое может инициировать выполнение указанного макроса.
Например, когда вы открываете новую книгу, это событие. Когда вы вставляете новый лист, это событие. Если дважды щелкнуть ячейку, это событие.
В VBA есть много таких событий, и вы можете создавать коды для этих событий. Это означает, что как только происходит событие, и если вы указали код для этого события, этот код будет немедленно выполнен.
Excel автоматически сделает это, как только заметит, что событие произошло. Таким образом, вам нужно только написать код и поместить его в правильную подпрограмму события (это будет описано далее в этой статье).
Например, если вы вставляете новый лист и хотите, чтобы он имел префикс года, вы можете написать для него код.
Теперь, когда кто-нибудь вставляет новый лист, этот код будет автоматически выполняться и добавлять префикс года к имени листа.
Другой пример: вы хотите изменить цвет ячейки, когда кто-то дважды щелкает по ней. Вы можете использовать событие двойного щелчка для этого.
Точно так же вы можете создавать коды VBA для многих таких событий (рассмотрим позже в этой статье).
Ниже приведена краткая картинка, показывающая событие двойного щелчка в действии. Как только я дважды щелкну по ячейке A1. Excel мгновенно открывает окно сообщения, в котором отображается адрес ячейки.
Двойной щелчок — это событие, а отображение окна сообщения — это то, что я указал в коде, когда происходит событие двойного щелчка.
Хотя приведенный выше пример является бесполезным событием, я надеюсь, что он поможет вам понять, как это происходит.
Различные типы событий Excel VBA
В Excel есть разные объекты — например, сам Excel (к которому мы часто обращаемся как приложение), рабочие книги, рабочие таблицы, диаграммы и т.д.
Каждый из этих объектов может иметь различные события, связанные с ним. Например:
- Если вы создаете новую книгу, это событие уровня приложения.
- Если вы добавляете новый лист, это событие уровня книги.
- Если вы измените значение в ячейке на листе, это событие уровня рабочего листа.
Ниже приведены различные типы событий, которые существуют в Excel:
- События уровня рабочего листа. Это типы событий, которые запускаются на основе действий, выполненных в рабочем листе. Примеры этих событий включают изменение ячейки на рабочем листе, изменение выделения, двойной щелчок по ячейке, щелчок правой кнопкой мыши по ячейке и т.д.
- События на уровне рабочей книги. Эти события будут инициироваться на основе действий на уровне рабочей книги. Примеры таких событий включают добавление новой рабочей таблицы, сохранение рабочей книги, открытие рабочей книги, печать части или всей рабочей книги и т.д.
- События уровня приложения: это события, которые происходят в приложении Excel. Примером этого может быть закрытие любой из открытых рабочих книг или открытие новой рабочей книги.
- События уровня пользовательской формы: эти события будут инициироваться на основе действий в пользовательской форме. Примеры этого включают инициализацию пользовательской формы или нажатие кнопки в пользовательской форме.
- События диаграммы: это события, относящиеся к листу диаграммы. Лист диаграммы отличается от рабочего листа. Примеры таких событий могут включать изменение серии диаграммы или изменение размера диаграммы.
- События OnTime и OnKey. Это два события, которые не соответствуют ни одной из перечисленных выше категорий. Поэтому я перечислил их отдельно. Событие «OnTime» позволяет вам выполнить код в определенное время или по истечении определенного времени. Событие «OnKey» позволяет выполнить код, когда используется определенное нажатие клавиши (или комбинация нажатий клавиш).
Где поставить код, связанный с событием
В приведенном выше разделе я рассмотрел различные типы событий.
В зависимости от типа события вам необходимо поместить код в соответствующий объект.
Например, если это событие, связанное с рабочим листом, оно должно идти в окне кода объекта рабочего листа. Если она связана с книгой, она должна идти в окне кода для объекта книги.
В VBA разные объекты — такие как Worksheets, Workbooks, Chart Sheets, UserForms и т.д. Имеют собственные окна кода. Вам необходимо поместить код события в окно кода соответствующего объекта. Например, если это событие уровня рабочей книги, вам нужно иметь код события в окне кода рабочей книги.
Следующие разделы охватывают места, где вы можете поместить код события:
В окне кода Worksheet
Когда вы откроете VB Editor (используя сочетание клавиш ALT + F11), вы заметите объект рабочих таблиц в Project Explorer. Для каждого листа в книге вы увидите один объект.
Если дважды щелкнуть объект листа, в который вы хотите поместить код, откроется окно кода для этого листа.
Хотя вы можете начать писать код с нуля, гораздо лучше выбрать событие из списка параметров и позволить VBA автоматически вставить соответствующий код для выбранного события.
Для этого вам нужно сначала выбрать рабочий лист из выпадающего списка в левом верхнем углу окна кода.
После выбора рабочего листа из выпадающего списка вы получите список всех событий, связанных с рабочим листом. Вы можете выбрать тот, который вы хотите использовать, из выпадающего списка в правом верхнем углу окна кода.
Как только вы выберете событие, оно автоматически введет первую и последнюю строку кода для выбранного события. Теперь вы можете добавить свой код между двумя строками.
Примечание. Как только вы выберете «Worksheet» в раскрывающемся списке, вы увидите две строки кода в окне кода. После того, как вы выбрали событие, для которого вы хотите код, вы можете удалить строки, которые появились по умолчанию.
Обратите внимание, что каждый лист имеет собственное окно кода. Когда вы вводите код для Лист1, он будет работать только в том случае, если событие происходит в Лист1.
В окне кода ThisWorkBook
Точно так же как рабочие листы, если у вас есть код события уровня книги, вы можете поместить его в окно кода ThisWorkbook.
Когда вы дважды щелкните на ThisWorkbook, он откроет окно кода для него.
Вам нужно выбрать Workbook из выпадающего списка в верхнем левом углу окна кода.
После выбора Workbook из выпадающего списка вы получите список всех событий, связанных с Workbook. Вы можете выбрать тот, который вы хотите использовать, из выпадающего списка в правом верхнем углу окна кода.
Как только вы выберете событие, оно автоматически введет первую и последнюю строку кода для выбранного события. Теперь вы можете добавить свой код между двумя строками.
Примечание. Как только вы выберете Workbook из выпадающего списка, вы увидите две строки кода в окне кода. После того, как вы выбрали событие, для которого вы хотите код, вы можете удалить строки, которые появились по умолчанию.
В окне кода Userform
Когда вы создаете пользовательские формы в Excel, вы также можете использовать события пользовательской формы для выполнения кодов на основе определенных действий. Например, вы можете указать код, который будет выполняться при нажатии кнопки.
Хотя объекты Sheet и ThisWorkbook уже доступны при открытии редактора VB, пользовательская форма — это то, что вам нужно создать в первую очередь.
Чтобы создать пользовательскую форму, щелкните правой кнопкой мыши любой из объектов, перейдите на вкладку «Вставка» и выберите «UserForm».
Это вставит объект UserForm в книгу.
Если дважды щелкнуть пользовательскую форму (или любой объект, который вы добавляете в пользовательскую форму), откроется окно кода для пользовательской формы.
Теперь, так же как рабочие листы или ThisWorkbook, вы можете выбрать событие, и оно вставит первую и последнюю строку для этого события. И тогда вы можете добавить код в середине этого.
В окне кода Chart
В Excel вы также можете вставлять листы диаграмм (которые отличаются от листов). Лист диаграмм должен содержать только диаграммы.
Вставив лист диаграммы, вы сможете увидеть объект листа диаграммы в редакторе VB.
Вы можете добавить код события в окно кода листа диаграммы, как мы это делали на листе.
Дважды щелкните объект листа Chart в Project Explorer. Это откроет окно кода для листа диаграммы.
Теперь вам нужно выбрать Chart из выпадающего списка в верхнем левом углу окна кода.
После выбора Chart из выпадающего списка вы получите список всех событий, связанных с листом Chart. Вы можете выбрать тот, который вы хотите использовать, из выпадающего списка в правом верхнем углу окна кода.
Примечание. Как только вы выберете Chart из выпадающего списка, вы заметите две строки кода в окне кода. После того, как вы выбрали событие, для которого вы хотите код, вы можете удалить строки, которые появились по умолчанию.
В Class Module
Class Module должны быть вставлены так же, как пользовательские формы.
Модуль класса может содержать код, связанный с приложением, которым может быть сам Excel и встроенные диаграммы.
Я расскажу о модуле класса в качестве отдельного учебного пособия в ближайшие недели.
Обратите внимание, что кроме событий OnTime и OnKey, ни одно из перечисленных выше событий не может быть сохранено в обычном модуле VBA.
Понимание последовательности событий
Когда вы запускаете событие, оно не происходит изолированно. Это также может привести к последовательности нескольких триггеров.
Например, когда вы вставляете новый лист, происходит следующее:
- Добавлен новый рабочий лист
- Предыдущая рабочая таблица деактивируется
- Новый лист активируется
Хотя в большинстве случаев вам не нужно беспокоиться о последовательности, если вы создаете сложные коды, основанные на событиях, лучше знать последовательность, чтобы избежать неожиданных результатов.
Понимание роли аргументов в событиях VBA
Прежде чем мы перейдем к примерам событий и удивительным вещам, которые вы можете с ним сделать, я должен рассмотреть одну важную концепцию.
В событиях VBA было бы два типа кодов:
- Без каких-либо аргументов
- С аргументами
И в этом разделе я хочу быстро осветить роль аргументов.
Ниже приведен код без аргументов (круглые скобки пусты):
Private Sub Workbook_Open() MsgBox "Не забудьте заполнить расписание" End Sub
С помощью приведенного выше кода, когда вы открываете рабочую книгу, она просто показывает окно сообщения с сообщением — «Не забудьте заполнить расписание».
Теперь давайте посмотрим на код, который имеет аргумент.
Private Sub Workbook_NewSheet(ByVal Sh As Object) Sh.Range("A1") = Sh.Name End Sub
Приведенный выше код использует аргумент Sh, который определен как тип объекта. Аргумент Sh может быть рабочим листом или листом диаграммы, так как указанное выше событие вызывается при добавлении нового листа.
Присвоив новый лист, который добавляется к книге, объектной переменной Sh, VBA позволил нам использовать его в коде. Поэтому, чтобы обратиться к новому названию листа, я могу использовать Sh.Name.
Концепция аргументов будет полезна при ознакомлении с примерами событий VBA в следующих разделах.
События на уровне рабочей книги (поясняются примерами)
Ниже приведены наиболее часто используемые события в книге.
Событие | Что запускает событие |
Activate | Когда книга активирована |
AfterSave | Когда книга установлена как надстройка |
BeforeSave | Когда рабочая книга сохранена |
BeforeClose | Когда рабочая книга закрыта |
BeforePrint | Когда печатается книга |
Deactivate | Когда книга деактивирована |
NewSheet | Когда добавляется новый лист |
Open | Когда рабочая книга открыта |
SheetActivate | Когда любой лист в книге активирован |
SheetBeforeDelete | При удалении любого листа |
SheetBeforeDoubleClick | При двойном щелчке по любому листу |
SheetBeforeRightClick | При щелчке правой кнопкой мыши по любому листу |
SheetCalculate | Когда любой лист рассчитывается или пересчитывается |
SheetDeactivate | Когда рабочая книга деактивирован |
SheetPivotTableUpdate | При обновлении книги |
SheetSelectionChange | При изменении рабочей книги |
WindowActivate | Когда книга активирована |
WindowDeactivate | Когда книга деактивирована |
Обратите внимание, что это не полный список.
Помните, что код для события Workbook хранится в окне кода объектов ThisWorkbook.
Теперь давайте посмотрим на некоторые полезные события из рабочей книги и посмотрим, как они могут быть использованы в вашей повседневной работе.
Событие Workbook Open
Допустим, вы хотите показать пользователю дружеское напоминание, чтобы заполнять его расписания при каждом открытии определенной рабочей книги.
Вы можете использовать приведенный ниже код, чтобы сделать это:
Private Sub Workbook_Open() MsgBox "Не забудьте заполнить расписание" End Sub
Теперь, как только вы откроете рабочую книгу с этим кодом, она покажет вам окно сообщения с указанным сообщением.
При работе с этим кодом (или с кодами событий рабочей книги в целом) необходимо знать несколько вещей:
- Если в книге есть макрос, и вы хотите сохранить его, вам нужно сохранить его в формате .XLSM. В противном случае код макроса будет потерян.
- В приведенном выше примере код события будет выполняться только при включенных макросах. Может появиться желтая полоса, запрашивающая разрешение на включение макросов. Пока это не включено, код события не выполняется.
- Код события Workbook помещается в окно кода объекта ThisWorkbook.
Вы можете дополнительно уточнить этот код и показать сообщение только пятницы.
Код ниже сделает это:
Private Sub Workbook_Open() wkday = Weekday(Date) If wkday = 6 Then MsgBox "Не забудьте заполнить расписание" End Sub
Обратите внимание, что в функции «Weekday» воскресенье присваивается значение 1, понедельник — 2 и т. Д.
Поэтому на пятницу я использовал 6.
Событие Open Workbook может быть полезно во многих ситуациях, таких как:
- Когда вы хотите показать приветственное сообщение человеку, когда книга открыта.
- Когда вы хотите отобразить напоминание, когда рабочая книга открыта.
- Если вы хотите всегда активировать один конкретный лист в книге, когда она открыта.
- Когда вы хотите открыть связанные файлы вместе с книгой.
- Если вы хотите фиксировать дату и время каждый раз, когда открывается рабочая книга.
Событие Workbook NewSheet
Событие NewSheet запускается при вставке нового листа в рабочую книгу.
Допустим, вы хотите ввести значение даты и времени в ячейку A1 вновь вставленного листа. Вы можете использовать приведенный ниже код, чтобы сделать это:
Private Sub Workbook_NewSheet(ByVal Sh As Object) On Error Resume Next Sh.Range("A1") = Format(Now, "dd-mmm-yyyy hh:mm:ss") End Sub
Приведенный выше код использует «On Error Resume Next» для обработки случаев, когда кто-то вставляет лист диаграммы, а не лист. Поскольку на листе диаграммы нет ячейки A1, будет отображаться ошибка, если «On Error Resume Next» не используется.
Другой пример может быть, когда вы хотите применить некоторые базовые настройки или форматирование к новому листу, как только он будет добавлен. Например, если вы хотите добавить новый лист и хотите, чтобы он автоматически получал серийный номер (до 100), то вы можете использовать код ниже.
Private Sub Workbook_NewSheet(ByVal Sh As Object) On Error Resume Next With Sh.Range("A1") .Value = "S. No." .Interior.Color = vbBlue .Font.Color = vbWhite End With For i = 1 To 100 Sh.Range("A1").Offset(i, 0).Value = i Next i Sh.Range("A1", Range("A1").End(xlDown)).Borders.LineStyle = xlContinuous End Sub
Приведенный выше код также немного форматирует. Это дает ячейке заголовка синий цвет и делает шрифт белым. Это также применяет границу ко всем заполненным ячейкам.
Приведенный выше код является примером того, как короткий код VBA может помочь вам украсть несколько секунд каждый раз, когда вы вставляете новый лист (на случай, если вам придется каждый раз это делать).
Событие Workbook BeforeSave
Событие «BeforeSave» запускается при сохранении книги. Обратите внимание, что событие инициируется сначала, а затем рабочая книга сохраняется.
При сохранении книги Excel возможны два сценария:
- Вы сохраняете его в первый раз, и он покажет диалоговое окно Сохранить как.
- Вы уже сохранили его ранее, и он просто сохранит и перезапишет изменения в уже сохраненной версии.
Теперь давайте рассмотрим несколько примеров, где вы можете использовать событие BeforeSave.
Предположим, у вас есть новая книга, которую вы сохраняете впервые, и вы хотите напомнить пользователю о необходимости сохранить ее на диске K, затем вы можете использовать следующий код:
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) If SaveAsUI Then MsgBox "Сохраните этот файл на диске K" End Sub
В приведенном выше коде, если файл никогда не был сохранен, SaveAsUI имеет значение True и вызывает диалоговое окно Save As. Приведенный выше код будет отображать сообщение до появления диалогового окна «Save As».
Другим примером может быть обновление даты и времени, когда файл сохраняется в определенной ячейке.
Приведенный ниже код вставляет отметку даты и времени в ячейку A1 листа She1 при каждом сохранении файла.
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) Worksheets("Лист1").Range("A1") = Format(Now, "dd-mmm-yyyy hh:mm:ss") End Sub
Обратите внимание, что этот код выполняется, как только пользователь сохраняет рабочую книгу. Если книга сохраняется в первый раз, в ней отобразится диалоговое окно «Save As». Но код уже выполняется к тому времени, когда вы видите диалоговое окно Save As. На этом этапе, если вы решите отменить и не сохранить книгу, дата и время уже будут введены в ячейку.
Событие Workbook BeforeClose
Событие «BeforeClose» происходит непосредственно перед закрытием книги.
Приведенный ниже код защищает все рабочие листы до их закрытия.
Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim sh As Worksheet For Each sh In ThisWorkbook.Worksheets sh.Protect Next sh End Sub
Помните, что код события срабатывает, как только вы закрываете книгу.
Об этом событии важно знать, что не имеет значения, закрыта ли рабочая книга или нет.
В случае, если рабочая книга не была сохранена, и вы увидите приглашение с вопросом о том, сохранять рабочую книгу или нет, и вы нажмете Отмена, она не сохранит вашу рабочую книгу. Однако код события уже был бы выполнен к тому времени.
Событие Workbook BeforePrint
Когда вы даете команду печати (или команду предварительного просмотра), запускается событие «BeforePrint».
Приведенный ниже код будет пересчитывать все рабочие листы до их печати.
Private Sub Workbook_BeforePrint(Cancel As Boolean) For Each ws in Worksheets ws.Calculate Next ws End Sub
Когда пользователь печатает книгу, событие вызывается независимо от того, печатает ли он всю книгу или только ее часть.
Другой пример, приведенный ниже, — это код, который добавляет дату и время в нижний колонтитул при печати рабочей книги.
Private Sub Workbook_BeforePrint(Cancel As Boolean) Dim ws As Worksheet For Each ws In ThisWorkbook.Worksheets ws.PageSetup.LeftFooter = "Напечатано - " & Format(Now, "dd-mmm-yyyy hh:mm") Next ws End Sub
События уровня рабочего листа (объясненные с примерами)
События рабочего листа происходят на основе триггеров в рабочем листе.
Ниже приведены наиболее часто используемые события на листе.
Событие | Что запускает событие |
Activate | Когда лист активирован |
BeforeDelete | Перед удалением листа |
BeforeDoubleClick | Перед двойным щелчком на листе |
BeforeRightClick | Перед щелчком правой кнопкой мыши по рабочему листу |
Calculate | До того, как рабочий лист будет рассчитан или пересчитан |
Change | При изменении ячеек на листе |
Deactivate | Когда лист деактивирован |
PivotTableUpdate | При обновлении сводной таблицы на листе |
SelectionChange | Когда выбор на рабочем листе изменяется |
Обратите внимание, что это не полный список. Вы можете найти полный список здесь.
Помните, что код события Worksheet хранится в окне кода объекта рабочего листа (в том, в котором вы хотите, чтобы событие было запущено). В одной книге может быть несколько рабочих листов, и ваш код будет запущен только тогда, когда событие происходит в рабочей таблице, в которой оно размещено.
Теперь давайте посмотрим на некоторые полезные события на листе и посмотрим, как их можно использовать в вашей повседневной работе.
Событие Worksheet Activate
Это событие вызывается при активации рабочего листа.
Приведенный ниже код снимает защиту листа, как только он активирован.
Private Sub Worksheet_Activate() ActiveSheet.Unprotect End Sub
Вы также можете использовать это событие, чтобы убедиться, что конкретная ячейка или диапазон ячеек (или именованный диапазон) выбран, как только вы активируете рабочую таблицу. Приведенный ниже код выберет ячейку D1, как только вы активируете лист.
Private Sub Worksheet_Activate() ActiveSheet.Range("D1").Select End Sub
Событие Worksheet Change
Событие изменения запускается всякий раз, когда вы вносите изменения в лист.
Ну .. не всегда.
Есть некоторые изменения, которые вызывают событие, а некоторые нет. Вот список некоторых изменений, которые не вызовут событие:
- При изменении форматирования ячейки (размер шрифта, цвет, рамка и т.д.).
- Когда вы объединяете клетки. Это удивительно, так как иногда объединение ячеек также удаляет содержимое из всех ячеек, кроме верхнего левого.
- Когда вы добавляете, удаляете или редактируете комментарий к ячейке.
- Когда вы сортируете диапазон ячеек.
- Когда вы используете поиск цели.
Следующие изменения могут вызвать событие (даже если вы думаете, что не должно):
- Копирование и вставка форматирования вызовут событие.
- Очистка форматирования вызовет событие.
- Запуск проверки орфографии вызовет событие.
Ниже код будет отображать окно сообщения с адресом ячейки, которая была изменена.
Private Sub Worksheet_Change(ByVal Target As Range) MsgBox "Вы только что изменились " & Target.Address End Sub
Хотя это бесполезный макрос, он показывает, как использовать аргумент Target, чтобы узнать, какие ячейки были изменены.
Теперь давайте посмотрим пару более полезных примеров.
Предположим, у вас есть диапазон ячеек (скажем, A1: D10), и вы хотите показать подсказку и спросить пользователя, действительно ли он хочет изменить ячейку в этом диапазоне, вы можете использовать приведенный ниже код.
Отображается подсказка с двумя кнопками — «Да» и «Нет». Если пользователь выбирает «Да», изменение выполняется, в противном случае оно отменяется.
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Row <= 10 And Target.Column <= 4 Then Ans = MsgBox("Вы вносите изменения в ячейки в A1: D10. Вы уверены, что хотите это?", vbYesNo) End If If Ans = vbNo Then Application.EnableEvents = False Application.Undo Application.EnableEvents = True End If End Sub
В приведенном выше коде мы проверяем, находится ли целевая ячейка в первых 4 столбцах и первых 10 строках. Если это так, появится окно сообщения. Кроме того, если пользователь выбрал «Нет» в окне сообщения, изменение отменяется (с помощью команды Application.Undo).
Обратите внимание, что я использовал Application.EnableEvents = False перед строкой Application.Undo. И затем я изменил его, используя Application.EnableEvent = True в следующей строке.
Это необходимо, поскольку, когда происходит отмена, это также вызывает событие изменения. Если я не установлю для параметра EnableEvent значение False, он продолжит вызывать событие изменения.
Вы также можете отслеживать изменения в именованном диапазоне, используя событие изменения. Например, если у вас есть именованный диапазон с именем «DataRange», и вы хотите показать подсказку на случай, если пользователь внесет изменение в этот именованный диапазон, вы можете использовать код ниже:
Private Sub Worksheet_Change(ByVal Target As Range) Dim DRange As Range Set DRange = Range("DataRange") If Not Intersect(Target, DRange) Is Nothing Then MsgBox "Вы только что внесли изменения в диапазон данных" End If End Sub
Приведенный выше код проверяет, имеет ли ячейка / диапазон, в котором вы внесли изменения, какие-либо ячейки, общие для диапазона данных. Если это так, он показывает окно сообщения.
Событие SelectionChange Workbook
Событие изменения выбора запускается всякий раз, когда в рабочем листе есть изменение выбора.
Приведенный ниже код будет пересчитывать лист, как только вы измените выбор.
Private Sub Worksheet_SelectionChange(ByVal Target As Range) Application.Calculate End Sub
Другой пример этого события — когда вы хотите выделить активную строку и столбец выбранной ячейки.
Что-то, как показано ниже:
Следующий код может сделать это:
Private Sub Worksheet_SelectionChange(ByVal Target As Range) Cells.Interior.ColorIndex = xlNone With ActiveCell .EntireRow.Interior.Color = RGB(248, 203, 173) .EntireColumn.Interior.Color = RGB(180, 198, 231) End With End Sub
Код сначала удаляет цвет фона из всех ячеек, а затем применяет цвет, упомянутый в коде, к активной строке и столбцу.
И это проблема с этим кодом. Что он удаляет цвет со всех клеток.
Если вы хотите выделить активную строку / столбец, не изменяя цвета в других ячейках, используйте технику, показанную в этом руководстве.
Событие Workbook DoubleClick
Это одно из моих любимых событий на листе, и вы увидите много учебных пособий, в которых я использовал это.
Это событие срабатывает при двойном щелчке по ячейке.
Позвольте мне показать вам, как это круто.
С помощью приведенного ниже кода вы можете дважды щелкнуть ячейку, и она применит цвет фона, изменит цвет шрифта и сделает текст в ячейке жирным;
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Cancel = True With Target .Interior.Color = vbBlue .Font.Color = vbWhite .Font.Bold = True End With End Sub
Это может быть полезно, когда вы просматриваете список ячеек и хотите выделить несколько выбранных. Хотя вы можете использовать клавишу F4, чтобы повторить последний шаг, он сможет применить только один вид форматирования. С этим событием двойного щелчка вы можете применить все три с помощью двойного щелчка.
Обратите внимание, что в приведенном выше коде я сделал значение Cancel = True.
Это сделано для того, чтобы действие двойного щелчка по умолчанию было отключено — то есть войти в режим редактирования. Если Cancel = True, Excel не переведет вас в режим редактирования, если дважды щелкнуть ячейку.
Вот еще один пример.
Если у вас есть список дел в Excel, вы можете использовать событие двойного щелчка, чтобы применить формат перечеркивания, чтобы пометить задачу как выполненную.
Как показано ниже:
Вот код, который сделает это:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Cancel = True CurrFormat = Target.Font.Strikethrough If CurrFormat Then Target.Font.Strikethrough = False Else Target.Font.Strikethrough = True End If End Sub
Обратите внимание, что в этом коде я сделал двойной щелчок в качестве события переключения. Если дважды щелкнуть ячейку, она проверяет, был ли уже применен формат зачеркивания. Если это так, двойной щелчок удаляет зачеркнутый формат, а если этого не было, то применяется зачеркнутый формат.
Событие Excel VBA OnTime
События, которые мы видели до сих пор в этой статье, были связаны с одним из объектов Excel, будь то рабочая книга, рабочий лист, лист диаграммы или пользовательские формы и т.д.
Событие OnTime отличается от других событий, поскольку оно может быть сохранено в обычном модуле VBA (тогда как другие должны были быть помещены в окно кода объектов, таких как ThisWorkbook или Worksheets или UserForms).
В обычном модуле VBA он используется как метод объекта приложения.
Причина, по которой это считается событием, заключается в том, что оно может быть запущено в зависимости от указанного вами времени. Например, если я хочу, чтобы лист пересчитывался каждые 5 минут, я могу использовать для него событие OnTime.
Или, если я хочу показать сообщение / напоминание в определенное время дня, я могу использовать событие OnTime.
Ниже приведен код, который будет показывать сообщение в 2 часа дня каждый день.
Sub MessageTime() Application.OnTime TimeValue("14:00:00"), "ShowMessage" End Sub Sub ShowMessage() MsgBox "Время обеда" End Sub
Помните, что вам нужно поместить этот код в обычный модуль VBA,
Кроме того, хотя событие OnTime будет запускаться в указанное время, макрос необходимо запускать вручную в любое время. После запуска макроса он будет ждать до 14:00, а затем вызовет макрос «ShowMessage».
Макрос ShowMessage будет отображать сообщение.
Событие OnTime принимает четыре аргумента:
Application.OnTime (Самое раннее время, Процедура, Последнее время, Расписание)
- EarliestTime: время, когда вы хотите запустить процедуру.
- Procedure: имя процедуры, которая должна быть запущена.
- LatestTime (Необязательно): Если другой код выполняется и указанный код не может быть запущен в указанное время, вы можете указать LatestTime, которого он должен ждать. Например, это может быть EarliestTime + 45 (что означает, что он будет ждать 45 секунд, пока другая процедура завершится). Если даже через 45 секунд процедура не может быть запущена, она прекращается. Если вы не укажете это, Excel подождет, пока код может быть запущен, а затем запустит его.
- Schedule (необязательно): если установлено значение «ИСТИНА», оно планирует новую процедуру времени. Если ЛОЖЬ, то это отменяет ранее установленную процедуру. По умолчанию это ИСТИНА
В приведенном выше примере мы использовали только первые два аргумента.
Давайте посмотрим на другой пример.
Приведенный ниже код будет обновлять лист каждые 5 минут.
Dim NextRefresh as Date Sub RefreshSheet() ThisWorkbook.Worksheets("Лист1").Calculate NextRefresh = Now + TimeValue("00:05:00") Application.OnTime NextRefresh, "RefreshSheet" End Sub Sub StopRefresh() On Error Resume Next Application.OnTime NextRefresh, "RefreshSheet", , False End Sub
Приведенный выше код обновляет лист каждые 5 минут.
Он использует функцию «Now», чтобы определить текущее время, а затем добавляет 5 минут к текущему времени.
Событие OnTime будет продолжаться до тех пор, пока вы его не остановите. Если вы закроете книгу, а приложение Excel все еще будет запущено (другие книги открыты), книга, в которой запущено событие OnTime, снова откроется.
Это лучше сделать, если специально остановить событие OnTime.
В приведенном выше коде у меня есть код StopRefresh, но вам нужно выполнить его, чтобы остановить событие OnTime. Вы можете сделать это вручную, назначить ее кнопке и сделать это, нажав кнопку или вызвав ее из события закрытия рабочей книги.
Private Sub Workbook_BeforeClose(Cancel As Boolean) Call StopRefresh End Sub
Вышеупомянутый код события «BeforeClose» находится в окне кода ThisWorkbook.
Событие Excel VBA OnKey
Когда вы работаете с Excel, он продолжает отслеживать нажатия клавиш, которые вы используете. Это позволяет нам использовать нажатия клавиш в качестве триггера для события.
С помощью события OnKey вы можете указать нажатие клавиши (или комбинацию нажатий клавиш) и код, который должен выполняться при использовании этого нажатия клавиши. При нажатии этих клавиш выполняется код для него.
Точно так же, как событие OnTime, у вас должен быть способ отменить событие OnKey. Кроме того, когда вы устанавливаете событие OnKey для определенного нажатия клавиши, оно становится доступным во всех открытых книгах.
Прежде чем я покажу вам пример использования события OnKey, позвольте мне сначала поделиться кодами клавиш, которые вам доступны в VBA.
Ключ | Код |
Backspace | {BACKSPACE} or {BS} |
Break | {BREAK} |
Caps Lock | {CAPSLOCK} |
Delete | {DELETE} or {DEL} |
Down Arrow | {DOWN} |
End | {END} |
Enter | ~ |
Enter (on the nueric keypad) | {ENTER} |
Escape | {ESCAPE} or {ESC} |
Home | {HOME} |
Ins | {INSERT} |
Left Arrow | {LEFT} |
NumLock | {NUMLOCK} |
PageDown | {PGDN} |
PageUp | {PGUP} |
RightArrow | {RIGHT} |
Scroll Lock | {SCROLLOCK} |
Tab | {TAB} |
Up Arrow | {UP} |
F1 through F15 | {F1} through {F15} |
Когда вам нужно использовать любое событие onkey, вам нужно использовать код для него.
В приведенной выше таблице приведены коды для однократных нажатий.
Вы также можете комбинировать их со следующими кодами:
Shift: + (знак плюс)
Контроль: ^ (Карет)
Alt:% (в процентах)
Например, для Alt F4 вам нужно использовать код: «% {F4}» — где% для клавиши ALT, а {F4} для клавиши F4.
Теперь давайте посмотрим на примере (помните, код для событий OnKey находится в обычном модуле VBA).
Когда вы нажимаете клавишу PageUp или PageDown, она переходит на 29 строк выше / ниже активной ячейки (по крайней мере, это то, что она делает на моем ноутбуке).
Если вы хотите, чтобы он перескакивал только на 5 строк одновременно, вы можете использовать следующий код:
Sub PageUpDOwnKeys() Application.OnKey "{PgUp}", "PageUpMod" Application.OnKey "{PgDn}", "PageDownMod" End Sub Sub PageUpMod() On Error Resume Next ActiveCell.Offset(-5, 0).Activate End Sub Sub PageDownMod() On Error Resume Next ActiveCell.Offset(5, 0).Activate End Sub
Когда вы запускаете первую часть кода, он запускает события OnKey. Как только это будет выполнено, использование PageUp и клавиши PageDown заставит курсор перескакивать только на 5 строк за раз.
Обратите внимание, что мы использовали «On Error Resume Next», чтобы убедиться, что ошибки игнорируются. Эти ошибки могут возникать, когда вы нажимаете клавишу PageUp, даже если вы находитесь в верхней части листа. Поскольку больше нет строк для перехода, код покажет ошибку. Но так как мы использовали «On Error Resume Next», он будет проигнорирован.
Чтобы убедиться, что эти события OnKey доступны, вам нужно запустить первую часть кода. Если вы хотите, чтобы это было доступно, как только вы откроете рабочую книгу, вы можете поместить ее в окно кода ThisWorkbook.
Private Sub Workbook_Open() Application.OnKey "{PgUp}", "PageUpMod" Application.OnKey "{PgDn}", "PageDownMod" End Sub
Приведенный ниже код вернет ключи к их нормальной работе.
Sub Cancel_PageUpDownKeysMod() Application.OnKey "{PgUp}" Application.OnKey "{PgDn}" End Sub
Если вы не укажете второй аргумент в методе OnKey, он вернет нажатие клавиши к своей обычной функциональности.
В случае, если вы хотите отменить функциональность нажатия клавиши, чтобы Excel ничего не делал при использовании этого нажатия клавиши, вам нужно использовать пустую строку в качестве второго аргумента.
В приведенном ниже коде Excel ничего не будет делать, когда мы используем ключи PageUp или PageDown.
Sub Ignore_PageUpDownKeys() Application.OnKey "{PgUp}", "" Application.OnKey "{PgDn}", "" End Sub
Отключение событий в VBA
Иногда вам может потребоваться отключить события, чтобы ваш код работал правильно.
Например, предположим, что у меня есть диапазон (A1: D10), и я хочу показать сообщение всякий раз, когда ячейка изменяется в этом диапазоне. Поэтому я показываю окно сообщения и спрашиваю пользователя, уверены ли они, что хотят внести изменения. Если ответ «Да», изменение внесено, и если ответ «Нет», VBA отменит его.
Вы можете использовать следующий код:
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Row <= 10 And Target.Column <= 4 Then Ans = MsgBox("Вы вносите изменения в ячейки в A1: D10. Вы уверены, что хотите это?", vbYesNo) End If If Ans = vbNo Then Application.Undo End If End Sub
Проблема с этим кодом заключается в том, что когда пользователь выбирает «Нет» в окне сообщения, действие отменяется (как я использовал Application.Undo).
Когда происходит отмена, и значение возвращается к исходному, событие изменения VBA снова инициируется, и пользователю снова отображается то же самое окно сообщения.
Это означает, что вы можете продолжать нажимать НЕТ в окне сообщения, и оно будет отображаться. Это происходит, когда вы застряли в бесконечном цикле в этом случае.
Чтобы избежать таких случаев, вам нужно отключить события, чтобы событие изменения (или любое другое событие) не срабатывало.
Следующий код будет хорошо работать в этом случае:
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Row <= 10 And Target.Column <= 4 Then Ans = MsgBox("Вы вносите изменения в ячейки в A1: D10. Вы уверены, что хотите это?", vbYesNo) End If If Ans = vbNo Then Application.EnableEvents = False Application.Undo Application.EnableEvents = True End If End Sub
В приведенном выше коде, прямо над строкой Application.Undo, мы использовали — Application.EnableEvents = False.
Если для параметра EnableEvents установлено значение False, это не приведет к возникновению какого-либо события (в текущей или любой открытой рабочей книге).
После того, как мы завершили операцию отмены, мы можем переключить свойство EnableEvents на True.
Имейте в виду, что отключение событий влияет на все книги, которые в данный момент открыты (или открыты, когда для параметра EnableEvents установлено значение False). Например, как часть кода, если вы откроете новую книгу, событие Workbook Open не будет работать.
Влияние событий Undo Stack
Позвольте мне сначала рассказать вам, что такое Undo Stack.
Когда вы работаете в Excel, он продолжает следить за вашими действиями. Когда вы делаете ошибку, вы всегда можете использовать Control + Z, чтобы вернуться к предыдущему шагу (то есть отменить ваше текущее действие).
Если вы дважды нажмете Control + Z, это вернет вас назад на два шага. Эти шаги, которые вы выполнили, сохраняются как часть Undo Stack.
Любое событие, которое изменяет рабочий лист, уничтожает этот стек отмены. Это означает, что если я выполнил 5 действий до запуска события, я не смогу использовать Control + Z, чтобы вернуться к этим предыдущим шагам. Запуск события уничтожил этот стек для меня.
В приведенном ниже коде я использую VBA для ввода метки времени в ячейку A1 при каждом изменении в листе.
Private Sub Worksheet_Change(ByVal Target As Range) Application.EnableEvents = False Range("A1").Value = Format(Now, "dd-mmm-yyyy hh:mm:ss") Application.EnableEvents = True End Sub
Поскольку я делаю изменения в листе, это уничтожит Undo Stack.
Также обратите внимание, что это не ограничивается только событиями.
Если у вас есть код, который хранится в обычном модуле VBA, и вы вносите изменения в рабочую таблицу, это также уничтожит Undo Stack в Excel.
Например, приведенный ниже код просто вводит текст «Hello» в ячейку A1, но даже выполнение этого приведет к разрушению
Undo Stack.
Sub TypeHello() Range("A1").Value = "Привет" End Sub