Версия для печати

Как программно снять пароль с 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.

Способ, как видите, действительно очень прост, но это порождает и недостатки. Главный недостаток: снятие пароля данным методом весьма нестабильно и иногда может не срабатывать. Так же во время работы данного кода крайне нежелательно пользоваться мышью и клавиатурой. Точнее даже не нежелательно, а просто нельзя, если вам необходим положительный результат.

Также см.:
Копирование модулей и форм из одной книги в другую
Как удалить макросы в книге?



Поддержать автора сайта
Поделиться ссылкой
  1. Евгений
    9 Декабрь 2011 в 15:58 | #1

    Способ отлично работает в Office 2003, но в 2010 вводимый пароль появляется в Исходном коде модуля…

  2. 9 Декабрь 2011 в 22:44 | #2

    Проверил на 2010 — отрабатывает как положено.

  3. Nerg
    29 Февраль 2012 в 17:17 | #3

    Здравствуйте! у меня пишет invalid password, хотя написал правильный пасворд. если ввожу вручную этот же пасворд то проект открывается. в чем проблема, а?

  4. 29 Февраль 2012 в 21:26 | #4

    Проблема в этом(я в статье написал): «Главный недостаток: снятие пароля данным методом весьма нестабильно и иногда может не срабатывать.»

  5. Nerg
    1 Март 2012 в 12:37 | #5

    Добрый день! а куда вставить код который удаляет макросы после снятия пароля. я вставляю код где написано «‘здесь Ваш код по внесению изменений в проект» и скрипт не срабатывает, пишет инвалид пасворд. код для удаления макросов тоже ваш, просто хотел их обьеденить, что-то не получается. Помогите пожалуйста?

  6. 1 Март 2012 в 13:03 | #6

    Так если пишет «Invalid password» — значит так оно и есть. Значит Вы код неверный указываете. Вы тильды поставили до и после самого пароля? Как в статье написано.

  7. Nerg
    1 Март 2012 в 13:09 | #7

    Нет, сам код снятия пароля работает нормально. Если добавляю код удаления макросов с книги, то снятия пароля не работает. Я хочу сперва снять пароль с проекта и после этого удалить все макросы с этой книги. И чтобы это все было в одной процедуре.

  8. 1 Март 2012 в 14:09 | #8

    Nerg, я не экстрасенс — я не знаю что Вы там и как накрутили, что у Вас пишет «неверный пароль». Я даю ответ так, как был задан вопрос. Пока что из Ваших вопросов понять можно одно — Вы что-то делаете не так. что не знаю. Почитайте тему на форуме: http://www.excel-vba.ru/forum/index.php?topic=996.0

Комментарий будет добавлен после проверки администратором.
Комментарии, не имеющие отношения к комментируемой статье, будут удаляться без уведомления и объяснения причин. Если есть вопрос по проблеме в Excel- добро пожаловаться на Форум