Excel vba макрос при активации листа

Как запустить макрос, когда лист выбран из книги?

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

Запуск или выполнение кода макроса, когда лист выбран из книги с кодом VBA


стрелка синий правый пузырь Запуск или выполнение кода макроса, когда лист выбран из книги с кодом VBA

Следующий простой код может помочь вам запустить код макроса при активации определенного листа, пожалуйста, сделайте следующее:

1. Щелкните правой кнопкой мыши вкладку листа, на которой вы хотите выполнить макрос при его активации, а затем выберите Просмотреть код из контекстного меню, а в открывшемся Microsoft Visual Basic для приложений окна, скопируйте и вставьте следующий код в пустой модуль:

Код VBA: запускать код макроса при активации листа из книги:

Private Sub Worksheet_Activate()
Call MyMacro
End Sub

doc run macro sheet выбран 1

Внимание: В приведенном выше коде измените имя макроса на свое.

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


Статьи по теме:

Как запустить макрос при изменении значения ячейки в Excel?

Как запустить макрос на основе значения ячейки в Excel?

Как запустить макрос на основе значения, выбранного из раскрывающегося списка в Excel?

Как запустить макрос, щелкнув гиперссылки в Excel?

Как запустить макрос автоматически перед печатью в Excel?


Лучшие инструменты для работы в офисе

Kutools for Excel Решит большинство ваших проблем и повысит вашу производительность на 80%

  • Снова использовать: Быстро вставить сложные формулы, диаграммы и все, что вы использовали раньше; Зашифровать ячейки с паролем; Создать список рассылки и отправлять электронные письма …
  • Бар Супер Формулы (легко редактировать несколько строк текста и формул); Макет для чтения (легко читать и редактировать большое количество ячеек); Вставить в отфильтрованный диапазон
  • Объединить ячейки / строки / столбцы без потери данных; Разделить содержимое ячеек; Объединить повторяющиеся строки / столбцы… Предотвращение дублирования ячеек; Сравнить диапазоны
  • Выберите Дубликат или Уникальный Ряды; Выбрать пустые строки (все ячейки пустые); Супер находка и нечеткая находка во многих рабочих тетрадях; Случайный выбор …
  • Точная копия Несколько ячеек без изменения ссылки на формулу; Автоматическое создание ссылок на несколько листов; Вставить пули, Флажки и многое другое …
  • Извлечь текст, Добавить текст, Удалить по позиции, Удалить пробел; Создание и печать промежуточных итогов по страницам; Преобразование содержимого ячеек в комментарии
  • Суперфильтр (сохранять и применять схемы фильтров к другим листам); Расширенная сортировка по месяцам / неделям / дням, периодичности и др .; Специальный фильтр жирным, курсивом …
  • Комбинируйте книги и рабочие листы; Объединить таблицы на основе ключевых столбцов; Разделить данные на несколько листов; Пакетное преобразование xls, xlsx и PDF
  • Более 300 мощных функций. Поддерживает Office/Excel 2007-2021 и 365. Поддерживает все языки. Простое развертывание на вашем предприятии или в организации. Полнофункциональная 30-дневная бесплатная пробная версия. 60-дневная гарантия возврата денег.

вкладка kte 201905


Вкладка Office: интерфейс с вкладками в Office и упрощение работы

  • Включение редактирования и чтения с вкладками в Word, Excel, PowerPoint, Издатель, доступ, Visio и проект.
  • Открывайте и создавайте несколько документов на новых вкладках одного окна, а не в новых окнах.
  • Повышает вашу продуктивность на 50% и сокращает количество щелчков мышью на сотни каждый день!

офисный дно

Комментарии (1)


Оценок пока нет. Оцените первым!

Make a particular worksheet visible using a macro in Excel.

This is called activating a worksheet and is rather easy to do.

Sections:

Activate Worksheet by Name

Activate Worksheet by Index Number

Notes

Activate Worksheet by Name

Let’s navigate to, activate, the worksheet called «Sheet2».

Worksheets("Sheet2").Activate

08008f3433d614b4eb713fdcde4e01eb.jpg

Worksheets(«Shee2») is how we reference the sheet to which we want to navigate.

Sheet2 is the name of the sheet to which we want to navigate. Make sure to surround it with double quotation marks.

Activate is what actually takes the user to that worksheet.

Putting it all together, we get: Worksheets(«Sheet2»).Activate

It’s as simple as that.

Activate Worksheet by Index Number

This time, let’s navigate to the second worksheet using its index number.

All we do is to replace «Sheet2» from the last example with 2.

Worksheets(2).Activate

3e8969b16e6f131afc29445b0f9a02ac.jpg

2 is the index number of the desired worksheet and Activate is what takes us to the desired worksheet.

This example can be confusing if you are not used to using index numbers, but index numbers are really helpful when you have to do something like loop through all of the worksheets in the workbook.

Notes

Basically, just reference the desired worksheet, however you want, and then type .Activate after it.

You should not use the Activate feature to navigate to a worksheet so that you can get data from it or put data into it. This is very bad Macro/VBA design and it will make your life hell later on. To get data from separate worksheets, read this tutorial: Select Data from Separate Worksheets with Macros VBA in Excel.

This feature should be used when you want the user to end up on a specific worksheet.

Make sure to download the sample file attached to this tutorial so that you can see this macro in Excel and work with it.

Similar Content on TeachExcel

Copy and Paste Data using Macro VBA in Excel

Tutorial: How to copy and paste data using a Macro in Excel. I’ll show you multiple ways to do this,…

Select Data from Separate Worksheets with Macros VBA in Excel

Tutorial: Select data from other worksheets with Macros and VBA without navigating to those workshee…

Get the Last Row using VBA in Excel

Tutorial:
(file used in the video above)
How to find the last row of data using a Macro/VBA in Exce…

Login to a Website using a Macro

: Connect and login to a website using a macro in Excel.
This allows you to open a website a…

Get the Name of a Worksheet in Macros VBA in Excel

Tutorial: How to get the name of a worksheet in Excel using VBA and Macros and also how to store tha…

Guide to Creating Charts with a Macro in Excel

Tutorial: How to add, edit, and position charts in Excel using VBA.
This tutorial covers what to do …

Subscribe for Weekly Tutorials

BONUS: subscribe now to download our Top Tutorials Ebook!

Перейти к содержанию

Запуск макроса при активации рабочего листа

На чтение 2 мин. Просмотров 61 Опубликовано 12.05.2021

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

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

  1. Отобразите редактор VBA, нажав Alt + F11 .
  2. В окне проекта в левой части В редакторе дважды щелкните имя рабочего листа, на который вы хотите повлиять. (Вам может потребоваться сначала открыть папку VBAProject, а затем открыть в ней папку Microsoft Excel Objects.) Должно появиться окно кода для рабочего листа.
  3. В окне кода используйте правую тягу список (есть два раскрывающихся списка чуть ниже строки заголовка окна кода), чтобы выбрать параметр «Активировать». В окне кода должен появиться следующий код:
 Private Sub Worksheet_Activate () End Sub 
  1. В этой новой подпрограмме введите макрос, который должен выполняться всякий раз, когда рабочий лист активируется.
  2. Закройте редактор VBA.

Помните, что макрос, определенный таким образом, запускается каждый раз, когда лист активируется, а не только в первый раз. Подумайте, как вы используете Excel; лист можно активировать несколько десятков раз в течение сеанса.

SrgKord

49 / 31 / 2

Регистрация: 14.02.2013

Сообщений: 677

1

Выполнение кода при активации листа. Что не так?

14.08.2017, 14:35. Показов 3028. Ответов 12

Метки нет (Все метки)


Студворк — интернет-сервис помощи студентам

На листе 1 чекбокс CHB_A1
На листе 2 макрос:

Visual Basic
1
2
3
Sub Worksheet_Activate()
Sheets("Ямал_19Г").Range("A1").Activate = CHB_A1.Value
End Sub

Не работает. Требуется Объект. Какой объект?

Миниатюры

Выполнение кода при активации листа. Что не так?
 



0



6875 / 2807 / 533

Регистрация: 19.10.2012

Сообщений: 8,562

14.08.2017, 14:48

2

Цитата
Сообщение от SrgKord
Посмотреть сообщение

Какой объект?

— CHB_A1 с дефолного листа.
И вместо Activate пишите value если я правильно понял задумку.



0



49 / 31 / 2

Регистрация: 14.02.2013

Сообщений: 677

14.08.2017, 14:54

 [ТС]

3

Hugo121,
Нет, задумка в том, чтобы позиционирование на A1 происходило при активации листа. Это сделал. Но так, чтобы можно было, при необходимости, эту функцию выключить. Вот чекбокс CHB_A1 как раз и должен включать эту функцию. Т.е. CHB_A1 = True — позиционирование происходит, CHB_A1 = False — позиционирование не происходит.



0



Dragokas

Эксперт WindowsАвтор FAQ

17991 / 7617 / 890

Регистрация: 25.12.2011

Сообщений: 11,351

Записей в блоге: 17

14.08.2017, 15:12

4

Visual Basic
1
2
3
4
5
6
Sub Worksheet_Activate()
  if CHB_A1.Value then
    Sheets("Ямал_19Г").Activate
    Sheets("Ямал_19Г").Range("A1").Activate
  end if
End Sub



0



49 / 31 / 2

Регистрация: 14.02.2013

Сообщений: 677

14.08.2017, 16:11

 [ТС]

5

Dragokas,
Та же ошибка, требуется какой-то объект



0



Эксперт WindowsАвтор FAQ

17991 / 7617 / 890

Регистрация: 25.12.2011

Сообщений: 11,351

Записей в блоге: 17

14.08.2017, 16:17

6

SrgKord, значит имя листа и/или чекбокса неправильно указали.



0



6875 / 2807 / 533

Регистрация: 19.10.2012

Сообщений: 8,562

14.08.2017, 16:26

7

Нет чтоб сразу показать файл-пример для форума…
Я правда до вечера файлы с макросами взять не могу, но другие ведь могут.



0



185 / 183 / 31

Регистрация: 11.10.2016

Сообщений: 599

14.08.2017, 17:15

8

Цитата
Сообщение от Dragokas
Посмотреть сообщение

if CHB_A1.Value then

правильнее, по-моему, будет — If Sheets(«Ямал_19Г»).CHB_A1.Value Then



0



6875 / 2807 / 533

Регистрация: 19.10.2012

Сообщений: 8,562

14.08.2017, 17:23

9

Так и я том же говорил — ожидается объект с того листа, где расположен код. А где там как и что — из объяснения не понять, файла нет…



0



Alex77755

11482 / 3773 / 677

Регистрация: 13.02.2009

Сообщений: 11,145

14.08.2017, 19:30

10

Visual Basic
1
2
3
Private Sub Worksheet_Activate()
    If Лист1.CHB_A1 Then [a1].Activate
End Sub

Вложения

Тип файла: rar Книга1111.rar (14.6 Кб, 5 просмотров)



0



SrgKord

49 / 31 / 2

Регистрация: 14.02.2013

Сообщений: 677

15.08.2017, 06:41

 [ТС]

11

Alex77755, Точно! Надо было указать на каком листе чекбокс!
Теперь работает:

Visual Basic
1
2
3
4
5
6
Sub Worksheet_Activate()
  If Sheets("Форма управления").CHB_A1.Value Then
    Sheets("Ямал_19Г").Activate
    Sheets("Ямал_19Г").Range("A1").Activate
  End If
End Sub

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

Форму саму показать не могу, т.к. работаю с рабочим документом, а там… сами понимаете… тайна.



0



6875 / 2807 / 533

Регистрация: 19.10.2012

Сообщений: 8,562

15.08.2017, 08:37

12

Сделать пример чтоб нам показать трудно было? Вон Alex77755 сделал…
А причину я Вам сразу и угадал



0



49 / 31 / 2

Регистрация: 14.02.2013

Сообщений: 677

15.08.2017, 09:01

 [ТС]

13

Hugo121, Alex77755, Dragokas, спасибо всем! Проблемы, оказалось, и не было =)



0



IT_Exp

Эксперт

87844 / 49110 / 22898

Регистрация: 17.06.2006

Сообщений: 92,604

15.08.2017, 09:01

Помогаю со студенческими работами здесь

Как при активации чекбокса сделать так, чтобы текстареа удалялась?
Нужен простой пример с функцией яваскрипт.
Существует текстареа и чекбокс
Как при активации…

При компиляции кода, ошибка Undeclared identifier:’Modified’,’Post’,’Append’ в данной процедуре. Что не так?
unit Unit4;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics,…

Как сделать так, чтобы при активации флажка в форме записывались данные в таблицу
Скажит, как сделать так, чтобы при активации флажка в форме записывались данные в таблицу. Т.е.,…

Описать процедуру так, чтобы при активации RadioButton определялось в какую систему счисления переводить
Помогите описать процедуру так, чтобы при активации RadioButton определялось в какую систему…

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:

13

Событие листа
Worksheet_SelectionChange

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

Заходим в окно VB, нажимая Alt+F11. Слева мы видим названия наших листов. Щёлкаем двойным щелчком по желаемому листу. Вверху имеется два окошка в которых по умолчанию написано General иDeclarations.

Выбираем в левом окне Worksheets, а в правом SelectionChange.

После этого появится следующая запись кода:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

End Sub

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

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Selection.Interior.ColorIndex = 5

End Sub

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

Хочу обратить внимание, что макрос работает только на том листе, который Вы выбрали слева в списке листов.

Рассмотрим ещё один пример, в котором будет выделяться всегда только одна ячейка на листе — активная ячейка (в видеоролике показано как это работает).

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

ActiveCell.Select

End Sub

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

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

a = ActiveCell.Column

If a

MsgBox «Курсор находится на столбце №» & a & » — это меньше 10.», _

vbInformation, «Пример»

Else

MsgBox «Курсор находится за пределами моего понимания!», _

vbInformation, «Пример»

End If

End Sub

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

Событие листа
Worksheet_SelectionChange

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

Заходим в окно VB, нажимая Alt+F11. Слева мы видим названия наших листов. Щёлкаем двойным щелчком по желаемому листу. Вверху имеется два окошка в которых по умолчанию написано General иDeclarations.

Выбираем в левом окне Worksheets, а в правом SelectionChange.

После этого появится следующая запись кода:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

End Sub

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

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Selection.Interior.ColorIndex = 5

End Sub

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

Хочу обратить внимание, что макрос работает только на том листе, который Вы выбрали слева в списке листов.

Рассмотрим ещё один пример, в котором будет выделяться всегда только одна ячейка на листе — активная ячейка (в видеоролике показано как это работает).

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

ActiveCell.Select

End Sub

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

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

a = ActiveCell.Column

If a

MsgBox «Курсор находится на столбце №» & a & » — это меньше 10.», _

vbInformation, «Пример»

Else

MsgBox «Курсор находится за пределами моего понимания!», _

vbInformation, «Пример»

End If

End Sub

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

Событие листа
Worksheet_Change

Рассмотрим событие, которое возникает при редактировании ячейки. Т.е. мы внесли какие-то данные в ячейку, вышли из режима редактирования и при этом у нас сразу сработал какой-то макрос.
Делается это следующим образом. Заходим в окно VB, щёлкаем слева по листу, событие которого хотим отслеживать. Открывается окно. В левом верхнем окошке выбираем пункт Worksheet и правом окошкеChange.

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

Private Sub Worksheet_Change(ByVal Target As Range)

End Sub

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

Stolbec = Target.Column

Stroka = Target.Row

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

Private Sub Worksheet_Change(ByVal Target As Range)

Stolbec = Target.Column

Stroka = Target.Row

MsgBox «Отредактирована ячейка Cells(» & Stroka & «,» & Stolbec & «)», _

vbInformation, «Пример»

End Sub

Рассмотрим такой пример когда, после редактирования ячейки, её текст автоматически закрашивается в синий цвет, а ячейка окрашивается в жёлтый цвет.

Private Sub Worksheet_Change(ByVal Target As Range)

Target.Font.ColorIndex = 5 ‘синий

Target.Interior.ColorIndex = 6 ‘жёлтый

End Sub

И всё бы ничего, отредактировали ячейку, потом выпполнился какой-то макрос. Но вот беда если записать такой макрос, то мы загрустим:

Private Sub Worksheet_Change(ByVal Target As Range)

Target.Cells = «Привет»

End Sub

А загрустим потому, что мы будем заносить в изменённую ячейку какие-то данные. То-есть мы опять её редактируем. Следовательно, как только макрос заносит данные в ячейку, он снова запускает сам себя. И у нас получается зацикливание. Для того чтобы этого не происходило используют дополнительную запись, которая блокирует запуск события в момент выполнения текущего.

Private Sub Worksheet_Change(ByVal Target As Range)

Application.EnableEvents = False

Target.Cells = «Привет»

Application.EnableEvents = True

End Sub

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

Событие листа. Двойной щелчок мыши.
BeforeDoubleClick

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

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

 

Делается это следующим образом. Заходим в окно VB, щёлкаем слева по необходимому листу. Открывается окно. В левом верхнем окошке выбираем пункт Worksheet, а правом окошке BeforeDoubleClick.

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

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

End Sub

Если в этот код поместить какое-нибудь информационное сообщение, то при двойном щелчке по ячейке, будет появляться это сообщение.

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

MsgBox «Вы совершили двойной клик!», vbInformation, «Пример»

End Sub

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

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

Cancel = True

MsgBox «Вы совершили двойной клик!», vbInformation, «Пример»

End Sub

Cancel = True может принимать только два значения True или False и об этом указано в наименовании макроса Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean).

Но такая запись активизирует двойной щелчёк на всём листе, и это конечно хорошо, но иногда возникает потребность задействовать только часть листа, например только столбец А. На этом этапе мы уже начинаем придумывать какие-то условия. И это можно осуществить всё при помощи того же If … End If или Select Case … End Select.

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

If ActiveCell.Column = 1 Then

Cancel = True

MsgBox «Вы совершили двойной клик!», vbInformation, «Пример»

End If

End Sub

При такой записи сообщение будет появляться только в том случае, если мы щёлкаем мышкой по столбцу А.

Усложним пример. Сделаем так, как показано в начале урока на левом рисунке. Попробуем Установить галочки, причём не во всём столбце, а в некотором диапазоне, например В2:В8. Ниже приведён макрос, который может это осуществить.

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

If Not Intersect(Target, Range(«B2:B8»)) Is Nothing Then

Target.Font.Name = «Marlett»

Cancel = True

If Target = «a» Then

Target.Interior.ColorIndex = 23

Target = «»

Else

Target = «a»

Target.Interior.ColorIndex = 6

End If

End If

End Sub

Теперь самое время пояснить его составляющие.

If Not … Is Nothing Then — если производится действие в указанном диапазоне, то выполняем условие. Другими словами, если ячейка, по которой произвели двойной щелчок, попадает в диапазон В2:В8, то выполняем макрос дальше после слова Then;

Intersect(Target, Range(«B2:B8»)) — это указывает переменную, которая должна принимать участие в диапазоне В2:В8, т.е. пересекаться в этом диапазоне, в данном случае это изменяемая ячейка;

Target.Font.Name = «Marlett» — устанавливаем имя шрифта в ячейке, который и отвечает за галочку;

If Target = «a» Then … — если в редактируемой ячейке стоит галочка, то убираем её и закрашиваем ячейку в синий цвет. В противном случае устанавливаем галочку и закрашиваем ячейку в жёлтый цвет.

Ту же самую функцию можно осуществить через другую запись:

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

St = Target.Column

Sk = Target.Row

If St = 2 And Sk 1 And Sk

Target.Font.Name = «Marlett»

Cancel = True

If Target = «a» Then

Target.Interior.ColorIndex = 23

Target = «»

Else

Target = «a»

Target.Interior.ColorIndex = 6

End If

End If

End Sub

Тут диапазон задаётся при помощи координат столбца и строки, а также обычных логических операторов.

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

В видеоматериале показаны примеры работ приведённых макросов, а также продемонстрирована полная запись их написания.

Правая кнопка мыши.
BeforeRightClick

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

Делается это следующим образом. Заходим в окно VB, щёлкаем слева по листу, событие которого хотим отслеживать. Открывается окно. В левом верхнем окошке выбираем пункт Worksheet и правом окошкеBeforeRightClick.

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

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)

End Sub

И если в этот макрос вставить какое-нибудь информационное сообщение, то при нажатии на правую кнопку мыши на заданном листе, нам отобразится оно.

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)

MsgBox «Вы нажали на ПКМ», vbInformation, «Пример»

End Sub

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

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)

Cancel = True

MsgBox «Вы нажали на ПКМ», vbInformation, «Пример»

End Sub

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

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)

Cancel = True

a = ActiveCell.Column

Select Case a

Case 1

ActiveCell.Interior.ColorIndex = 3

Case 2

ActiveCell.Interior.ColorIndex = 4

Case 3

ActiveCell.Interior.ColorIndex = 5

Case 4

ActiveCell.Interior.ColorIndex = 6

Case 5

ActiveCell.Interior.ColorIndex = 7

Case Else

ActiveCell.Interior.ColorIndex = xlNone

End Select

End Sub

В данном примере показано, что в зависимости от того куда Вы поставите курсор и нажмёте на правую кнопку мыши, ячейка примет окрас в зависимости от номера столбца. Тут рассмотрены только первые 5 столбцов листа. Всё что дальше 5 столбца, при нажатии на ПКМ будет обесцвечиваться.

Если выполнить вот такую запись:

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)

Cancel = True

End Sub

то правая кнопка мыши просто напросто не будет «работать», то-есть меню не будет появляться.

Добавление своего раздела в меню правой кнопки мыши

В следующем примере показано как добавить свои два раздела в меню (Окрасить ячейку и Обесцветить ячейку). При нажатии на правую кнопку мыши в меню появляется две новых команды.

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)

Dim a As Object

For Each a In Application.CommandBars(«cell»).Controls

If a.Tag = «brccm» Then a.Delete

Next a

With Application.CommandBars(«cell»).Controls.Add(Type:=msoControlButton, _

before:=1, temporary:=True)

.Caption = «Окрасить ячейку»

.OnAction = «cvet1»

.Tag = «brccm»

End With

With Application.CommandBars(«cell»).Controls.Add(Type:=msoControlButton, _

before:=2, temporary:=True)

.Caption = «Обесцветить ячейку»

.OnAction = «cvet0»

.Tag = «brccm»

End With

End Sub

При выборе «Окрасить ячейку», выделенный диапазон заливается синим цветом. При нажатии на «Обесцветить ячейку», выделенный диапазон ячеек обесцвечивается.
Работу данного кода можно посмотреть на «Листе 3» в примере. На видеоролике так же можно посмотреть его работу.

Создание своего собственного меню.
Как убрать стандартные команды в меню правой кнопки мыши?

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

Теперь разберём последовательность создания такого меню. Добавим в книгу новый модуль, на который разместим два макроса — NewMenu и MakroPrivet.

Option Explicit

Sub NewMenu()

Dim Contro As Object

‘Удаление Всех пунктов меню

For Each Contro In CommandBars(«Cell»).Controls

CommandBars(«Cell»).Controls(Contro.Caption).Delete

Next

‘СОздаём новое меню

CommandBars(«Cell»).Controls.Add.Caption = «Новое меню»

With CommandBars(«Cell»).Controls(«Новое меню»)

.OnAction = «MakroPrivet»

.FaceId = 263

End With

End Sub

Sub MakroPrivet() ‘Макрос, который воплняется при нажатии

MsgBox «Привет!», vbExclamation, «Привет»

End Sub

NewMenu — это макрос формирующий новое меню.
For Each… — это цикл, который перебирает все имеющиеся пункты в стандартном меню и удаляет их.
CommandBars(«Cell»).Controls.Add.Caption = «Новое меню» — при помощи этой команды мы создаём новый пункт меню с названием «Новое меню».
With CommandBars(«Cell»).Controls(«Новое меню»)… — Настраиваем параметры кнопки нового меню
.OnAction = «MakroPrivet» — это имя макроса, который сработает при нажатии на меню.
.FaceId = 263 — это «прибамбас» картинка, которая находится левее названия нашего меню «Новое меню».

MakroPrivet — как было указано выше, это макрос, который выполняется при нажатии на новое меню.
MsgBox «Привет!»… — сообщение, которое появляется при выполнении кода нового меню.

Теперь сделаем так, чтобы меню правой кнопки появлялось только при активации нашей книги. Т.е. если мы переключимся на другую книгу, то меню будет стандартное.
Для этого в окне VB щёлкаем слева по пункту «ЭтаКнига». Открывается окно. В левом верхнем окошке выбираем пункт Workbook и правом окошке Activate.

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

Private Sub Workbook_Activate()

End Sub

Вставим в этот макрос ссылку на макрос NewMenu, который находится в созданном модуле.

Private Sub Workbook_Activate()

NewMenu

End Sub

теперь при активации книги будет срабатывать макрос NewMenu, который и будет формировать наше новое меню.

Но тут есть один нюанс. При отткрытии ещё одного Excel-евского документа, не закрывая нашу книгу, в открытом документе будет появляться наше меню, что не желательно. Ведь мы хотим создать меню, которое будет работать только в нашей книге, а не в какой-то другой параллельно открытой. Чтобы такого не происходило добавим в нашу книгу макрос, который будет сбрасывать меню правой кнопки в настройки по умолчанию, при переключении пользователя на другую книгу.
Для этого в окне VB щёлкаем слева по пункту «ЭтаКнига». Открывается окно. В левом верхнем окошке выбираем пункт Workbook и правом окошке Deactivate

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

Private Sub Workbook_Deactivate()

Application.CommandBars(«Cell»).Reset

End Sub

Ну вот, теперь при активации нашей книги будет формироваться новое меню правой кнопки мыши. Но как только книга деактивируется, то-есть мы переключаемся на другой документ, меню сбрасывается.

Событие листа

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

Рассмотрим событие, которое возникает при активации листа. Делается это следующим образом. Заходим в окно VB, щёлкаем слева по необходимому листу. Открывается окно. В левом верхнем окошке выбираем пункт Worksheet, а правом окошке Worksheet_Activate.

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

Private Sub Worksheet_Activate()

End Sub

Если в этот код поместить какое-нибудь информационное сообщение, то при активации листа (например перейдти на лист 2, а затем опять на лист 1), нам будет появляться это сообщение (Пример: Лист 1).

Private Sub Worksheet_Activate()

MsgBox «Вы перешли на следующий уровень!», vbInformation, «Пример»

End Sub

Worksheet_Deactivate

Рассмотрим событие, которое возникает при деактивации листа, т.е. когда мы уходим с него. Делается это следующим образом. В левом верхнем окошке выбираем пункт Worksheet, а правом окошкеWorksheet_Deactivate.

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

Private Sub Worksheet_Deactivate()

End Sub

Если в этот код поместить какое-нибудь информационное сообщение, то при уходе с активного листа, нам будет появляться сообщение (Пример: Лист 2).

Private Sub Worksheet_Deactivate()

MsgBox «Вы покинули лист!», vbInformation, «Пример»

End Sub

Worksheet_Calculate

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

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

Private Sub Worksheet_Calculate()

End Sub

Если в этот код поместить какое-нибудь информационное сообщение, то при пересчёте формул на листе, нам будет появляться сообщение, например такое (Пример: Лист 3):

Private Sub Worksheet_Calculate()

MsgBox «Пересчёт листа выполнен!» & vbNewLine & _

«Последние изменения внёс » & Application.UserName & «!», _

vbInformation, «Пример»

End Sub

Application.UserName — это имя компьютера.

Событие листа

В этом уроке я рассмотрю оставшиеся события листа. Они вообще редко применяются, как я убедился на собственном опыте.

Worksheet_FollowHyperlink

Рассмотрим событие, которое возникает при переходе по ссылке. Делается это следующим образом. Заходим в окно VB, щёлкаем слева по необходимому листу. Открывается окно. В левом верхнем окошке выбираем пункт Worksheet, а правом окошке FollowHyperlink.

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

Private Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink)

End Sub

Если в этот код поместить какое-нибудь информационное сообщение, то при переходе по ссылке мы его увидим (Пример: Лист 1).

Private Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink)

MsgBox «Вы перешли по ссылке на мой сайт!», vbInformation, «Пример»

End Sub

Работа со сводными таблицами

И оставшиеся события — это события, которое происходят при работе со сводными таблицами. Делаются они аналогично предыдущим.

Worksheet_PivotTableAfterValueChange — Это событие возникает после изменения или пересчета ячейки либо диапазона ячеек в сводной таблице (для ячеек, содержащих формулы).

Worksheet_PivotTableBeforeAllocateChanges — Это событие происходит перед применением изменений к сводной таблице.
Событие PivotTableBeforeAllocateChanges происходит непосредственно перед выполнением программой Excel инструкции UPDATE CUBE для применения всех изменений к источнику данных OLAP в сводной таблице, и сразу же после того, как пользователь выберет применение изменений в пользовательском интерфейсе.

Worksheet_PivotTableBeforeCommitChanges — Это событие происходит перед внесением изменений в источник данных OLAP для сводной таблицы.
Событие PivotTableBeforeCommitChanges происходит непосредственно перед выполнением программой Excel инструкции COMMIT TRANSACTION над источником данных OLAP в сводной таблице, и сразу же после того, как пользователь выберет сохранение изменений для всей сводной таблицы.

Worksheet_PivotTableBeforeDiscardChanges — Это событие происходит перед отменой изменений в сводной таблице.
Происходит непосредственно перед тем, как Excel выполняет инструкцию ROLLBACK TRANSACTION в источнике данных OLAP, если транзакция все еще активна и очищает все измененные значения в сводной таблице, после того как пользователь выбрал отмену изменений.

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

Worksheet_PivotTableUpdate — Это событие происходит при обновлении отчета сводной таблицы на рабочем листе.

Надёжные расположения

Надежное расположение — это такое место на жестком диске (диск, папка), где Любой файл, можно открывать без проверки средствами центра обеспечения безопасности; кроме того, такие файлы не открываются в режиме защищенного просмотра.
Другими словами, если у Вас есть на диске папка, в которой у Вас хранятся все Ваши разработки, например с именем «Мои макросы» и Вы её «поместили» в надёжное расположение, то какие бы вы файлы с макросами в неё не помещали, у Вас Excel никогда не спросит подтверждение на запуск макросов и т.п.,независимо от того какие настройки безопасности у Вас стоят. В надёжных расположениях макросы всегда включены. Очень удобно помещать программы, которые Вы пишите или проверяете, но которым Вы доверяете, чтобы лишний раз не мучаться и «Включать содержимое».

Делается это следующим образом. Заходим на ленте во вкладку файл/параметры:

В открывшемся окне с левой стороны выбираем Центр управления безопасностью, а справойПараметры центра управления безопасностью

В следующем окне слева выбираем пункт Надёжные расположения.

Для того, чтобы добавить какую-то свою папку в надёжное расположение необходимо нажать на кнопку«Добавить новое расположение». После этого откроется следующее окно

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

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

Понравилась статья? Поделить с друзьями:
  • Excel vba макрос номер строки
  • Excel vba макрос на открытие файла
  • Excel vba макрос на открытие книги
  • Excel vba макрос который отключает макрос
  • Excel vba макрос закрыть книгу