Большинство наверняка знает как установить/снять пароль с VBA проекта вручную:

  1. Tools-VBAProject Properties-вкладка Protection;
  2. для защиты устанавливается галочка "Lock project for viewing"; для разблокировки - снимается;
  3. вписывается/удаляется сам пароль в полях 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.

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

Также см.:
[[Копирование модулей и форм из одной книги в другую]]
[[Как удалить макросы в книге?]]
[[Как добавить код процедуры программно, скопировать модуль]]
[[Защита листов/снятие защиты]]

Loading

22 комментария

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

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

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

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

  5. imort, Вы считаете свою критику справедливой? И почему Вы считаете "без соответствующих пояснений"? Прокомментирована почти каждая строка кода. Код работает нестабильно не из-за того, что без пояснения и выдранный откуда-то. Нестабильная работа обосновывается тем, что идет перебор окон проекта и к ним применяется метод SendKeys. Он как раз нестабилен.
    Может Вы предложите вариант лучше, если уж взялись за критику? Критиковать легко, когда сам ничего не сделал и не ведаешь как. А вот обоснованная критика с предложением лучших вариантов удается не всем.

Добавить комментарий

This site uses Akismet to reduce spam. Learn how your comment data is processed.