我有多个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
字符串
2条答案
按热度按时间332nm8kg1#
你的Excel版本是什么?我知道在2016 Excel中有一个错误,其中.vbe.Commandbars返回运行时错误5。我认为不幸的是,如果错误仍然存在,可能没有其他选择,只能手动解锁每个按钮。
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
块中使用)是:字符串