excel 如何在多个受保护的项目中更改模块的代码

gopyfrb3  于 2023-11-20  发布在  其他
关注(0)|答案(2)|浏览(102)

我有多个Excel文件自动更改其模块的代码之一。由于每个Excel项目是受保护的,我需要取消保护每个。
更多信息:https://www.mrexcel.com/board/threads/how-to-automatically-change-a-module-code-in-multiple-protected-visual-basic-projects.1242413/
在解锁功能中,
“删 debugging 误5”
当运行VBE.CommandBars指令时。
我尝试了不同版本的解锁功能。
解锁功能:https://www.mrexcel.com/board/threads/copy-code-from-a-protected-vba-project.1185364/
我的当前代码(注解为西班牙语):

Option Explicit

Sub UnLockAndViewVBAProject()
     With Application
        '//we execute the "VBAProject Properties..." control\\
        '//just to invoke the password dialog, the password\\
        '//must be given before the dialog can be shown :) \\
        .SendKeys "hola3"
         .SendKeys "{ENTER}"
        '//now reset the project password and relock it so\\
        '//that it's locked again when the workbook's closed\\
        .VBE.CommandBars("Menu Bar").Controls("Tools") _
            .Controls("VBAProject Properties...").Execute
        .SendKeys "^{TAB}"
        .SendKeys "{TAB}" & "{TAB}" & "{TAB}" & "hola3"
        .SendKeys "{TAB}" & "hola3"
        .SendKeys "{TAB}"
        .SendKeys "{ENTER}"
     End With
End Sub

Sub ACTUALIZAR_MODULO()
'Declaramos variables
Dim nArchivos, CodigoCopiar, CodigoPegar
Dim destino As String, NombreLibro As String
Dim FSO As Variant, i As Long, lineas As Long
Dim WB As Workbook
Dim unpassVB As String

'Desactivamos actualización de pantalla
Application.ScreenUpdating = False

'Seleccionamos uno o varios archivos
nArchivos = Application.GetOpenFilename(filefilter:="Excel (*.xls*),*.xls", _
Title:="SELECCIONAR ARCHIVO", MultiSelect:=True)

'Nombre de la hoja o del módulo (en este caso), cuyo código se quiere modificar
destino = "D_Utilidades"

'si no seleccionamos nada, salimos del proceso
If Not IsArray(nArchivos) Then
    Exit Sub
Else

    If destino = Empty Then
        Exit Sub
    Else
        
        'Recorremos mediante un array los archivos seleccionados
        For i = LBound(nArchivos) To UBound(nArchivos)
        
            'Abrimos cada archivo
            Set WB = Workbooks.Open(Filename:=(nArchivos(i)))
                    
            With ActiveWorkbook
            
                'Desprotegemos el proyecto de Visual Basic para poder comprobar si existe el módulo para tal archivo
                UnLockAndViewVBAProject
                
                'Borramos el código que queremos actualizar en los archivos seleccionados
                .VBProject.VBComponents(destino).CodeModule.DeleteLines 1, .VBProject.VBComponents(destino).CodeModule.CountOfLines
                
                'seleccionamos y copiamos el código de nuestro libro y que está en el módulo CODIGO A COPIAR
                Set CodigoCopiar = ThisWorkbook.VBProject.VBComponents("CODIGO_A_COPIAR").CodeModule
                'Pegamos en cada archivo y módulo seleccionado el código que hemos copiado
                Set CodigoPegar = .VBProject.VBComponents(destino).CodeModule
                lineas = CodigoCopiar.CountOfLines
                CodigoPegar.AddFromString CodigoCopiar.Lines(1, lineas)
                    
                'cerramos cada libro que hemos seleccionado y abierto
                WB.Close SaveChanges:=True
                
            End With
    
        Next i
        
    End If
    
End If

End Sub

字符串

332nm8kg

332nm8kg1#

你的Excel版本是什么?我知道在2016 Excel中有一个错误,其中.vbe.Commandbars返回运行时错误5。我认为不幸的是,如果错误仍然存在,可能没有其他选择,只能手动解锁每个按钮。

laawzig2

laawzig22#

这里有两个可能的问题。
1.如果您有Office显示语言设置(即在Excel用户界面,文件>选项>语言> Office显示语言)设置为使用西班牙语,是VBE菜单和控件使用该语言本地化的名称(疯狂...但这是真的)。您在代码中使用了英语名称,因此找不到相关的菜单和控件(例如,在西班牙语中,主菜单是“Barra de menús”而不是“Menu Bar”)更安全的解决方案是使用索引号.,即1。
1.你还会发现“VBAProject Properties.”按钮的名称会因特定项目的名称而改变,即只有“VBAProject Properties.”如果你的项目名称是“VBAProject”.如果你将项目重命名为“Foo”,那么按钮就变成了“Foo Properties."。更安全的解决方案是,而不是使用任何名称,就是使用索引号2578
相关的代码行(在With Application块中使用)是:

.VBE.CommandBars(1).FindControl(ID:=2578, Recursive:=True).Execute

字符串

相关问题