Страницы: Пред. 1 2
RSS
Программное заведение пароля на проект VBA
 
Msi2102  А вы упертый, как я. Ничего себе bedvit вас на 2 дня загрузил.  :D

Коллеги сейчас вот только пришло в голову, может диалоговые окна "Project Properties" разные у разных версий и клавиатурные комбинации для работы с ним, поэтому не срабатывает у всех один код. Я клавишами прошелся по окну у меня полностью все по коду сообщения№1 совпадает. Пошагово выполнить F8 не получается.
Может сверить клавиатурные комбинации окна. У меня Ctrl-Tab, пробел ,Tab,1,Tab,1,Tab,Enter.

Изменено: Евгений Смирнов - 03.02.2022 13:38:50
 
Msi2102, New, Ничего не поменялось у меня. Как и был без пароля проект так и остался без пароля после запуска кода и перезапуска файла.
Цитата
Дмитрий(The_Prist) Щербаков написал:
Думаю, что на 64-битных системах этот код не заработает
вы правы, не сработал.
 
Цитата
MikeVol написал:
64-битных системах
У меня тоже 64-битная система
 
Msi2102, я не профи но пишу по факту, не сработал код ни один из данной темы.
 
Коллеги, спасибо за столь разносторонний анализ. Насколько я понял этот путь не поиведет к успеху. Есть еще один (посоветовал Владимир Захаров).
https://www.mrexcel.com/board/threads/lock-unlock-vbaprojects-programmatically-without-sendkeys.1136415/
Выйду с больничного и хочу добавить в тот код поддержку RU. Если у кого-то получится раньше, милости прошу к публикации)
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
bedvit: посоветовал Владимир Захаров
не все знают, что это всеми любимый ZVI — указывай хоть если не ссылку, то никнейм-аббревиатуру  ;)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Коллеги, у всех этот макрос отрабатывает нормально, защита ставится?
Код
Sub Lock_Example() ''''''''''''''''''''''ЗАПУСКАЕМ КОМАНДУ НА ЗАЩИТУ ПРОЕКТА
Изменено: bedvit - 11.02.2022 01:37:01
«Бритва Оккама» или «Принцип Калашникова»?
 
У меня вроде работает. Только одно замечание. Вместо жестко указанного имени проекта(sWinClassName = "VBAProject - Project Properties") лучше использовать то, которое реально назначено:
Код
Dim sVBPrName$
sVBPrName = .ActiveVBProject.Name
sWinClassName = sVBPrName & " - Project Properties"
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
2010 32  W7 64  Отработал нормально.
Самая первая версия вызывала падение офиса.
 
Обнаружилась интересная особенность. При закрытии файла TestPasswordProject_2.xlsb, проект не закрывается. И при открытии его снова, открыты уже два одинаковых проекта. см. рис.

У всех так?
Что за проблема, как побороть?
Изменено: bedvit - 13.02.2022 12:32:50
«Бритва Оккама» или «Принцип Калашникова»?
 
Марокс отработал нормально
Цитата
bedvit написал:
проект не закрывается
Такой проблемы не обнаружил
Только выглядит не однозначно, но, повторюсь, отработал как положено
 
Msi2102, а в проектах не висит? Есть скрин? Красным отмеченно - это нормально.
«Бритва Оккама» или «Принцип Калашникова»?
 
Вот
 
Пришлось, выделить время, которого нет, и накидать свой вариант.  У всех отрабатывает нормально, интересует особенно 32х Excel
Код
Option Explicit

#If VBA7 Then
    Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
    Private Declare PtrSafe Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As LongPtr, ByVal hwnd2 As LongPtr, ByVal lpsz1 As String, ByVal lpsz2 As String) As LongPtr
    Private Declare PtrSafe Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As LongPtr, ByVal lpString As String, ByVal cch As Long) As Long
    Private Declare PtrSafe Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As LongPtr) As LongPtr
    Private Declare PtrSafe Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As LongPtr, ByVal wMsg As Long, ByVal wParam As LongPtr, ByVal lParam As String) As LongPtr
    Private Declare PtrSafe Function GetNextWindow Lib "user32" Alias "GetWindow" (ByVal hwnd As LongPtr, ByVal wFlag As Long) As LongPtr
    Private Declare PtrSafe Function GetDlgItem Lib "user32" (ByVal hDlg As LongPtr, ByVal nIDDlgItem As Long) As LongPtr
#Else
    Private Declare Function FindWindow Lib "user32" Alias "FindWindowA"(ByVal lpClassName As String, ByVal lpWindowName As String) As Long
    Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA"(ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String,ByVal lpsz2 As String) As Long
    Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA"(ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
    Private Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As Long) As Long
    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA"(ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
    Private Declare Function GetNextWindow Lib "user32" Alias "GetWindow" (ByVal hwnd As Long, ByVal wFlag As Long) As Long
    Private Declare Function GetDlgItem Lib "user32" (ByVal hDlg As Long, ByVal nIDDlgItem As Long) As Long
#End If

Const TCM_FIRST = &H1300
Const TCM_SETCURSEL = (TCM_FIRST + 12)
Const TCM_SETCURFOCUS = (TCM_FIRST + 48)
Const EM_SETMODIFY = &HB9
Const BM_SETCHECK = &HF1
Const BST_CHECKED = &H1
Const BM_GETCHECK = &HF0
Const BM_CLICK = &HF5
Const WM_SETTEXT = &HC
Const GW_CHILD = 5

Sub LockVBA()
    Dim xlAp As Object, oWb As Object, hwndSysTab As LongPtr, sPassword, hCurrentDlg As LongPtr, wbLock
    
    Set xlAp = CreateObject("Excel.Application")
    Set oWb = xlAp.Workbooks.Add
    Dim myModule As Object
    Set myModule = oWb.VBProject.VBComponents.Add(1)
    myModule.CodeModule.AddFromString ("Private Sub MyNewSub()" & vbNewLine & "   Cells(1, 1) = 1" & vbNewLine & "End Sub")
    xlAp.VBE.CommandBars(1).FindControl(ID:=2578, recursive:=True).Execute
    sPassword = "1"
    hCurrentDlg = FindWindow(vbNullString, "VBAProject - Project Properties")
    
    If hCurrentDlg <> 0 Then
        hwndSysTab = FindWindowEx(hCurrentDlg, 0, "SysTabControl32", vbNullString)
        Call SendMessage(hwndSysTab, TCM_SETCURFOCUS, 1, 0)
        Call SendMessage(hwndSysTab, TCM_SETCURSEL, 1, 0)

        If SendMessage(GetDlgItem(GetNextWindow(hCurrentDlg, GW_CHILD), &H1557), BM_GETCHECK, 0, 0) = 0 Then
            Call SendMessage(GetDlgItem(GetNextWindow(hCurrentDlg, GW_CHILD), &H1557), BM_SETCHECK, BST_CHECKED, 0)
            Call SendMessage(GetDlgItem(GetNextWindow(hCurrentDlg, GW_CHILD), &H1555), WM_SETTEXT, 0, sPassword)
            Call SendMessage(GetDlgItem(GetNextWindow(hCurrentDlg, GW_CHILD), &H1555), EM_SETMODIFY, True, 0)
            Call SendMessage(GetDlgItem(GetNextWindow(hCurrentDlg, GW_CHILD), &H1556), WM_SETTEXT, 0, sPassword)
            Call SendMessage(GetDlgItem(GetNextWindow(hCurrentDlg, GW_CHILD), &H1556), EM_SETMODIFY, True, 0)
        End If
        DoEvents
        Call SendMessage(GetDlgItem(hCurrentDlg, &H1), BM_CLICK, 0, 0)
        DoEvents
        oWb.SaveAs Filename:=Environ("Temp") & "\1.xlsm", FileFormat:=xlOpenXMLWorkbookMacroEnabled
        oWb.Close 0
        xlAp.Quit
    Else
        MsgBox "VBAProject Window VBAProject - Project Properties was not Found"
    End If

    Set wbLock = Workbooks.Open(Filename:=Environ("Temp") & "\1.xlsm")
    'wbLock.IsAddin = True

End Sub


Вот кстати как выглядит окно в разрезе дескрипторов, натменования окон и классов окон (каждая кнопка в win api это окно)
«Бритва Оккама» или «Принцип Калашникова»?
 
В целом отрабатывает, создает файл с модулем и макросом, устанавливает пароль "1", при сохранении файла: "файл ... уже существует в данном месте, заменить", при да всё нормально, при нет или отмена ошибка
Изменено: Msi2102 - 22.02.2022 19:43:08
 
Msi2102, Спасибо. Так и должно быть. Я так понимаю Excel x64 у вас?
«Бритва Оккама» или «Принцип Калашникова»?
 
Цитата
Msi2102 написал:
Процессор Intel® Core™ i5-9400F CPU @ 2.90GHz   2.90 GHzОперативная память 8,00 ГБТип системы 64-разрядная операционная система, процессор x64Office LTSC
Страницы: Пред. 1 2
Наверх