Событие листа
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 никогда не спросит подтверждение на запуск макросов и т.п.,независимо от того какие настройки безопасности у Вас стоят. В надёжных расположениях макросы всегда включены. Очень удобно помещать программы, которые Вы пишите или проверяете, но которым Вы доверяете, чтобы лишний раз не мучаться и "Включать содержимое".
Делается это следующим образом. Заходим на ленте во вкладку файл/параметры:
В открывшемся окне с левой стороны выбираем Центр управления безопасностью, а справойПараметры центра управления безопасностью
В следующем окне слева выбираем пункт Надёжные расположения.
Для того, чтобы добавить какую-то свою папку в надёжное расположение необходимо нажать на кнопку"Добавить новое расположение". После этого откроется следующее окно
Нажимаем кнопку "Обзор" и выбираем ту папку в которой хотим разрешить все макросы. Обратите особое внимание на галочку "Также доверять всем вложенным папкам", если вы её не поставите, то макросы будут разрешены только в этой корневой папке, а вот если в ней имеются подпапки, то в них опять придётся разрешать и включать макросы в ручную.
Если же Вам не понравились Ваши надёжные расположения, то Вы можете их удалить или изменить.
Все папки, которые у Вас находятся в надёжных расположениях указаны в окне центра управления безопасностью в подпункте надёжные расположения, на рисунке ниже этот список показан в синем квадрате.