Риск безопасности и блокировка макросов

Microsoft Excel всегда с подозрением относился к файлам с макросами - особенно если они скачаны из какого-нибудь ненадежного источника , например, из интернета. И это вполне оправданно и понятно - макровирусы никто не отменял. Выражалось это в появлении примерно такого сообщения при открытии книги:

Старое предупреждение

Однако с недавних (обновления марта-апреля 2022 года) пор всё стало более сурово:

Предупреждение о блокировке макросов

Поменялся не только цвет предупреждения с жёлтого на красный, но и - что гораздо печальнее - пропала кнопка Включить содержимое (Enable content), позволявшая разблокировать макросы, если они вам всё-таки нужны. Нажатие же на кнопку Дополнительные сведения ничего не разрешает, а лишь приводит вас на сайт со справкой Microsoft по этой теме. 

Попытки выключить макросы стандартным образом через вкладку Разработчик - Безопасность макросов (Developer - Macro Security) тоже ни к чему не приводят - блокировка не снимается:

Макросы включены, но блокировка не снимается

Что же делать, если макросы в скачанном файле вам нужны для работы и необходимо их разблокировать?

Способ 1. Снятие блокировки в свойствах файла

Щёлкаем по файлу правой кнопкой мыши и выбираем команду Свойства (Properties). В открывшемся окне включаем галочку Разблокировать (Unblock):

Разблокировка

Жмём на ОК и проблема решена. Но это придется делать с каждым файлом персонально.

Способ 2. Доверенные расположения

Другой способ заключается в добавлении папки, где лежат ваши книги с заблокированными в них макросами в список надёжных расположений, т.е. источников, которым Excel априори доверяет. Тогда не придется разблокировать каждый файл в отдельности.

Для этого идём в Файл - Параметры - Центр управления безопасностью - Параметры центра управления безопасностью - Доверенные расположения (File - Options - Trust Center - Trust Center Settings - Trusted Locations):

Доверенные расположения

Жмём кнопку Добавить новое расположение и указываем папку с файлами. Затем давим на все ОК и перезапускаем Excel, чтобы сделанная настройка вступила в силу.

Вот и всё - и наши макросы опять в строю :)

Ссылки по теме



23.04.2024 09:17:57
Способ 1. В открывающемся окне нет окна "разблокировать".
Способ 2. Указанный сетевой путь заперещен параметрами безопасности.

ЗЫ*. MS OFFICE 2019
07.01.2025 16:45:57
Проблема появилась неожиданно, с установкой Kaspersky Standard:
Обычно использую Excel самый свежий 2024 (360) и 2003 (для предварительной подготовки, -- удобно и быстро), а ещё не надо задумываться где макросы...
с Макросами в MS Office 2024 (360) всё разрешилось сразу: "активные макросы в normal.dotm,
а вот с Excel 2003 (в нём много отработанных макросов) не получается.
Kaspersky Premium разрешает запустить Excel 2003, а когда я в ручную разрешаю запустить макросы, сбрасывает и  перегружает Excel, но уже с удалёнными макросами (по-своему чистит файл).
Все рекомендации службы поддержки выполнил, но проблема осталась, где установлен Kaspersky, с защитником  Windows  таких проблем нет.
P.S. Файлы храню в разрешённой папке (файлы исключений)
может Excel 2003 поместить в доверительные программы-исключения?
- - -
Уважаемый пользователь!
Выполните, пожалуйста, следующую диагностику.
1. Проверьте, пожалуйста, сохраняется ли описанная ситуация, если приостановить защиту продукта. Для этого:
• Щёлкните правой кнопкой мыши по значку программы в правом нижнем углу экрана, рядом с часами;
• В появившемся контекстном меню выберите пункт «Приостановить защиту…»;
• Из трёх опций приостановки защиты выберите просто «Приостановить» и нажмите на кнопку «Приостановить защиту»;
• Нажмите на кнопку «Продолжить» для подтверждения приостановки защиты.

2. Проверьте, пожалуйста, сохраняется ли описанная ситуация при полной выгрузке продукта из памяти. Для этого выйдите из продукта:
• Щёлкните правой кнопкой мыши по значку программы в правом нижнем углу экрана, рядом с часами;
• В появившемся контекстном меню выберите пункт «Выход»;
• Нажмите на кнопку «Продолжить» для подтверждения выгрузки защиты.

3. Если в обоих случаях ошибка/проблема не воспроизводится, попробуйте найти компонент защиты, который может влиять на наличие проблемы/ошибки.
• В левом нижнем углу главного окна программы нажмите на иконку шестерёнки (кнопка «Настройки»).
• В новом окне выберите вкладку «Настройки безопасности».
• Отключите все компоненты защиты, установив переключатель для каждого компонента в состояние «Выключить» (серого цвета).
• Далее последовательно необходимо включать компонент за компонентом. Начните с «Файлового Антивируса».
• Проверьте, воспроизводится ли проблема. Если нет, включаем следующий компонент, не отключая ранее включённый.
• Повторяем это процедуру с остальными компонентами защиты до тех пор, пока включение очередного компонента не приведёт к воспроизведению проблемы.
Информацию об этом компоненте сообщите нам.


Мы будем ждать ваш ответ 7 дней. Если что-то не получается, не работает, или нужно больше времени, обязательно ответьте на это письмо и скажите нам об этом.

С уважением,
Служба технической поддержки
АО «Лаборатория Касперского»
= = =
Касперский на самом деле работает лучше остальных, а главное шустро...
Может Вы, что-то посоветуете.

09.01.2025 16:21:09
Ну, тут сложно что-то советовать.
Разве что перейти полностью на современную версию Excel и отказаться от версии 20-летней давности (на которой и возникает проблема, как я понял).
24.02.2025 17:06:42
... оказалось, это глюк Kaspersky, они его устранили:facepalm:
У меня установлены обе версии Excel 2003 и самая последняя, которой приходится пользоваться
(ну не люблю я эти ленты и панели быстрого доступа), в редких случаях...
Быстрее работает Excel 2003
Кстати, услуги ЖКХ
  1. где можно скачать актуальные тарифы ЖКХ, хотя-бы для Москвы.
  2. как просчитать расход воды и электричества, если есть пропуски в снятии показаний приборов =ЕСЛИ(B8<>0;ЕСЛИ(B7;B8-B7;B8-B6);0), -- это если один пропуск, а если 2-3? Хочется написать простую лаконичную формулу, чтобы из сегодняшних показаний вычитались последние снятые данные за квартал или чуть больше, с новыми возможностями Excel 2024 (365)
  3. Текст макроса курсов валют ЦБРФ, когда нужно больше 3-х валют а ещё последние изменения Ключевой Ставки и других актуальных финансовых показателей правая колонка cbr.ru и rbc.ru/
    Написал макрос по Вашим примерам:
Option Explicit

Sub Get_Currency_CBR()
   '*** макрос получения данных курсов валют с CBR для двух валют

   ' Переменные:
   Dim iIndex As Long ' номер строки полученных данных
   Dim Sdate As Date ' начальная дата загружаемого периода
   Dim Edate As Date ' конечная дата загружаемого периода
   Dim CurrencyCode1 As String ' код первой валюты на cbr.ru
   Dim CurrencyCode2 As String ' код второй валюты на cbr.ru
   Dim CurrencyName1 As String ' название первой валюты (из ячейки D3)
   Dim CurrencyName2 As String ' название второй валюты (из ячейки D6)
   Dim LastDaylyRow As Long   ' номер последней строки в дневных данных
   Dim RowDailyCounter As Long  ' счетчик строк в дневных данных
   Dim AutoCalc As Boolean  ' определяет, мень ли автоматический пересчет функций или нет
   Dim URL1 As String  ' url запроса для первой валюты
   Dim URL2 As String  ' url запроса для второй валюты
   Dim Xmldoc As Object  ' MSXML2.DOMDocument
   Dim NodeList As Object
   Dim XmlNode As Object
   Dim NodeAttr As Object

   ' Отключение автоматического пересчета на листе
   If Application.Calculation = xlAutomatic Then
       Application.Calculation = xlManual
       AutoCalc = True
   End If

   ' Сохраняем параметры запроса из листа Excel
   If IsEmpty(Range("E4";)) Then
       Sdate = "01.01.1990"
   Else
       Sdate = Format(Range("E4";), "dd.mm.yyyy";) ' сохраняем начальную дату
   End If

   If IsEmpty(Range("E5";)) Then
       Edate = Date
   Else
       Edate = Format(Range("E5";), "dd.mm.yyyy";) ' сохраняем конечную дату
   End If

   ' Получаем коды валют и названия валют
   CurrencyCode1 = Range("E3";).Value ' код первой валюты
   CurrencyName1 = Range("D3";).Value ' название первой валюты
   CurrencyCode2 = Range("E6";).Value ' код второй валюты
   CurrencyName2 = Range("D6";).Value ' название второй валюты

   ' Удаляем старые данные
   Columns("A:C";).ClearContents ' очистка трех первых колонок (дата, значения первой валюты, значения второй валюты)

   ' Подписываем заголовки столбцов
   ActiveSheet.Cells(1, 1).Value = "Дата"
   ActiveSheet.Cells(1, 2).Value = CurrencyName1 ' Название первой валюты
   ActiveSheet.Cells(1, 3).Value = CurrencyName2 ' Название второй валюты

   ' *** получаем дневные данные для первой валюты
   Set Xmldoc = CreateObject("Msxml.DOMDocument";)
   Xmldoc.async = False

   ' Формируется строка запроса к сайту для первой валюты
   URL1 = "http://www.cbr.ru/scripts/XML_dynamic.asp?date_req1=" + Trim(Sdate) + "&date_req2=" + Trim(Edate) + "&VAL_NM_RQ=" + Trim(CurrencyCode1)

   ' Далее обрабатывается xml
   If Not Xmldoc.Load(URL1) = True Then
       MsgBox ("Ошибка загрузки данных для " & CurrencyCode1 & " из cbr.ru";)
       Application.Quit
       Exit Sub
   End If

   Set NodeList = Xmldoc.SelectNodes("*/Record";)

   ' Заполнение данных первой валюты
   For iIndex = 0 To NodeList.Length - 1
       Set XmlNode = NodeList.Item(iIndex).CloneNode(True)
       Set NodeAttr = XmlNode.Attributes(0)

       ActiveSheet.Cells(NodeList.Length - iIndex + 1, 1).Value = CDate(NodeAttr.Value) ' формируем даты
       ActiveSheet.Cells(NodeList.Length - iIndex + 1, 2).Value = CDbl(XmlNode.ChildNodes(1).Text) ' формируем данные
   Next

   ' *** получаем дневные данные для второй валюты
   Set Xmldoc = CreateObject("Msxml.DOMDocument";)
   Xmldoc.async = False

   ' Формируется строка запроса к сайту для второй валюты
   URL2 = "http://www.cbr.ru/scripts/XML_dynamic.asp?date_req1=" + Trim(Sdate) + "&date_req2=" + Trim(Edate) + "&VAL_NM_RQ=" + Trim(CurrencyCode2)

   ' Далее обрабатывается xml для второй валюты
   If Not Xmldoc.Load(URL2) = True Then
       MsgBox ("Ошибка загрузки данных для " & CurrencyCode2 & " из cbr.ru";)
       Application.Quit
       Exit Sub
   End If

   Set NodeList = Xmldoc.SelectNodes("*/Record";)

   ' Заполнение данных второй валюты
   For iIndex = 0 To NodeList.Length - 1
       Set XmlNode = NodeList.Item(iIndex).CloneNode(True)
       Set NodeAttr = XmlNode.Attributes(0)

       ActiveSheet.Cells(NodeList.Length - iIndex + 1, 3).Value = CDbl(XmlNode.ChildNodes(1).Text) ' формируем данные для второй валюты
   Next

   ' Включаем автопересчет формул
   Application.Calculation = xlAutomatic

End Sub
Наверх