Como Asignar macro con argumentos a un botón de Control de formulario
Uno de los métodos más populares para ejecutar una macro es tener un botón en la parte frontal de la hoja de trabajo. Estos son bastante simples de crear con los controles de formulario básicos que se encuentran en la cinta de desarrollador, lo que los convierte en una opción popular.
Pero, ¿qué pasaría si tuvieras muchos botones y todos hicieran algo similar, salvo algunas variables, argumentos o parámetros diferentes? Una opción es escribir código separado para cada botón, o una segunda opción tal vez una declaración If grande para manejar la lógica de todos los botones. Pero por favor no hagas ninguna de esas cosas, sería una locura.
Para pasar un argumento a una macro solo se requiere la sintaxis correcta al asignar la macro al botón.
El ejemplo
Para demostrar cómo funciona esto, aquí está nuestro escenario de ejemplo. Hay dos cuadros de lista, cada uno de los cuales contiene una lista, con un botón debajo de cada uno. Cada vez que se hace clic en el botón, el recuento de elementos en el cuadro de lista de arriba se muestra en un cuadro de mensaje.
Consideremos cómo podemos lograr esto de la manera más eficiente posible.
Configurando el código VBA
Asumiré que ya sabes cómo crear un botón y asignarle una macro.
Si hubiéramos creado un código separado para cada botón, entonces el código VBA para hacer clic en el botón debajo de lstBox1 sería el siguiente:
Sub lstBoxCount()Dim ws As WorksheetDim lstBoxName As StringDim lstBox As ListBoxSet ws = Sheets("Sheet1")lstBoxName = "lstBox1"Set lstBox = ws.ListBoxes(lstBoxName)MsgBox lstBox.ListCountEnd Sub
Si observa, el nombre de la hoja y el nombre del cuadro de lista están codificados en la macro, por lo tanto, necesitaríamos una macro para cada botón. Ahora imagina que tenemos 30 cuadros de lista y 30 botones… ¡eso requeriría 30 macros! Mala idea.
Aquí es donde los argumentos son útiles. Podemos pasar el nombre de la hoja de trabajo y el nombre del cuadro de lista a la macro como argumentos; al hacer esto, podemos usar una sola pieza de código VBA.
Sub lstBoxCount(wsName As String, lstBoxName As String)Dim ws As WorksheetDim lstBox As ListBoxSet ws = Sheets(wsName)Set lstBox = ws.ListBoxes(lstBoxName)MsgBox lstBox.ListCountEnd Sub
El código anterior se puede utilizar con cualquier ListBox. No hay variables codificadas dentro del código; se pasan al código cuando se llama.
Ejecutar una macro con argumentos
Habiendo creado una macro con argumentos en la sección anterior, surgen algunos problemas nuevos al asignarla a un botón.
- La macro no aparece en la lista de macros disponibles. Aún podemos usar la macro, pero tenemos que saber su nombre.
- Necesitamos conocer la sintaxis correcta para pasar los argumentos a la macro.
Podemos manejar ambos problemas; no es gran cosa.
La sintaxis requerida para llamar a una macro desde el mismo libro es:
'NombreDeMacro "variable1", "variable2"'
Tome nota de dónde están las comillas simples, las comillas dobles, las comas y los espacios. No hay nada que nos ayude a completar esto, aparte de un mensaje de error para burlarse de nosotros cuando nos equivocamos.
Para llamar a nuestra macro lstBoxCount desde arriba, el texto en la ventana Asignar macro sería:
'lstBoxCount "Hoja1", "ListBox1"'
Donde Hoja1 es el nombre de la hoja de trabajo y ListBox1 es el nombre del primer ListBox.
Se podría llamar a la misma macro desde el segundo botón, pero los argumentos serían diferentes. Observe que el nombre del cuadro de lista ha cambiado debajo.
'lstBoxCount "Hoja1", "ListBox2"'
Ahora podemos usar el mismo código VBA sin importar cuántos cuadros de lista haya o en qué hojas de trabajo se encuentren. Simplemente cambiamos los valores en los argumentos.
Pasar números como argumentos
Si pasa un número como argumento, no lo escriba entre comillas dobles.
'NombreDeMacro "textInQuotes", 1000'
Asignar una macro de otro libro de trabajo
Al regresar a la ventana Asignar macro, notará que Excel ha agregado el nombre del libro en el cuadro Nombre de la macro.
'Nombre del libro de trabajo.xlsm'!'lstBoxCount "Hoja1", "lstBox1"'
Al principio esto puede parecer molesto. Pero Excel nos está ayudando aquí, ya que ahora muestra la sintaxis necesaria para llamar a una macro desde otro libro.
'Nombre de la hoja de trabajo.xlsm'!'NombreDeMacro "variable1", "variable2"'
Ejecutar una macro con argumentos basados en un valor de celda
Hasta ahora hemos asumido que conocemos los argumentos al crear los botones. Puede que ese no sea el caso; tal vez el argumento se base en el valor de una celda. Pero eso también está bien; Podemos pasar dinámicamente un valor de celda a la macro en el momento en que se hace clic en el botón asignando una macro usando la siguiente sintaxis.
'NombreDeMacro "variable1", EVALUAR("A1")'
El ejemplo anterior supone que el argumento está contenido en la celda A1. Una vez más, tome nota de dónde están las comillas simples y dobles.
Usando nuestro ejemplo específico. Supongamos que el nombre del cuadro de lista está contenido en la celda B2:
'lstBoxCount "Hoja1", EVALUAR("B2")'
¡Esto también funcionará! Genial, ¿eh?
Resumiendo todo
Con suerte, verá que esto es muy poderoso y poder establecer argumentos basados en el valor de una celda es simplemente asombroso. Ya no necesitas muchos botones. En cambio, un cuadro desplegable y un botón podrían ser suficientes.
Deja una respuesta