Большинство наверняка знает как установить/снять пароль с VBA проекта вручную:
- Tools-VBAProject Properties-вкладка Protection;
- для защиты устанавливается галочка "Lock project for viewing"; для разблокировки - снимается;
- вписывается/удаляется сам пароль в полях Password и Confirm password.
Предположу, что не очень многим может понадобиться снимать пароль с проекта VBA средствами самого VBA. Но все же данная тема имеет спрос, как я смог убедиться, общаясь на форумах. Прежде всего это может пригодиться тем, кто создает свои приложения на VBA и периодически нужно вносить изменения в уже созданные проекты(например копирование модулей и кодов из одного проекта в другой). Сразу оговорюсь: я не рассматриваю ситуации, когда вам неизвестен пароль к проекту. Предполагается, что вы знаете пароль и можете снять его вручную.
Я лично знаю два способа снять пароль программно: через метод SendKeys и использовании функций API. Т.к. второй способ довольно громоздкий и сложный для понимания - я в данной статье опишу лишь первый способ. Он не содежит каких-либо изысков и довольно прост.
Sub Unprotect_VBA() Dim objVBProject As Object, objVBComponent As Object, objWindow As Object Workbooks.Open "C:\1.xls" Set objVBProject = ActiveWorkbook.VBProject 'просматриваем все окна проекта в поисках окна снятия защиты For Each objWindow In objVBProject.VBE.Windows ' Type = 6 - это нужное нам окно If objWindow.Type = 6 Then objWindow.Visible = True objWindow.SetFocus: Exit For End If Next 'вводим пароль и подтверждаем ввод SendKeys "~1234~", True: SendKeys "{ENTER}", True 'здесь Ваш код по внесению изменений в проект Set objVBProject = Nothing: Set objVBComponent = Nothing: Set objWindow = Nothing ActiveWorkbook.Close True End Sub |
Код сначала открывает необходимую книгу, а затем снимает пароль с проекта.
"C:\1.xls" - полный путь к книге, включая расширение файла.
"~1234~" - пароль к проекту. Тильды нужны, но они не являются частью кода. Т.е. сам код это - 1234.
Способ, как видите, действительно очень прост, но это порождает и недостатки. Главный недостаток: снятие пароля данным методом весьма нестабильно и иногда может не срабатывать. Так же во время работы данного кода крайне нежелательно пользоваться мышью и клавиатурой. Точнее даже не нежелательно, а просто нельзя, если вам необходим положительный результат.
Также см.:
[[Копирование модулей и форм из одной книги в другую]]
[[Как удалить макросы в книге?]]
[[Как добавить код процедуры программно, скопировать модуль]]
[[Защита листов/снятие защиты]]
Способ отлично работает в Office 2003, но в 2010 вводимый пароль появляется в Исходном коде модуля...
Проверил на 2010 - отрабатывает как положено.
Здравствуйте! у меня пишет invalid password, хотя написал правильный пасворд. если ввожу вручную этот же пасворд то проект открывается. в чем проблема, а?
Проблема в этом(я в статье написал): "Главный недостаток: снятие пароля данным методом весьма нестабильно и иногда может не срабатывать."
Добрый день! а куда вставить код который удаляет макросы после снятия пароля. я вставляю код где написано "'здесь Ваш код по внесению изменений в проект" и скрипт не срабатывает, пишет инвалид пасворд. код для удаления макросов тоже ваш, просто хотел их обьеденить, что-то не получается. Помогите пожалуйста?
Так если пишет "Invalid password" - значит так оно и есть. Значит Вы код неверный указываете. Вы тильды поставили до и после самого пароля? Как в статье написано.
Нет, сам код снятия пароля работает нормально. Если добавляю код удаления макросов с книги, то снятия пароля не работает. Я хочу сперва снять пароль с проекта и после этого удалить все макросы с этой книги. И чтобы это все было в одной процедуре.
Nerg, я не экстрасенс - я не знаю что Вы там и как накрутили, что у Вас пишет "неверный пароль". Я даю ответ так, как был задан вопрос. Пока что из Ваших вопросов понять можно одно - Вы что-то делаете не так. что не знаю. Почитайте тему на форуме:http://www.excel-vba.ru/forum/index.php?topic=996.0
Какой-то код, выдранный из и-нета без соответствующих пояснений. Поэтому и работает не стабильно.
imort, Вы считаете свою критику справедливой? И почему Вы считаете "без соответствующих пояснений"? Прокомментирована почти каждая строка кода. Код работает нестабильно не из-за того, что без пояснения и выдранный откуда-то. Нестабильная работа обосновывается тем, что идет перебор окон проекта и к ним применяется метод SendKeys. Он как раз нестабилен.
Может Вы предложите вариант лучше, если уж взялись за критику? Критиковать легко, когда сам ничего не сделал и не ведаешь как. А вот обоснованная критика с предложением лучших вариантов удается не всем.