Proyecto de VBA: Protección de contraseña con SendKeys que no funciona correctamente

He pasado los últimos dos días trabajando en este problema. La mayoría del contenido que he encontrado sobre este tema no aborda el problema que tengo, así que espero que alguien aquí pueda ayudarme.

He estado trabajando en un código que hace lo siguiente de un libro de trabajo "Master Scorecard":

Toma cada hoja de "estudiante" del libro de trabajo y copia la hoja en un nuevo libro de trabajo,Hace algunas manipulaciones menores del nuevo libro de trabajo,Importa un módulo de código en el nuevo libro de trabajo,Añade unWorkbook_Open evento y unWorkbook_BeforeClose evento al nuevo libro de trabajo (para hacer ciertas hojasxlVeryHidden dependiendo del nivel de acceso),Ejecuta un subprocedimiento desde el módulo recién importado,Guarda y cierra el libro de trabajo.

Cada cuadro de mando utiliza un código para garantizar que solo la persona cuyo nombre está en el cuadro de mando pueda acceder a él. he usadoEnviron("username") en los eventos del libro de trabajo para garantizar la seguridad, pero como usted bien sabe, si uno y entiende cómo ejecutar macros, él / ella podría simplemente abrir elVBEditor y mostrar elxlVeryHidden Hojas en el libro de trabajo muy fácilmente.

Entonces, mi idea fue proteger con contraseña el nuevo libro de trabajo.VBAProject programáticamente (ver arriba: paso número cinco). He encontrado algunas fuentes en línea de cómo usarSendKeys para lograr este objetivo (ver más abajo), peroSendKeys no es confiable (en el mejor de los casos) y no está cooperando con mi código. El código funciona como un hechizo si lo ejecuto solo, pero si lo llamo desde otro proyecto usandoRun Macro:="filename!macroname" no establece la protección. Después de que el código se haya ejecutado y todos los libros de trabajo hayan sido creados, elVBAProject Las ventanas de propiedades del código anterior están abiertas e intentan ejecutarse al mismo tiempo que se bloquea Excel.

Sub LockVBAProject()

Const VBAProjectPassword As String = "123"
Dim VBP As VBProject, openWin As VBIDE.Window
Dim wbActive As Workbook
Dim i As Integer
    Set wbActive = ActiveWorkbook
    Set VBP = wbActive.VBProject
    Application.ScreenUpdating = False
        ' close any code windows to ensure we hit the right project
        For Each openWin In VBP.VBE.Windows
            If InStr(openWin.Caption, "(") > 0 Then openWin.Close
        Next openWin
        wbActive.Activate
With Application
    '//execute the controls to lock the project\\
    .VBE.CommandBars("Menu Bar").Controls("Tools") _
        .Controls("VBAProject Properties...").Execute
    '//activate 'protection'\\
    .SendKeys "^{TAB}"
    '//CAUTION: this either checks OR UNchecks the\\
    '//"Lock Project for Viewing" checkbox, if it's already\\
    '//been locked for viewing, then this will UNlock it\\
    .SendKeys "{ }"
    '//enter password\\
    .SendKeys "{TAB}" & VBAProjectPassword
    '//confirm password\\
    .SendKeys "{TAB}" & VBAProjectPassword
    '//scroll down to OK key\\
    .SendKeys "{TAB}"
    '//click OK key\\
    .SendKeys "{ENTER}"
    'the project is now locked - this takes effect
    'the very next time the book's opened...
    End With


ThisWorkbook.SaveAs Filename:=Sheets(Sheets.Count).Name, FileFormat:=xlOpenXMLWorkbookMacroEnabled

Debug.Print "It Worked " & Now()

End Sub

No estoy seguro de por qué sucede esto; como dije, el código funciona bien cuando se ejecuta por sí solo. encontréesta publicación dóndeeste enlace a un no-SendKeys El enfoque fue delineado, pero fue escrito hace varios años y no estoy seguro de cómo necesitaría modificarlo para mis propósitos ya que nunca he codificado en VB6 ...

¿Hay alguna idea de por qué elSendKeys ¿Se está agrupando el método después de que el código ya se haya ejecutado en lugar de ejecutarse cuando se supone que se debe hacer durante el código? Debo abandonarSendKeys ¿A favor de este otro método? Estoy en una pérdida, por lo que cualquier ayuda será muy apreciada!

EDITAR: Creo que la razón por la que el código no funciona es porque el proyecto correcto no está activado en el momento en queSendKeys se ejecuta el codigo Esperaba que la activación del libro de ejercicios adecuado solucionara el problema, pero no parece haber ayudado.

Respuestas a la pregunta(2)

Su respuesta a la pregunta