2012-02-23 3 views
4

Я написал метод макроса для автоматического сортировки столбцов в листе Excel при открытии листа. Однако это решение не работает в том случае, если пользователь не включил макросы в Excel.Excel VBA: Включение настроек макроса

Есть ли способ проверить, отключен ли пользователь в макросе VBA в Excel, а затем включить макросы с кодом Excel VBA?

ответ

3

Это функция безопасности. Если вы можете отключить его в Excel в vba, это приведет к поражению цели. Боюсь, ответ нет, пользователю нужно будет адаптировать свои параметры безопасности ...

Вы можете изменить настройки из другого приложения с помощью modifying the registry

+0

+1 для подхода к регистрации. Я пробовал это раньше с помощью [tag: vbs], и он работал нормально на локальной машине, это, вероятно, также можно выполнить через локальную сеть, подключившись к другим машинам. Но удаленный пользователь должен будет запустить сам код, чтобы установить параметры макроса, поэтому, чтобы получить разрешение, я иду по экрану заставки. – brettdj

9

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

  • Все листы в книге для экрана spash сделаны за исключением очень скрытый (который может быть изменен только с помощью VBA или редактора VBA)
  • если макросы включены:
    1) Когда открывается книга, код позволяет отобразить все эти очень скрытых листов
    2) Когда рабочая книга закрывается, то все эти листы сделаны очень скрытые снова
  • Если макрос s не включена, то пользователь может видеть только заставку с надписью «Пожалуйста, включите макросы, закройте и затем повторно открыть этот файл»

Две ссылки с полным кодом для этой техники, перечислены ниже

  1. Брэд Yundt покрывает этот here at TekTips
  2. Jonske at VBAeXpress
+2

Интересная техника – assylias

+3

Я бы выбрал что-то вроде первой ссылки выше, поскольку использует BeforeSave. Проблема с использованием BeforeClose заключается в том, что пользователь мог внести изменения, которые они не хотят сохранять, выбор, который переопределяется сохранением книги в событии BeforeClose, как во второй ссылке. Еще одна вещь заключается в том, что вам нужно обрабатывать любые листы, которые должны быть скрыты или, если это возможно, сделать это, были скрыты пользователем. –

+0

Код Брэда Юндта (ссылка # 1 выше, внизу страницы) почти работает, но не совсем. Он не проходит все 6 тестовых примеров ниже. Для каждого теста: откройте файл, включите макросы и выполните тест. PASS = нечетное поведение, и файл закрывает сложность. Тесты: (1) ... ничего не делать, закрыть. (2) ... введите в ячейку, закройте, скажем, NO при запросе сохранения. (3) ... введите в ячейку, закройте, скажите ДА при запросе сохранения. (4) ... введите в ячейку, сохраните, закройте. (5) ... введите в ячейку, закройте, скажите ОТМЕНА при сохранении подсказки, сохраните, закройте. (6) ... введите в ячейку, закройте, ОТМЕНА в командной строке, сохраните, введите в другую ячейку, закройте, YES при подсказке. –

0

Существует способ автоматизировать макрос, позволяющий, но вы должны иметь полный контроль над клиентской машине, по крайней мере ОНК е. Используя цифровые сертификаты и подписывая свои макросы с ним, при первом запуске макросов подписались, Excel предложит вам возможность всегда доверять макросам, подписанным этим, или нет. Когда вы доверяете, все макросы, подписанные с вашим сертификатом, будут автоматически включены.

Это лучший вариант для разработки и управления макросами в корпоративной сети.

Извините за ошибки. Мой английский еще не совершенен. ;)

С уважением

2

Вот альтернативный способ проверить, если VBA включен без необходимости, чтобы скрыть/показать листы. Проблема со скрытыми/скрытыми листами заключается в том, что рабочий лист можно сохранить в «включенном» состоянии, закрыть без сохранения, а затем снова открыть и не отображать предупреждение.

Создайте следующую функцию в модуле (не рабочий лист или рабочая книга макросов):

Public Function MacrosEnabled() 
    MacrosEnabled = True 
End Function 

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

=IF(ISERROR(MacrosEnabled()&NOW()),"Macros are disabled","Macros are enabled") 

Если вы просто использовать ISERROR(MacrosEnabled()) значение не пересчитывается каждый раз при открытии таблицы. Посредством конкатенации NOW() текущее время считывается каждый раз, когда электронная таблица открывается, и поэтому значение ячейки пересчитывается. Я тестировал этот метод широко, и он очень надежно указывает, включены ли макросы или нет.

Вы можете применить условное форматирование, чтобы сделать ряд вещей, если макросы отключены:

  • Выделите чек-клетки в ярком цвете, и, возможно, изменить «макросы отключены» текст, чтобы включить инструкции по включению макросов.

  • «Скрыть» ячейки, значения которых зависят от включения макросов, устанавливая цвет текста и цвет фона одинаковыми.

Here is a spreadsheet that demonstrates this method.