Как программно снять пароль с VBA проекта?
Что умеет Excel
Предположу, что не очень многим может понадобиться снимать пароль с проекта 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
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.
Способ, как видите, действительно очень прост, но это порождает и недостатки. Главный недостаток: снятие пароля данным методом весьма нестабильно и иногда может не срабатывать. Так же во время работы данного кода крайне нежелательно пользоваться мышью и клавиатурой. Точнее даже не нежелательно, а просто нельзя, если вам необходим положительный результат.
Также см.:
→Копирование модулей и форм из одной книги в другую
→Как удалить макросы в книге?

4858

Способ отлично работает в Office 2003, но в 2010 вводимый пароль появляется в Исходном коде модуля…
Проверил на 2010 — отрабатывает как положено.
Здравствуйте! у меня пишет invalid password, хотя написал правильный пасворд. если ввожу вручную этот же пасворд то проект открывается. в чем проблема, а?
Проблема в этом(я в статье написал): «Главный недостаток: снятие пароля данным методом весьма нестабильно и иногда может не срабатывать.»
Добрый день! а куда вставить код который удаляет макросы после снятия пароля. я вставляю код где написано «‘здесь Ваш код по внесению изменений в проект» и скрипт не срабатывает, пишет инвалид пасворд. код для удаления макросов тоже ваш, просто хотел их обьеденить, что-то не получается. Помогите пожалуйста?
Так если пишет «Invalid password» — значит так оно и есть. Значит Вы код неверный указываете. Вы тильды поставили до и после самого пароля? Как в статье написано.
Нет, сам код снятия пароля работает нормально. Если добавляю код удаления макросов с книги, то снятия пароля не работает. Я хочу сперва снять пароль с проекта и после этого удалить все макросы с этой книги. И чтобы это все было в одной процедуре.
Nerg, я не экстрасенс — я не знаю что Вы там и как накрутили, что у Вас пишет «неверный пароль». Я даю ответ так, как был задан вопрос. Пока что из Ваших вопросов понять можно одно — Вы что-то делаете не так. что не знаю. Почитайте тему на форуме: