Hola a todos:
Hace unos días un lector me enviaba una consulta acerca de cómo podía eliminar una macro utilizando otra macro.
Aunque no suele ser muy habitual este tipo de procedimientos, dado que implica que si nos equivocamos podemos eliminar código o macros por equivocación, la verdad es que me pareció interesante para publicar en la web.
Antes de comenzar con el ejercicio, para que la macro funcione es necesario realizar unas modificaciones en el centro de confianza de nuestro programa de Excel. Para hacerlo, debéis entrar en Archivo > Opciones y pulsar en Centro de Confianza:
A continuación se mostrará esta otra pantalla:
Elegimos la opción Configuración de macros y activamos la casilla que pone: Confiar en el acceso al modelo de objetos de proyectos de VBA, y aceptamos.
Es importante que realicemos este paso, si no lo hacemos la macro que os voy a mostrar generará un error y no se ejecutará.
Ahora veamos dos formas de realizar el borrado de nuestros procesos. Por una parte podemos eliminar el contenido de un módulo entero, aunque tenga varios sub o funciones. Simplemente queremos vaciar de contenido todo el módulo.
Para realizar esto, este es el código que podemos utilizar:
Sub Borrar_módulo()
'Declaramos variables
Dim modulo As String
'Eliminamos todo el contenido del módulo que indiquemos
modulo = "Módulo1"
With ThisWorkbook
.VBProject.VBComponents(modulo).CodeModule.DeleteLines 1, .VBProject.VBComponents(modulo).CodeModule.CountOfLines
End With
End Sub
En este caso estamos eliminando todo el contenido del módulo 1, si quisiéramos borrar el contenido «ThisWorkBook», simplemente lo indicamos en la macro sustituyéndolo en la macro.
Pero también puede que solo deseemos eliminar un procedimiento concreto y no todo. Para eso, utilizaremos el siguiente código:
Sub Borrar_macro()
'Declaramos variables
Dim fin As Long
Dim inicio As Long
Dim modulo As Object
'Indicamos el módulo en el que queremos borrar la macro
Set modulo = ThisWorkbook.VBProject.VBComponents("Módulo1").CodeModule
'Indicamos el nombre del procedimiento o macro a eliminar
With modulo
inicio = .ProcStartLine("Borrar_módulo", vbext_pk_Proc)
fin = .ProcCountLines("Borrar_módulo", vbext_pk_Proc)
.DeleteLines inicio, fin
End With
End Sub
En este caso borraremos solo este código especificando el nombre de la subrutina anterior (Borrar_módulo) y que esté incluida en el módulo 1 de nuestro proyecto de VBA.
Obviamente podremos cambiar los valores en función de nuestra necesidades.
No voy a dejar archivo de ejemplo porque no estoy interactuando con la hoja ni vamos a crear datos, y no creo que sea necesario dado que solo necesitáis el código para y leer el post para poder realizar el ejemplo por vosotros mismos. De todas formas si tenéis dudas, me comentáis.
Por cierto, cuidado con este tipo de programaciones, recordad que estamos borrando código y debéis ser muy cuidadosos a la hora de programar, ¿ok?.
Eso es todo, espero que os haya gustado!. : )
¿Te ha resultado de interés?, puedes apoyar a Excel Signum con una pequeña donación.
¡¡Muchas gracias!!
Mediante la suscripción al blog, la realización comentarios o el uso del formulario de contacto estás dando tu consentimiento expreso al tratamiento de los datos personales proporcionados según lo dispuesto en la ley vigente (LOPD). Tienes más información al respecto en esta página del blog: Política de Privacidad y Cookies
GENIAL ¡¡¡ Muchisimas gracias
GENIAL ¡¡¡ Muchisimas gracias
no me funciono, me sale un error con esto
vbext_pk_Proc
Hola sustituye vbext_pk_Proc por 0, debería solucionar el problema. Si no es así, debes activar la referencia: Microsoft Visual Basic for Applications Extensibility
Una pregunta como puedo programar una macro para eliminar todas las Macros creadas en personal en una fecha específica? Y además borrar la macro Add que es un archivo que, se usa en el complemento de Excel y que también se elimine en la misma fecha que se le indicará?
Para programar un tarea y que se ejecute una macro en un determinado momento puede usar el programador de tareas:
https://excelsignum.com/2018/02/10/ejecutar-una-macro-con-el-programador-de-tareas-de-windows/
y para eliminar el código:
Sub eliminar()
On Error Resume Next
Dim Compomente As Object
For Each Compomente In ActiveWorkbook.VBProject.VBComponents
ActiveWorkbook.VBProject.VBComponents.Remove Compomente
Next
End Sub
Don Segu no entendi su respuesta, lo que necesito es programar una macro para que en un día y hora determinada que yo le indique me elimine todos los códigos VBA (es decir que elimine todos los modulos creados en las macros guadadas en PERSONAL y que además quite el complemento ADD usado en las macros y que además tambien elimine el archivo ADD que está en el escritorio de la Computadora).
Gracias.
Hola Edgar:
Te estoy indicando cómo puedes confeccionar la macro:
Por un lado eliminas los módulos con esto:
Sub eliminar()
On Error Resume Next
Dim Compomente As Object
For Each Compomente In ActiveWorkbook.VBProject.VBComponents
ActiveWorkbook.VBProject.VBComponents.Remove Compomente
Next
End Sub
y por otro lado eliminas los AddIn (los deshabilitas). Debería funcionar con un for.
Dim Complemento As AddIn
For Each Complemento In Application.AddIns
Complemento.Installed = False
Next
El tema de ejecutarlos a una hora determinada, se puede hacer de dos formas, a través de windows que es como te lo indico en el post y con VBA
sería así incluyendo este código en thisworkbook
Private Sub Workbook_Open()
Application.OnTime TimeValue(«8:00:00»), «eliminar»
End Sub
Esas serían las instrucciones para hacerlo. Saludos.
Pero don Segu, como le puedo poner que la Macro se me ejecute en un día específico que yo le pueda dar la fecha, es decir, que yo en la macro le declare el día en que debe ejecutar la macro, puede ser que le indique todos los miércoles a las 8:00 am o solamente un dia como por ejemplo el 10/01/2021?.
Hola Edgar:
La pregunta no está relacionado con el post, de todas formas, para hacer lo que pretendes tienes dos alternativas,
O lo haces con programación utilizando el método application.wait: https://docs.microsoft.com/es-es/office/vba/api/excel.application.wait y ahí configurarlo según tus necesidades.
o utilizando windows con el programador de tareas, te dejo un post sobre esto: https://excelsignum.com/2018/02/10/ejecutar-una-macro-con-el-programador-de-tareas-de-windows/
Te recomiendo la segunda.
Saludos.
Hola MASTER; una consulta:
Para que elimine todas las macros excepto las ultimas tres hojas (anteriores) de donde se ejecuta la macro?
Me explico: Tengo un archivo de reportes mensuales, diariamente se agrega una hoja «DIA» y otra «NOCHE», entonces seria ver la posibilidad de que se pudieran borrar las macros de las hojas, conforme se vaya creando la siguiente, dejando siempre las tres hojas anteriores intactas (a manera de respaldo de las macros que contiene).
Considerando también que a principio de mes no habrá hojas «anteriores» para no tener errores en el código.
De antemano gracias!!!
Tendría que ver y analizar el proceso. En estos momentos estoy bastante escaso de tiempo, en cuanto me libero lo intento
Buenos dias Segu, estuve viendo este post porque queria saber si es posible crear una macro haciendo uso de macros…dado que este post habla de eliminar macros usando macros, pienso que si seria posible pero no se como se podria hacer, agradeceria muchisimo si pudiera ayudarme. Muchas gracias!
Hola Raffaella, esto podría ayudarte: https://excelsignum.com/2019/02/06/actualizar-un-modulo-de-vba-en-varios-archivos-desde-otro-archivo/
Saludos
Excelente aporte
excelente aporte, pero me surge una duda, si tengo el archivo protegido con contraseña, es posible agregar la contraseña dentro del procedimiento para borrar un módulo o una macro, por ejemplo cuando deseo que se elimine un módulo o una macro en determinada fecha…