Большинство наверняка знает как установить/снять пароль с 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 TrueEnd 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.
Способ, как видите, действительно очень прост, но это порождает и недостатки. Главный недостаток: снятие пароля данным методом весьма нестабильно и иногда может не срабатывать. Так же во время работы данного кода крайне нежелательно пользоваться мышью и клавиатурой. Точнее даже не нежелательно, а просто нельзя, если вам необходим положительный результат.