Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/41: Рейтинг темы: голосов - 41, средняя оценка - 4.95
0 / 0 / 0
Регистрация: 18.07.2011
Сообщений: 117
1

Управление макросами при открытии книги Excel

11.04.2007, 23:35. Показов 8153. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго всем времени суток. Вопрос звучит так:
как сделать так, чтобы при открытии книги, в случае если пользователь разрешил запустить макросы открываемой книги, то ничего не делаем, а в случае если он запретил, сообщить ему что он неправ и закрыть книгу.
Надеюсь что кто-нибудь знает как это возможно и возможно ли.
Заранее благодарен за любой ответ.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.04.2007, 23:35
Ответы с готовыми решениями:

Excel VBA. Выбор вкладки главного меню при открытии книги
Добрый день Знатоки. Подскажите пожалуйста, как при открытии книги сделать переключение...

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

Range.Find - ошибка при открытии книги Excel
Ошибка в самом конце кода. использую функцию .find для нахождения ячеек по их значению. Поиск...

Ошибка при работе с макросами Excel
Здравствуйте! При работе в Excel с толкнулся с такой ошибкой: Compile error in hidden module:...

17
2 / 2 / 0
Регистрация: 09.09.2009
Сообщений: 118
12.04.2007, 01:20 2
К сожалению, это бесполезно, и даже неправильно, т.к. пользователь имеет право защищаться от макровирусов (это как раз зловредные макросы)
Самый лучший вариант такой.
1. Сначала надо создать свой сертификат цифровой подписи у себя на компе (где разрабатывается макрос). Делается это так. Запустить
"C:Program FilesMicrosoft OfficeOffice10SELFCERT.EXE"
Там дать какое нибудь имя ну типа "CoolMacrosMaker" :-)

2. При разработке макроса, точнее, когда он уже разработан, надо в редакторе ВБА выйти
Tools -> Digital Signature -> Выбрать и выбрать тот сертификат. Но надо учесть, что при каждом изменении макроса, надо выбирать сертификат. Поэтому это лучше делать, когда макрос отлажен и не требует изменений.

Теперь, когда пользователь запустит такую книгу, появиться немного другая форма, на которой будет говориться, что там есть сертификат и при первом запуске надо поставить галочку возле "Доверять этому источнику".

После этого при 2-м и последующих запусках Ексель не будет спрашивать включать или отключить макросы, он их включит.
0
0 / 0 / 0
Регистрация: 05.03.2007
Сообщений: 23
12.04.2007, 14:45 3
Закрыть файл при отключенных макросах не возможно, а сообщить можно скажем так: сделать лист на котором будет надпись типа "Вы не включили макрос, закройте книгу и ...", а в Auto_Open поставить скрытие этого лита, соответственно при срабатывание Auto_Open ничего не видно а если не сработал, то надпись видна.
Топорно конечно, но как вариант.
0
0 / 0 / 0
Регистрация: 18.07.2011
Сообщений: 117
12.04.2007, 17:52  [ТС] 4
Спасибо за ответы, но это не подойдет, в своем случае я хотел четко зафиксировать через маркос кто и что делал, а так получается можно открыть книгу не включая макросы поменять что-нибудь, сохранить, закрыть и ни каких следов.
0
0 / 0 / 0
Регистрация: 05.03.2007
Сообщений: 23
12.04.2007, 19:02 5
В Auto_close поставить защиту всех литов, в Auto_Open снимать защиту. Тогда при отключении макросов ничего не изменят.
0
4 / 4 / 2
Регистрация: 06.03.2011
Сообщений: 151
12.04.2007, 20:16 6
Присвой "секретным" листам свойство Visible = xlVeryHidden.
Без включенных макросов увидеть их будет нельзя.
Желаю удачи!
0
0 / 0 / 0
Регистрация: 18.07.2011
Сообщений: 117
12.04.2007, 20:52  [ТС] 7
Vkodor, решение интересное попробовал, обкатал - работает! Но есть одно "но". Дело в том что у меня (если пользователь разрешил все-таки использовать макросы) призакрытии предлагается на выбор три варианта:
1) сохранить и менять версию док-та,
2) сохранить и не менять версию док-та
3) закрыть без сохранения.
Проблема заключается в том, что пользователь может в течение сеанса работы с док-ом несколько раз его сохранить, а привыходе и док-та выбрать вариант 3). В этом случае мне уже не попрятать все листы, оставив приэтом инфо-лист. книгу-то нельзя сохранять. Ведь не известно по делу он что-то менял или нет.
Что касается варианта предложенного MMOS, я об это тоже сразу подумал, но данное св-во поддерживается версией Excel не ниже 2007, а у юзеров как правило 2000 или 2003.
-----
MMOS извини, я пользуюсь 2007 что-то сначала не пошло, поискал в справке, а том сказано что поддерживается с 2007, а сейчас решил: "дай все-таки попробую", попробовал и получилось.
0
997 / 356 / 135
Регистрация: 27.10.2006
Сообщений: 764
12.04.2007, 22:57 8
По-моему, начиная с Excel 97 у листов во всех версиях Excel есть xlVeryHidden
У меня 2003 сейчас и код
Код
ActiveWorkbook.Sheets("Лист3").Visible = xlVeryHidden 'или 2
прекрасно работает
0
0 / 0 / 0
Регистрация: 05.03.2007
Сообщений: 23
13.04.2007, 18:58 9
Но есть одно "но"
Я понимаю конечно что код твой обрастает и обрастает, однако осмелюсь предложить тебе решение и этого вопроса.
также как и AutoOpen в книге есть
Visual Basic
1
2
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
End Sub
следовательно можно сделать все нужные манипуляции перед сохранением, а после сохранения восстановить, по суте нужны две процедуры которые можно запускать из разных мест.
0
0 / 0 / 0
Регистрация: 18.07.2011
Сообщений: 117
13.04.2007, 21:09  [ТС] 10
Понятно что есть: "Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)", только не понятно чем он мне может помочь. Ведь это процедура управляет только событием перед сохранением, вызванным соответствующей командой. Соответственно невозможно при нажатии кнопки "сохранить", взять и спрятать все листы кроме, листа с устрашающей надпиьсю "ТЫ ЗАБЫЛ ВКЛЮЧИТЬ МАКРОСЫ" .
Возможно я чего-то не знаю?
0
4 / 4 / 2
Регистрация: 06.03.2011
Сообщений: 151
13.04.2007, 21:13 11
В своё время создал много проектов на Excel VBA и пришёл к выводам:
1) от пользователя надо прятать всё, что можно
2) всё, что вводится, должно жёстко контролироваться
3) нельзя предоставлять пользователю контроль над сохранением.
Выполнение этих правил избавляет от многоих проблем.
Желаю успехов!
0
0 / 0 / 0
Регистрация: 18.07.2011
Сообщений: 117
13.04.2007, 21:25  [ТС] 12
mmos (13.04.2007)
В своё время создал много проектов на Excel VBA и пришёл к выводам:
1) от пользователя надо прятать всё, что можно
2) всё, что вводится, должно жёстко контролироваться
3) нельзя предоставлять пользователю контроль над сохранением.
Выполнение этих правил избавляет от многоих проблем.
Желаю успехов!
С первыми двумя пунктами я согласен полностью, но вот про 3 п. мне не понятно как можно контролировать сохранение документа? конечно можно убрать кнопку спанели и сторку из меню и запретить это редактировать, и создать свой вариант сохранения. Но запретить что-то сделать без отмены сохранения это у жестоко.
0
4 / 4 / 2
Регистрация: 06.03.2011
Сообщений: 151
13.04.2007, 21:36 13
Прочитай ещё раз пункт 2.
Если действия пользователя укладываются р "рамки" здравого смысла, то результаты действий сохраняются автоматически (как часто - решать тебе). Если пользователь со здравым смыслом не дружит, то ничего испортить ему не удастся. Конечно, возможность отката назад очень полезна, но не на сотни шагов. Если хочешь, чтобы проект нормально функционировал, ты должен быть его хозяином, а не неизвестно какой квалификации пользователь.
0
0 / 0 / 0
Регистрация: 05.03.2007
Сообщений: 23
13.04.2007, 21:42 14
Разве такой код не подойдет?
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    Application.EnableEvents = False 'отключаем события 
    For Each xlSh In ThisWorkbook.Worksheets
        If xlSh.Name <> "Лист1" Then xlSh.Visible = False
    Next
    ThisWorkbook.Save
    For Each xlSh In ThisWorkbook.Worksheets
        If xlSh.Name <> "лист1" Then xlSh.Visible = True
    Next
    Cancel = True
    Application.EnableEvents = True
End Sub
0
0 / 0 / 0
Регистрация: 05.03.2007
Сообщений: 23
13.04.2007, 21:51 15
Pavel55 (12.04.2007)
По-моему, начиная с Excel 97 у листов во всех версиях Excel есть xlVeryHidden
У меня 2003 сейчас и код
Код
ActiveWorkbook.Sheets("Лист3").Visible = xlVeryHidden 'или 2
прекрасно работает
У меня 2000 сейчас и код тоже прекрасно работает
Можно и вручную поставить это свойство как через VBA так и через панель "Элементы управления"
0
0 / 0 / 0
Регистрация: 05.03.2007
Сообщений: 23
13.04.2007, 22:01 16
mmos (13.04.2007)
В своё время создал много проектов на Excel VBA и пришёл к выводам:
1) от пользователя надо прятать всё, что можно
2) всё, что вводится, должно жёстко контролироваться
3) нельзя предоставлять пользователю контроль над сохранением.
Выполнение этих правил избавляет от многоих проблем.
Желаю успехов!
Я совершенно не согласен с такой точкой зрения.
1. Многие пользователи продвинуты, и поэтому прятать от них то к чему они привыкли значит наживать себе врагов
2. Конечно данные должны контролироваться, но только ключевые т.е. по которым производится поиск, сбор данных и т.п.
3. Нужно предоставлять контроль над сохранением(но в определенных рамках), иначе вся ответственность ложиться на разработчика, а это черевато.
0
0 / 0 / 0
Регистрация: 18.07.2011
Сообщений: 117
13.04.2007, 22:55  [ТС] 17
Разве такой код не подойдет?
такой код подойдет если руководствоваться твоими принципами п.2. В моем случае этот номер не пройдет. Должна остаться возможность выхода из книги без сохранения.
Скорее всего эту проблему можно решить только 3 способами:
1. С использованием сертификата (минус - опытный пользователь может это обойти);
2. Возможно управлять через другую книгу (наверно??!!), но это сложный способ.
3. Задача решения не имеет.
0
4 / 4 / 2
Регистрация: 06.03.2011
Сообщений: 151
16.04.2007, 14:59 18
Повозражаю VKODORу.
по п. 1) Расчитывать на то, что с твоим детищем будут работать только "правильные" пользователи - наивно. По-настоящему грамотный пользователь вообще не будет прибегать к твоим услугам, а всё сделает сам.
по п. 2) Я предпочитаю делить данные не по принципу ключевые - неключевые, а по принципу нужные - ненужные. Нужные всеми средствами защищаю, а ненужные к проекту не допускаю.
по п. 3) Контроль над сохранением или есть (полный) или его нет (это когда упоминаются "определённые рамки"). А ответственность разработчика - это святое. И виноватым во всём всегда будет разработчик. При этом зависимость количества врагов от достоинств проекта неоднозначна и порой обескураживает.
Делай всё по совести, не надейся на "продвинутого" пользователя и не бойся ответить за то, что сделал.
Желаю успехов!
0
16.04.2007, 14:59
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.04.2007, 14:59
Помогаю со студенческими работами здесь

Процессы при открытии книги
Здравствуйте. Подскажите как можно узнать какие процессоры выполняются в данные момент (см. на...

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

Показать форму при открытии книги
Всех с Наступающим Новым Годом! Как реализовать такую процедуру, при которой при открытиии книги...

Загрузка данных при открытии книги
Опишите плиз функци которая совершает процеруды в ней при открытии книги. Что нить типа Private...


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru