Страницы: 1
RSS
Программно снять пароль с VBAProject
 
Уважаемые форумчане,

Пожалуйста, подскажите кто знает решение проблемы, как программно (т.е. макросом) снять пароль VBAProject для того чтобы добавить новые модули?
Во вложении пустая книга с модулем. Пароль для VBAProject = 123.

Спасибо.
 
А поиск вообще по этому поводу ничего не говорит? :)
Как программно снять пароль с VBA проекта?
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий Щербаков, прбовал этот вариант. На первой книге спотыкается и вставляет заданный пароль в тело этого же макроса.
 
Не нашел варианта без Sendkeys.
 
Можно еще так попробовать (по-другому, но тоже SendKeys):
Код
' Снимает защиту проекта. Идея: http://www.rondebruin.nl/
Private Sub UnprotectVBProject(wb As Workbook, ByVal Password As String)
    Dim vbProj As Object, vbCtl As Object
    Set vbProj = wb.VBProject

    'can't do it if already unlocked!
    If vbProj.Protection <> 1 Then
        Exit Sub
    End If

    Set Application.VBE.ActiveVBProject = vbProj
    
    If Application.VBE.ActiveVBProject.Name <> vbProj.Name Then
      Exit Sub
    End If

    Set vbCtl = Application.VBE.CommandBars(1).FindControl(ID:=2578, recursive:=True)
    With vbCtl
        .Reset
        .Execute
    End With

    SendKeys Password & "~~", True
End Sub

На Вашей книге пароль проекта снимается.
Изменено: sokol92 - 20.03.2018 20:34:56
Владимир
 
sokol92, завтра проверю, отпишусь.
 
sokol92, вставляю макрос, однако 3-я строка горит красненьким, говорит Syntax error.
Такая же ситуация со строками 7-9, 13-15 и 21.
Что не так?
 
Странно. Пробуем вместе. Загрузите прилагаемый файл (это Ваш файл + макрос) и выполните макрос (Alt+F8) Unprotect. После этого попробуйте раскрыть проект.
Предварительно проверьте, что в Параметры центра управления безопасности/Параметры макросов выставлен флажок "Доверять доступ к объектной модели проектов VBA"
Владимир
 
sokol92, странно, в вашем файле не ругается. Пароль снимает, спасибо. Сейчас попробую прикрутить к своим нуждам.
Но по хорошему мне нужно снять защиту чтобы добавить модули, а не удалить его вообще. Есть какие-либо мысли на этот счет?
 
Макрос не удаляет защиту. Если Вы сохраните книгу и вновь ее откроете, то проект будет защищен. Если Вы предполагаете, что у пользователя (не автора) будут добавляться "на лету" модули, то это очень плохое решение по многим соображениям.
Владимир
 
sokol92, что-то не срабатывает, ломает файлы. Не могли бы глянуть, может где ошибка вкралась?
Код
Sub UnprotectVBProject(wb As Workbook, ByVal Password As String)
    Dim vbProj As Object, vbCtl As Object
    Set vbProj = wb.VBProject
 
    'can't do it if already unlocked!
    If vbProj.Protection <> 1 Then
        Exit Sub
    End If
 
    Set Application.VBE.ActiveVBProject = vbProj
     
    If Application.VBE.ActiveVBProject.Name <> vbProj.Name Then
      Exit Sub
    End If
 
    Set vbCtl = Application.VBE.CommandBars(1).FindControl(ID:=2578, recursive:=True)
    With vbCtl
        .Reset
        .Execute
    End With
 
    SendKeys Password & "~~", True
End Sub

Sub InsertModuleToTheWorkbooks()
    Dim sFolder As String, sFiles As String
    Dim CurrentModuleNumber As Long
    Dim wbFDP As Workbook
    Dim CurrentModule As String
    Dim objVBProject As Object
    Dim objVBComponent As Object
    Dim objWindow As Object
  
    sFolder = "C:\...\" 'folder path
    sFiles = Dir(sFolder & "*.XLSM") 'file path
 
    Do While sFiles <> ""
        Set wbFDP = Workbooks.Open(sFolder & sFiles) 'open workbook
        Set objVBProject = wbFDP.VBProject
        
        UnprotectVBProject wbFDP, "123" 'unprotect VBA Project
        
        'remove 5 old modules
        For CurrentModuleNumber = 1 To 5
            CurrentModule = "Module" & CurrentModuleNumber
            With wbFDP.VBProject.VBComponents
                .Remove wbFDP.VBProject.VBComponents(CurrentModule)
            End With
        Next CurrentModuleNumber
        
        'install 6 new modules
        For CurrentModuleNumber = 1 To 6
            CurrentModule = "Module" & CurrentModuleNumber
            With wbFDP.VBProject.VBComponents
                .Import "C:\...\" & CurrentModule & ".bas" 'path to new modules
            End With
        Next CurrentModuleNumber
        wbFDP.Close True

        sFiles = Dir
    Loop

Set objVBProject = Nothing:  Set objWindow = Nothing

End Sub
Изменено: ac1-caesar - 21.03.2018 13:49:23
 
В Вашем коде из #11 есть цикл по удалению модулей с именами Module1-Module5. В книге из #1 есть только Module1. Если конец цикла в строке 44 изменить на 1, то при выполнении макроса с проекта снимается защита и удаляется Module1 (проверил). Вставку модулей не проверял.
Владимир
 
sokol92, если с VBA заранее снести пароль,то отдельно процедуры по удалению и вставке работают. А вот когда VBA запаролен, то все в куче не хочет работать. Подозреваю где то спотыкается об SendKeys, но не уверен. С одним файлом работает, а вот несколько - не получается.
 
Сделайте устойчиво "вылетающий" пример, опишите подробно последовательность действий и приложите архив с необходимыми файлами.
Владимир
 
sokol92,собрал пакет.
В папке "Test" присутствуют эксель файлы для замены в них модулей, папка "FDP template modules" с новыми модулями и папка "Control" с управляющим эексель файлом. В файле "Control", модуле "InsertModuleToTheWorkbooks" пропишите свои пути расположения.
 
У Вас изначально нарушена структура книг fdp_*.xlsm (посмотрите на содержимое проектов). Создайте новые книги и перенесите в них информацию "битых". Затем продолжите эксперименты. Если что, выкладывайте новый архив.
Владимир
 
sokol92, не совсем понял в чем нарушена структура книг? Книги реальные, просто удалены данные из таблиц. Модули тоже рабочие.
Оставил немного данных. Вроде ни на что не ругается, но модули упорно не хочет менять.
 
Раскройте один проект (указав, естественно, пароль) и взгляните на его состав.Вы увидите 9 иконок рабочих книг (вместо одной).
Если оставить такую книгу "как есть", то в какой-то момент она придет в полностью нерабочее состояние (проверено).
Изменено: sokol92 - 21.03.2018 18:42:31
Владимир
 
Уважаемые форумчане, подскажите такое. После программного открытия кода, пароль не снимается, но проект остается открытым до тех пор, пока книга не будет открыта заново. Можно как-нибудь программно вернуть состояние защиты без закрытия/открытия книги?
 
Вопрос не по теме
 
пароль VBA штука не надежная  , ломается на раз два
 
Да я понимаю, просто защита от дурака, чтобы кривые ручки пользователей ничего не поломали. И все же, есть простое решение через управление свойствами или методами?

Цитата
vikttur написал: Вопрос не по теме
Возможно, я не прав, но мне кажется, что возврат в исходное состояние после программного открытия и изменения кода относится к поставленной автором проблеме - программное изменение кода. Но если перенесете в более правильный топик - я согласен.
 
А Вам не кажется, что тот, кому нужен ответ на Ваш вопрос, не будет искать его в этой теме?
 
Цитата
Kontugenyi написал:
но проект остается открытым до тех пор, пока книга не будет открыта заново
Не так давно, кто-то сильно проедал плешь именно с этим вопросом. Длинная была тема.
Страницы: 1
Наверх