- События Excel VBA - Введение
- Различные типы событий Excel VBA
- Где разместить код, связанный с событием
- Понимание последовательности событий
- Понимание роли аргументов в событиях VBA
- События на уровне книги (с примерами)
- События уровня рабочего листа (объяснение с примерами)
- Событие onTime Excel VBA
- Событие Excel VBA OnKey
- Отключение событий в VBA
- Влияние стека отмены событий
Когда вы создаете или записываете макрос в Excel, вам необходимо запустить макрос для выполнения шагов в коде.
Несколько способов запуска макроса включают использование диалогового окна макроса, назначение макроса кнопке, использование ярлыка и т. Д.
Помимо этих запускаемых пользователем макросов, вы также можете использовать события VBA для запуска макроса.
События Excel VBA - Введение
Позвольте мне сначала объяснить, что такое событие в VBA.
Событие - это действие, которое может инициировать выполнение указанного макроса.
Например, когда вы открываете новую книгу, это событие. Когда вы вставляете новый лист, это событие. Если дважды щелкнуть ячейку, это событие.
В VBA много таких событий, и вы можете создавать коды для этих событий. Это означает, что как только происходит событие, и если вы указали код для этого события, этот код будет немедленно выполнен.
Excel автоматически делает это, как только замечает, что произошло событие. Таким образом, вам нужно только написать код и поместить его в нужную подпрограмму обработки событий (это будет рассмотрено далее в этой статье).
Например, если вы вставляете новый лист и хотите, чтобы на нем был префикс года, вы можете написать для него код.
Теперь, когда кто-либо вставляет новый лист, этот код будет автоматически выполняться и добавлять префикс года к имени листа.
Другой пример: вы хотите изменить цвет ячейки, когда кто-то дважды щелкает по ней. Для этого можно использовать событие двойного щелчка.
Точно так же вы можете создавать коды VBA для многих таких событий (как мы увидим позже в этой статье).
Ниже приведено короткое изображение, показывающее действие двойного щелчка. Как только я дважды щелкаю по ячейке A1. Excel мгновенно открывает окно сообщения, в котором отображается адрес ячейки.
Двойной щелчок - это событие, а отображение окна сообщения - это то, что я указал в коде всякий раз, когда происходит событие двойного щелчка.
Хотя приведенный выше пример является бесполезным событием, я надеюсь, что он поможет вам понять, что это за события на самом деле.
Различные типы событий Excel VBA
В Excel есть разные объекты, такие как сам Excel (который мы часто называем приложением), книги, рабочие листы, диаграммы и т. Д.
С каждым из этих объектов могут быть связаны различные события. Например:
- Если вы создаете новую книгу, это событие уровня приложения.
- Если вы добавляете новый лист, это событие уровня книги.
- Если вы измените значение в ячейке на листе, это произойдет на уровне рабочего листа.
Ниже приведены различные типы событий, которые существуют в Excel:
- События уровня рабочего листа: Это типы событий, которые будут запускаться в зависимости от действий, предпринятых на листе. Примеры этих событий включают изменение ячейки на листе, изменение выделения, двойной щелчок по ячейке, щелчок правой кнопкой мыши по ячейке и т. Д.
- События уровня книги: Эти события будут запускаться на основе действий на уровне книги. Примеры этих событий включают добавление нового листа, сохранение книги, открытие книги, печать части или всей книги и т. Д.
- События уровня приложения: Это события, которые происходят в приложении Excel. Примером этого может быть закрытие любой из открытых книг или открытие новой книги.
- События уровня UserForm: Эти события будут запускаться на основе действий в «UserForm». Примеры этого включают инициализацию UserForm или нажатие кнопки в UserForm.
- График событий: Это события, связанные с листом диаграммы. Лист диаграммы отличается от рабочего листа (с которым большинство из нас привыкло работать в Excel). Назначение листов диаграммы - держать диаграмму. Примеры таких событий могут включать изменение серии диаграммы или изменение размера диаграммы.
- События OnTime и OnKey: Это два события, которые не попадают ни в одну из вышеперечисленных категорий. Поэтому я перечислил их отдельно. Событие OnTime позволяет выполнить код в определенное время или по истечении определенного времени. Событие OnKey позволяет выполнять код при использовании определенного нажатия клавиши (или комбинации нажатий клавиш).
Где разместить код, связанный с событием
В приведенном выше разделе я рассмотрел различные типы событий.
Исходя из типа события, вам нужно поместить код в соответствующий объект.
Например, если это событие, связанное с листом, оно должно находиться в окне кода объекта листа. Если это связано с книгой, он должен войти в окно кода для объекта книги.
В VBA разные объекты, такие как рабочие листы, рабочие книги, таблицы диаграмм, пользовательские формы и т. Д., Имеют свои собственные окна кода. Вам необходимо поместить код события в окно кода соответствующего объекта. Например, если это событие уровня книги, вам необходимо иметь код события в окне кода книги.В следующих разделах описаны места, где можно разместить код события:
В окне кода рабочего листа
Когда вы открываете редактор VB (используя сочетание клавиш ALT + F11), вы можете заметить объект рабочих листов в проводнике проекта. Для каждого листа в книге вы увидите один объект.
Если дважды щелкнуть объект листа, в который нужно поместить код, откроется окно кода для этого листа.
Хотя вы можете начать писать код с нуля, гораздо лучше выбрать событие из списка параметров и позволить VBA автоматически вставить соответствующий код для выбранного события.
Для этого вам нужно сначала выбрать рабочий лист из раскрывающегося списка в верхнем левом углу окна кода.
После выбора рабочего листа в раскрывающемся списке вы получите список всех событий, связанных с рабочим листом. Вы можете выбрать тот, который хотите использовать, из раскрывающегося списка в правом верхнем углу окна кода.
Как только вы выберете событие, оно автоматически введет первую и последнюю строку кода для выбранного события. Теперь вы можете добавить свой код между двумя строками.
Примечание. Как только вы выберете «Рабочий лист» в раскрывающемся списке, вы заметите, что в окне кода появятся две строки кода. После того, как вы выбрали событие, для которого вы хотите код, вы можете удалить строки, которые появляются по умолчанию.
Обратите внимание, что на каждом листе есть собственное окно кода. Когда вы помещаете код для Sheet1, он будет работать, только если событие произойдет в Sheet1.
В окне кода ThisWorkbook
Как и в случае с рабочими листами, если у вас есть код события на уровне книги, вы можете поместить его в окно кода ThisWorkbook.
Если дважды щелкнуть ThisWorkbook, откроется окно кода для него.
Вам нужно выбрать Workbook из раскрывающегося списка в верхнем левом углу окна кода.
После выбора Workbook в раскрывающемся списке вы получите список всех событий, связанных с Workbook. Вы можете выбрать тот, который хотите использовать, из раскрывающегося списка в правом верхнем углу окна кода.
Как только вы выберете событие, оно автоматически введет первую и последнюю строку кода для выбранного события. Теперь вы можете добавить свой код между двумя строками.
Примечание. Как только вы выберете «Рабочая книга» в раскрывающемся списке, вы заметите, что в окне кода появятся две строки кода. После того, как вы выбрали событие, для которого вы хотите код, вы можете удалить строки, которые появляются по умолчанию.
В окне кода пользовательской формы
Когда вы создаете пользовательские формы в Excel, вы также можете использовать события UserForm для выполнения кода на основе определенных действий. Например, вы можете указать код, который будет выполняться при нажатии кнопки.
Хотя объекты Sheet и ThisWorkbook уже доступны при открытии редактора VB, UserForm - это то, что вам нужно создать в первую очередь.
Чтобы создать пользовательскую форму, щелкните правой кнопкой мыши любой из объектов, выберите «Вставить» и нажмите «Пользовательская форма».
Это вставит объект UserForm в книгу.
Если дважды щелкнуть UserForm (или любой объект, который вы добавляете в UserForm), откроется окно кода для UserForm.
Теперь, как и в рабочих таблицах или ThisWorkbook, вы можете выбрать событие, и оно вставит первую и последнюю строки для этого события. А затем вы можете добавить код в его середину.
В окне кода диаграммы
В Excel вы также можете вставлять листы диаграмм (которые отличаются от листов). Лист диаграммы предназначен только для содержания диаграмм.
Когда вы вставили лист диаграммы, вы сможете увидеть объект листа диаграммы в редакторе VB.
Вы можете добавить код события в окно кода листа диаграммы так же, как мы это делали на листе.
Дважды щелкните объект листа диаграммы в проводнике проекта. Это откроет окно кода для листа диаграммы.
Теперь вам нужно выбрать Диаграмму из раскрывающегося списка в верхнем левом углу окна кода.
После выбора «Диаграмма» в раскрывающемся списке вы получите список всех событий, связанных с листом «Диаграмма». Вы можете выбрать тот, который хотите использовать, из раскрывающегося списка в правом верхнем углу окна кода.
Примечание. Как только вы выберете «Диаграмма» в раскрывающемся списке, вы заметите, что в окне кода появляются две строки кода. После того, как вы выбрали событие, для которого вы хотите код, вы можете удалить строки, которые появляются по умолчанию.
В модуле класса
Модули классов нужно вставлять так же, как и UserForms.
Модуль класса может содержать код, связанный с приложением, которым может быть сам Excel и встроенные диаграммы.
В ближайшие недели я расскажу о модуле класса как отдельное руководство.
Обратите внимание, что кроме событий OnTime и OnKey, ни одно из указанных выше событий не может быть сохранено в обычном модуле VBA.Понимание последовательности событий
Когда вы запускаете событие, оно не происходит изолированно. Это также может привести к последовательности нескольких триггеров.
Например, когда вы вставляете новый лист, происходит следующее:
- Добавлен новый рабочий лист
- Предыдущий рабочий лист деактивируется
- Новый рабочий лист активируется
Хотя в большинстве случаев вам может не понадобиться беспокоиться о последовательности, если вы создаете сложные коды, основанные на событиях, лучше знать последовательность, чтобы избежать неожиданных результатов.
Понимание роли аргументов в событиях VBA
Прежде чем мы перейдем к примерам событий и удивительным вещам, которые вы можете с ними сделать, есть одна важная концепция, которую мне нужно осветить.
В событиях VBA будет два типа кодов:
- Без всяких аргументов
- С аргументами
В этом разделе я хочу быстро осветить роль аргументов.
Ниже приведен код, в котором нет аргументов (круглые скобки пусты):
Private Sub Workbook_Open () MsgBox "Не забудьте заполнить расписание" End Sub
С помощью приведенного выше кода, когда вы открываете книгу, она просто показывает окно сообщения с сообщением - «Не забудьте заполнить расписание».
Теперь давайте посмотрим на код, в котором есть аргумент.
Private Sub Workbook_NewSheet (ByVal Sh как объект) Sh.Range ("A1") = Sh.Name End Sub
В приведенном выше коде используется аргумент Sh, который определяется как тип объекта. Аргументом Sh может быть рабочий лист или лист диаграммы, поскольку указанное выше событие запускается при добавлении нового листа.
Назначив новый лист, добавляемый в книгу, объектной переменной Sh, VBA позволил нам использовать его в коде. Поэтому для обозначения нового имени листа я могу использовать Sh.Name.
Концепция аргументов будет полезна при рассмотрении примеров событий VBA в следующих разделах.
События на уровне книги (с примерами)
Ниже приведены наиболее часто используемые события в книге.
НАЗВАНИЕ СОБЫТИЯ | ЧТО ВЫЗЫВАЕТ СОБЫТИЕ |
Активировать | Когда книга активирована |
После сохранения | Когда книга установлена как надстройка |
ПередСохранить | Когда книга сохранена |
ДоЗакрыть | Когда книга закрыта |
Перед печатью | Когда напечатана рабочая тетрадь |
Деактивировать | Когда книга деактивирована |
NewSheet | Когда добавляется новый лист |
Открыть | Когда книга открыта |
SheetActivate | Когда активирован какой-либо лист в книге |
SheetBeforeDelete | Когда какой-либо лист удален |
SheetBeforeDoubleClick | При двойном щелчке по любому листу |
SheetBeforeRightClick | При щелчке правой кнопкой мыши по любому листу |
SheetCalculate | Когда любой лист рассчитывается или пересчитывается |
SheetDeactivate | Когда книга деактивирована |
SheetPivotTableUpdate | Когда книга обновляется |
SheetSelectionChange | Когда рабочая книга изменена |
WindowActivate | Когда книга активирована |
WindowDeactivate | Когда книга деактивирована |
Обратите внимание, что это не полный список. Вы можете найти полный список здесь.
Помните, что код для события Workbook хранится в окне кода объектов ThisWorkbook.
Теперь давайте взглянем на некоторые полезные события из рабочей тетради и посмотрим, как их можно использовать в повседневной работе.
Событие открытия книги
Допустим, вы хотите показать пользователю удобное напоминание о необходимости заполнения расписания всякий раз, когда он открывает определенную книгу.
Для этого вы можете использовать приведенный ниже код:
Private Sub Workbook_Open () MsgBox "Не забудьте заполнить расписание" End Sub
Теперь, как только вы откроете книгу с этим кодом, она покажет вам окно сообщения с указанным сообщением.
При работе с этим кодом (или кодами событий рабочей книги в целом) необходимо знать несколько вещей:
- Если в книге есть макрос, и вы хотите его сохранить, вам необходимо сохранить его в формате .XLSM. В противном случае код макроса будет потерян.
- В приведенном выше примере код события будет выполняться только тогда, когда макросы включены. Вы можете увидеть желтую полосу с запросом разрешения на включение макросов. Пока это не будет включено, код события не выполняется.
- Код события Workbook помещается в окно кода объекта ThisWorkbook.
Вы можете дополнительно уточнить этот код и показать сообщение только пятницы.
Следующий код сделает это:
Private Sub Workbook_Open () wkday = Weekday (Date) Если wkday = 6, то MsgBox «Не забудьте заполнить расписание» End Sub
Обратите внимание, что в функции «День недели» воскресенье имеет значение 1, понедельник - 2 и т. Д.
Поэтому для пятницы я использовал 6.
Событие Workbook Open может быть полезно во многих ситуациях, например:
- Когда вы хотите показать человеку приветственное сообщение при открытии книги.
- Если вы хотите отображать напоминание при открытии книги.
- Если вы хотите всегда активировать один конкретный рабочий лист в книге, когда она открыта.
- Если вы хотите открыть связанные файлы вместе с книгой.
- Если вы хотите фиксировать дату и время при каждом открытии книги.
Событие NewSheet в книге
Событие NewSheet запускается, когда вы вставляете новый лист в книгу.
Допустим, вы хотите ввести значение даты и времени в ячейку A1 только что вставленного листа. Для этого вы можете использовать приведенный ниже код:
Private Sub Workbook_NewSheet (ByVal Sh As Object) При ошибке Возобновить Далее Sh.Range ("A1") = Format (Теперь, "dd-mmm-yyyy hh: mm: ss") End Sub
В приведенном выше коде используется «Возобновить при ошибке» для обработки случаев, когда кто-то вставляет лист диаграммы, а не лист. Поскольку на листе диаграммы нет ячейки A1, будет отображаться сообщение об ошибке, если не использовать «On Error Resume Next».
Другим примером может быть случай, когда вы хотите применить некоторые базовые настройки или форматирование к новому листу сразу после его добавления. Например, если вы хотите добавить новый лист и хотите, чтобы он автоматически получал серийный номер (до 100), вы можете использовать приведенный ниже код.
Private Sub Workbook_NewSheet (ByVal Sh As Object) При ошибке Возобновить следующий с Sh.Range ("A1") .Value = "S. No." .Interior.Color = vbBlue .Font.Color = vbWhite End With For i = от 1 до 100 Sh.Range ("A1"). Offset (i, 0) .Value = i Next i Sh.Range ("A1", Range ("A1"). End (xlDown)). Borders.LineStyle = xlContinuous End Sub
Приведенный выше код также выполняет небольшое форматирование. Он придает ячейке заголовка синий цвет, а шрифт - белый. Он также применяет границу ко всем заполненным ячейкам.
Приведенный выше код является примером того, как короткий код VBA может помочь вам украсть несколько секунд каждый раз, когда вы вставляете новый рабочий лист (в случае, если это то, что вам нужно делать каждый раз).
Рабочая книга перед событием сохранения
Перед сохранением событие запускается при сохранении книги. Обратите внимание, что сначала запускается событие, а затем книга сохраняется.
При сохранении книги Excel может быть два возможных сценария:
- Вы сохраняете его впервые, и появится диалоговое окно «Сохранить как».
- Вы уже сохранили его ранее, и он просто сохранит и перезапишет изменения в уже сохраненной версии.
Теперь давайте рассмотрим несколько примеров, в которых вы можете использовать событие BeforeSave.
Предположим, у вас есть новая книга, которую вы сохраняете впервые, и вы хотите напомнить пользователю о необходимости сохранить ее на диске K, тогда вы можете использовать следующий код:
Private Sub Workbook_BeforeSave (ByVal SaveAsUI As Boolean, Cancel As Boolean) Если SaveAsUI Then MsgBox «Сохранить этот файл на K-диске» End Sub
В приведенном выше коде, если файл никогда не сохранялся, SaveAsUI имеет значение True и вызывает диалоговое окно «Сохранить как». Приведенный выше код отобразит сообщение до появления диалогового окна «Сохранить как».
Другим примером может быть обновление даты и времени, когда файл сохраняется в определенной ячейке.
Приведенный ниже код будет вставлять метку даты и времени в ячейку A1 листа Sheet1 при сохранении файла.
Private Sub Workbook_BeforeSave (ByVal SaveAsUI As Boolean, Cancel As Boolean) Worksheets ("Sheet1"). Range ("A1") = Format (Now, "dd-mmm-yyyy hh: mm: ss") End Sub
Обратите внимание, что этот код выполняется, как только пользователь сохраняет книгу. Если книга сохраняется в первый раз, отобразится диалоговое окно «Сохранить как». Но код уже выполняется к тому моменту, когда вы видите диалоговое окно «Сохранить как». На этом этапе, если вы решите отменить и не сохранять книгу, дата и время уже будут введены в ячейку.
Рабочая книга перед событием закрытия
Событие Before Close происходит непосредственно перед закрытием книги.
Приведенный ниже код защищает все рабочие листы до закрытия книги.
Private Sub Workbook_BeforeClose (Отменить как логическое) Dim sh As Worksheet для каждого sh в ThisWorkbook.Worksheets sh.Protect Next sh End Sub
Помните, что код события запускается, как только вы закрываете книгу.
Об этом событии важно знать, что его не волнует, закрыта книга на самом деле или нет.
Если книга не была сохранена, и вам отображается запрос с вопросом, сохранять книгу или нет, и вы нажимаете «Отмена», книга не будет сохранена.Однако к тому времени код события уже был бы выполнен.
Workbook BeforePrint Event
Когда вы даете команду печати (или команду предварительного просмотра), запускается событие Перед печатью.
Приведенный ниже код пересчитает все рабочие листы перед печатью вашей книги.
Private Sub Workbook_BeforePrint (Cancel As Boolean) для каждого ws в листах 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 (Теперь, "dd-mmm-yyyy hh: mm") Next ws End Sub
События уровня рабочего листа (объяснение с примерами)
События рабочего листа происходят на основе триггеров на листе.
Ниже приведены наиболее часто используемые события на листе.
Название события | Что вызывает событие |
Активировать | Когда рабочий лист активирован |
Перед Удалить | Перед удалением рабочего листа |
Перед DoubleClick | Перед двойным щелчком по листу |
BeforeRightClick | Перед щелчком правой кнопкой мыши по листу |
Рассчитать | Перед расчетом или перерасчетом рабочего листа |
Изменять | Когда ячейки на листе изменены |
Деактивировать | Когда рабочий лист деактивирован |
PivotTableUpdate | Когда сводная таблица на листе обновляется |
SelectionChange | Когда выбор на листе изменен |
Обратите внимание, что это не полный список. Вы можете найти полный список здесь.
Помните, что код для события рабочего листа хранится в окне кода объекта рабочего листа (в том, в котором вы хотите, чтобы событие запускалось). В книге может быть несколько листов, и ваш код будет запускаться только тогда, когда событие происходит на листе, в который он помещен.
Теперь давайте взглянем на некоторые полезные события на листе и посмотрим, как их можно использовать в повседневной работе.
Рабочий лист активировать событие
Это событие запускается, когда вы активируете лист.
Приведенный ниже код снимает защиту с листа, как только он активируется.
Private Sub Worksheet_Activate () ActiveSheet.Unprotect End Sub
Вы также можете использовать это событие, чтобы убедиться, что определенная ячейка или диапазон ячеек (или именованный диапазон) выбраны, как только вы активируете рабочий лист. Приведенный ниже код выберет ячейку D1, как только вы активируете лист.
Private Sub Worksheet_Activate () ActiveSheet.Range ("D1"). Выберите End Sub
Событие изменения рабочего листа
Событие изменения запускается всякий раз, когда вы вносите изменения в рабочий лист.
Ну… не всегда.
Некоторые изменения запускают событие, а некоторые нет. Вот список некоторых изменений, которые не активируют событие:
- При изменении форматирования ячейки (размер шрифта, цвет, граница и т. Д.).
- Когда вы объединяете ячейки. Это удивительно, поскольку иногда при слиянии ячеек также удаляется содержимое всех ячеек, кроме верхней левой.
- Когда вы добавляете, удаляете или редактируете комментарий к ячейке.
- Когда вы сортируете диапазон ячеек.
- Когда вы используете Goal Seek.
Следующие изменения вызовут событие (даже если вы думаете, что это не должно происходить):
- Копирование и вставка форматирования вызовут событие.
- Очистка форматирования вызовет событие.
- Запуск проверки орфографии вызовет событие.
Ниже приведен код, отображающий окно сообщения с адресом измененной ячейки.
Private Sub Worksheet_Change (ByVal Target As Range) MsgBox «Вы только что изменили» и Target.Address End Sub
Хотя это бесполезный макрос, он показывает, как использовать аргумент Target, чтобы узнать, какие ячейки были изменены.
А теперь давайте посмотрим еще пару полезных примеров.
Предположим, у вас есть диапазон ячеек (скажем, A1: D10), и вы хотите показать подсказку и спросить пользователя, действительно ли он хочет изменить ячейку в этом диапазоне или нет, вы можете использовать приведенный ниже код.
Он показывает подсказку с двумя кнопками - Да и Нет. Если пользователь выбирает «Да», изменение выполняется, в противном случае оно отменяется.
Private Sub Worksheet_Change (ByVal Target As Range) Если 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") Если не Intersect (Target, DRange) Is Nothing Then MsgBox "Вы только что внесли изменение в диапазон данных" End If End Sub
Приведенный выше код проверяет, есть ли в ячейке / диапазоне, в котором вы внесли изменения, какие-либо ячейки, общие для диапазона данных. Если это так, отображается окно сообщения.
Событие выбора книги
Событие изменения выбора запускается всякий раз, когда на листе происходит изменение выбора.
Приведенный ниже код пересчитает лист, как только вы измените выбор.
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) Заканчивается на Конец подписки
Код сначала удаляет цвет фона из всех ячеек, а затем применяет цвет, упомянутый в коде, к активной строке и столбцу.
И в этом проблема этого кода. Что убирает цвет со всех ячеек.
Если вы хотите выделить активную строку / столбец, сохранив при этом цвет в других ячейках, используйте технику, показанную в этом руководстве.
Рабочая книга DoubleClick Event
Это одно из моих любимых событий рабочего листа, и вы увидите множество руководств, в которых я его использовал (например, этот или этот).
Это событие запускается при двойном щелчке по ячейке.
Позвольте мне показать вам, насколько это круто.
С помощью приведенного ниже кода вы можете дважды щелкнуть ячейку, и она применит цвет фона, изменит цвет шрифта и сделает текст в ячейке жирным;
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.
Это сделано для того, чтобы действие двойного щелчка по умолчанию было отключено, то есть переход в режим редактирования. Если Отмена = 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
Обратите внимание, что в этом коде я сделал двойной щелчок как событие переключения. Когда вы дважды щелкаете ячейку, она проверяет, применялся ли уже зачеркнутый формат. Если это так, двойной щелчок удаляет зачеркнутый формат, а если нет, применяется зачеркнутый формат.
Событие onTime Excel VBA
События, которые мы видели до сих пор в этой статье, были связаны с одним из объектов Excel, будь то книга, рабочий лист, лист диаграммы или пользовательские формы и т. Д.
Событие OnTime отличается от других событий, поскольку оно может храниться в обычном модуле VBA (в то время как остальные должны были быть помещены в окно кода таких объектов, как ThisWorkbook, Worksheets или UserForms).
В обычном модуле VBA он используется как метод объекта приложения.
Причина, по которой это считается событием, заключается в том, что оно может быть инициировано в указанное вами время. Например, если я хочу, чтобы лист пересчитывался каждые 5 минут, я могу использовать для этого событие OnTime.
Или, если я хочу показать сообщение / напоминание в определенное время дня, я могу использовать событие OnTime.
Ниже приведен код, который будет показывать сообщение в 14:00 каждый день.
Sub MessageTime () Application.OnTime TimeValue ("14:00:00"), "ShowMessage" End Sub Sub ShowMessage () MsgBox "It's Lunch Time" End Sub
Помните, что вам нужно поместить этот код в обычный модуль VBA,
Кроме того, хотя событие OnTime будет запускаться в указанное время, вам необходимо запустить макрос вручную в любое время. Как только вы запустите макрос, он дождется 14:00, а затем вызовет макрос ShowMessage.
После этого макрос ShowMessage отобразит сообщение.
Событие OnTime принимает четыре аргумента:
Application.OnTime (EarlyTime, Процедура, LatestTime, График)
- Самое раннее время: Время, когда вы хотите запустить процедуру.
- Процедура: Имя процедуры, которую нужно запустить.
- LatestTime (необязательно): В случае, если выполняется другой код, а указанный код не может быть запущен в указанное время, вы можете указать LatestTime, в течение которого он должен ждать. Например, это может быть EarliestTime + 45 (что означает, что он будет ждать завершения другой процедуры в течение 45 секунд). Если даже через 45 секунд процедура не может быть запущена, она прерывается. Если вы не укажете это, Excel подождет, пока код будет запущен, а затем запустит его.
- Расписание (необязательно): Если установлено значение True, он планирует новую временную процедуру. Если False, то отменяет ранее установленную процедуру. По умолчанию это True.
В приведенном выше примере мы использовали только первые два аргумента.
Давайте посмотрим на другой пример.
Приведенный ниже код будет обновлять рабочий лист каждые 5 минут.
Dim NextRefresh as Date Sub RefreshSheet () ThisWorkbook.Worksheets ("Sheet1"). Calculate NextRefresh = Now + TimeValue ("00:05:00") Application.OnTime NextRefresh, "RefreshSheet" End Sub Sub StopRefresh () При ошибке Возобновить Далее Application.OnTime NextRefresh, «RefreshSheet»,, False End Sub
Приведенный выше код будет обновлять лист каждые 5 минут.
Он использует функцию «Сейчас» для определения текущего времени, а затем добавляет 5 минут к текущему времени.
Событие OnTime будет продолжать выполняться, пока вы его не остановите. Если вы закроете книгу, а приложение Excel все еще работает (другие книги открыты), книга, в которой запущено событие OnTime, откроется снова.
С этим лучше справиться, специально остановив событие OnTime.
В приведенном выше коде у меня есть код StopRefresh, но вам нужно выполнить его, чтобы остановить событие OnTime. Вы можете сделать это вручную, назначить его кнопке и сделать это, нажав кнопку или вызвав его из события закрытия книги.
Private Sub Workbook_BeforeClose (Отменить как логическое) Вызов StopRefresh End Sub
Приведенный выше код события «BeforeClose» появляется в окне кода ThisWorkbook.
Событие Excel VBA OnKey
Когда вы работаете с Excel, он постоянно отслеживает нажатия клавиш, которые вы используете. Это позволяет нам использовать нажатия клавиш в качестве триггера для события.
С помощью события OnKey вы можете указать нажатие клавиши (или комбинацию нажатий клавиш) и код, который должен выполняться при использовании этого нажатия клавиши. Когда эти нажатия клавиш нажаты, он выполнит код для этого.
Как и в случае с событием OnTime, у вас должен быть способ отменить событие OnKey. Кроме того, когда вы устанавливаете событие OnKey для определенного нажатия клавиши, оно становится доступным во всех открытых книгах.
Прежде чем я покажу вам пример использования события OnKey, позвольте мне сначала поделиться кодами клавиш, которые доступны вам в VBA.
КЛЮЧ | КОД |
Backspace | {BACKSPACE} или {BS} |
Сломать | {СЛОМАТЬ} |
Caps Lock | {CAPSLOCK} |
Удалить | {УДАЛИТЬ} или {УДАЛИТЬ} |
Стрелка вниз | {ВНИЗ} |
Конец | {КОНЕЦ} |
Войти | ~ |
Enter (на цифровой клавиатуре) | {ВОЙТИ} |
Побег | {ESCAPE} или {ESC} |
Дом | {ДОМ} |
Ins | {ВСТАВЛЯТЬ} |
Стрелка влево | {ЛЕВЫЙ} |
NumLock | {NUMLOCK} |
Листать вниз | {PGDN} |
PageUp | {PGUP} |
Правая стрелка | {ВЕРНО} |
Scroll Lock | {SCROLLOCK} |
Вкладка | {TAB} |
Стрелка вверх | {ВВЕРХ} |
С F1 по F15 | С {F1} по {F15} |
Когда вам нужно использовать какое-либо событие onkey, вам нужно использовать для него код.
В приведенной выше таблице есть коды для одиночных нажатий клавиш.
Вы также можете комбинировать их со следующими кодами:
- Сдвиг: + (Знак плюс)
- Контроль: ^ (Карет)
- Alt: % (В процентах)
Например, для Alt F4 вам нужно использовать код: «% {F4}”- где% для клавиши ALT, а {F4} для клавиши F4.
Теперь давайте посмотрим на пример (помните, что код для событий OnKey помещается в обычный модуль VBA).
Когда вы нажимаете клавишу PageUp или PageDown, он перескакивает на 29 строк выше / ниже активной ячейки (по крайней мере, это то, что он делает на моем ноутбуке).
Если вы хотите, чтобы он перескакивал только 5 строк за раз, вы можете использовать следующий код:
Sub PageUpDOwnKeys () Application.OnKey "{PgUp}", "PageUpMod" Application.OnKey "{PgDn}", "PageDownMod" Конец Sub Sub PageUpMod () При ошибке Возобновить След. ActiveCell.Offset (-5, 0). Активировать Конец Sub Sub PageDownMod () При ошибке Возобновить Далее ActiveCell.Offset (5, 0) .Activate End Sub
Когда вы запускаете первую часть кода, она запускает события OnKey. Как только это будет выполнено, использование PageUp и клавиши PageDown заставит курсор перемещаться только на 5 строк за раз.
Обратите внимание, что мы использовали «Возобновить после ошибки», чтобы убедиться, что ошибки игнорируются. Эти ошибки могут возникать при нажатии клавиши PageUp, даже если вы находитесь в верхней части листа. Поскольку строк для перехода больше нет, код покажет ошибку. Но поскольку мы использовали «При ошибке возобновить следующий», он будет проигнорирован.
Чтобы убедиться, что эти события OnKey доступны, необходимо запустить первую часть кода. Если вы хотите, чтобы это было доступно, как только вы откроете книгу, вы можете поместить это в окно кода ThisWorkbook.
Частная подписка 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) Если 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) Если 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 не сработает.
Влияние стека отмены событий
Позвольте мне сначала рассказать вам, что такое стек отмены.
Когда вы работаете в Excel, он постоянно отслеживает ваши действия. Если вы допустили ошибку, вы всегда можете использовать Control + Z, чтобы вернуться к предыдущему шагу (т. Е. Отменить текущее действие).
Если вы дважды нажмете Control + Z, вы вернетесь на два шага назад. Эти выполненные вами шаги сохраняются как часть стека отмены.
Любое событие, которое изменяет рабочий лист, уничтожает этот стек отмены.Это означает, что если я сделал 5 действий до запуска события, я не смогу использовать Control + Z, чтобы вернуться к этим предыдущим шагам. Запуск события уничтожил этот стек для меня.
В приведенном ниже коде я использую VBA для ввода метки времени в ячейку A1 всякий раз, когда на листе происходит изменение.
Private Sub Worksheet_Change (ByVal Target As Range) Application.EnableEvents = False Range («A1»). Value = Format (Теперь, «дд-ммм-гггг чч: мм: сс») Application.EnableEvents = True End Sub
Поскольку я вношу изменение в лист, это уничтожит стек отмены.
Также обратите внимание, что это не ограничивается только событиями.
Если у вас есть код, который хранится в обычном модуле VBA, и вы вносите изменения в рабочий лист, это также уничтожит стек отмены в Excel.
Например, в приведенном ниже коде просто введите текст «Hello» в ячейку A1, но даже запуск этого приведет к разрушению стека отмены.
Sub TypeHello () Range ("A1"). Value = "Hello" End Sub
Вам также могут понравиться следующие руководства по Excel VBA:
- Работа с ячейками и диапазонами в Excel VBA.
- Работа с листами в Excel VBA.
- Работа с книгами в Excel VBA.
- Циклы Excel VBA - полное руководство.
- Использование IF Then Else Statment в Excel VBA.
- Для следующего цикла в Excel.
- Создание пользовательских функций в Excel VBA.
- Как создавать и использовать надстройки в Excel.
- Создавайте и повторно используйте макросы, сохраняя их в личной книге макросов.