Saltar al contenido

Mejorando las macros de Excel a través de Visual Basic para aplicaciones

Las listas desplegables cbListCountries y cbListEmployees deben llenarse cuando se carga el formulario por primera vez. Dicho de otra manera, cuando el formulario es inicializado un macro agregará ítems (sin duplicados) a cada control combo-box.

Para lograr este objetivo, haga clic con el botón derecho del ratón en el control de formularios dentro del explorador del proyecto y seleccione View Code :

Mejorando las macros de Excel a través de Visual Basic para aplicaciones
Mejorando las macros de Excel a través de Visual Basic para aplicaciones

A la derecha, introduzca los siguientes bloques de código. El primero, UserForm_Initialize(), es privado a la forma y se activa cuando se carga. Por otro lado, Populate(startCell As String, cbList As comboBox) es el macro personalizado que llena los controles cuando se llama desde el primero:

123456789101112131415161718192021Subfórmula privada de usuario_Iniciar() Poblar "G2", cbListPaíses Poblar "H2", cbListEmpleadosEnd SubSubpoblar(startCell como cadena, cbList como comboBox) Dim itmColección como nueva colección Dim cell como rango en el error Reanudar siguiente con cbList . Borrar Para Cada Celda En El Rango(startCell, Range(startCell).End(xlDown)) Si Len(cell) <> 0 Then Err.Clear itmCollection.Add cell.value, cell.value If Err.Number = 0 Then .AddItem cell.value End If Next cell End With cbList.ListIndex = 0End Sub

vba

Examinemos cada uno de estos procedimientos con más detalle:

  • Las macros se definen dentro de los subbloques, lo que significa subprocedimiento.
  • Dentro de UserForm_Initialize(), el macro Populate se llama dos veces: una para cada control de la caja combo. Este último toma dos argumentos que indican 1) dónde empezar a buscar valores para poblar cada lista, y 2) qué control debe ser llenado en cada caso.
  • Cuando un sub-procedimiento pasa dos o más argumentos, deben ser separados por comas.
  • Dim itmCollection As New Collection declara y crea una colección de artículos que pueden ser manejados como una unidad. Este tipo de objeto es más apropiado que otros para lo que haremos más tarde con los artículos.
  • Un objeto de la gama puede ser una sola celda, una fila, una columna o un bloque más grande. Con la celda Dim como Rango, está definiendo una variable de marcador de posición llamada celda de tipo Rango.
  • On Error Resume Next significa que si se produce un error durante el tiempo de ejecución mientras se accede a los objetos, la macro no se bloqueará. En su lugar, continuará con la siguiente declaración. Puedes leer más sobre la declaración On Error en la referencia en línea de VBA aquí.
  • Dentro del bloque Con, cuando una palabra está precedida por un punto se refiere al objeto al que se está accediendo. Por lo tanto, .Clear y .AddItem son métodos combo-box de cbList. Ten en cuenta que esta variable representa el segundo argumento que se pasa a Populate.
  • El bucle For Each se utiliza para iterar sobre un objeto Range que consiste en todas las celdas entre la especificada por startCell hasta la última ubicación no vacía de la misma columna. Aquí, Range(startCell).End(xlDown) produce el mismo efecto que colocar el cursor sobre startCell manualmente y presionar Ctrl + Shift + la flecha hacia abajo. La palabra clave Next le dice al bucle que proceda con la siguiente celda después de cada iteración.
  • Los artículos se añaden a la colección y los errores se borran sólo si la celda actual no está vacía. En otras palabras, la macro comprobará que su longitud es mayor que cero.
  • Una característica distintiva del objeto de la Colección es que se puede acceder a sus elementos mediante un índice (la posición en la colección) o una clave (un valor único). En itmCollection.Add cell value, cell value, el primer valor de la celda es el elemento real que se está añadiendo, mientras que el segundo representa la clave. Este enfoque nos permite comprobar si hay errores en cada paso y añadir un elemento sólo si el número de error es igual a 0. Esta condición se cumple sólo cuando el elemento actual no existe ya en la colección.
  • Cuando un bloque If abarca dos o más líneas, necesita cerrarse con la correspondiente declaración End If. De lo contrario, podemos omitir esta última.
  • Por último, cbList.ListIndex = 0 indica que el primer elemento de la colección debe ser seleccionado por defecto. Siéntase libre de cambiar este valor a otro si lo desea. Sin embargo, no se seleccionará ningún elemento si el número es mayor que el tamaño de la colección.

Al ejecutar el formulario pulsando F5 desde el editor, notará que France y Steve Buchanan aparecen como los valores por defecto de las listas desplegables. Esos son precisamente los primeros valores de las columnas G y H .