UserForms en VBA

Un Formulario de Usuario o UserForm es una interfaz que permite ordenar y mostrar de una forma amigable la información que se requiera según sea la necesidad del usuario. De esta manera se evita que el usuario escriba directamente sobre las hojas de trabajo o bases de datos, protegiendo de esta manera la información a la vez que se facilita la entrada de los datos.

Los UserForms son una excelente opción si tus aplicaciones están programadas en Excel/VBA, ya que pueden adecuarse a las necesidades de los usuarios y ser 100% personalizables.

En este tutorial desarrollaremos una interfaz de usuario sencilla, que genera un mensaje de saludo según la información introducida.

1. Cómo crear un Userform en VBA?

Primero busca en la barra de herramientas en el editor de Visual Basic (VBE) la opción “Insertar” luego selecciona  “UserForm”. Se creará el formulario por defecto en el espacio de trabajo.

En la parte inferior derecha del VBE aparecerá el cuadro de propiedades del formulario, es aquí donde podremos controlar todo el Userform y sus elementos internos.

2. Elementos internos del Userform – Botones, TextBox, ComboBox y otros

Son los elementos que permiten la interacción entre el Userform y usuario. Para añadirlos, una vez que has generado el formulario debes mostrar el cuadro de herramientas a través de la opción "Ver" del VBE.

Para agregar un elemento sólo debes seleccionarlo desde el cuadro de herramientas y arrastrarlo al Userform. Con el mouse podrás ubicarlo y ajustarle el tamaño según necesites; verás más adelante que también puedes hacerlo a través de las propiedades de cada elemento.

A continuación te mostramos una lista de los elementos más utilizados en la creación de UserForms. Todos los elementos sin excepción pueden ser configurados o actualizados vía código de programación.

2.1. Imagen (Image)

Es un campo no modificable por el usuario final, usado normalmente para insertar una imagen como la de un logotipo.

2.2. Etiqueta (Label)

Es un campo no modificable por el usuario final, usado normalmente para indicar o explicar la función de otro elemento dentro del Userform.

2.3. Cuadro de texto (TextBox)

Es un elemento modificable por el usuario final, usado para dar ingreso de datos. Todo valor que se ingrese vía cuadro de texto será reconocido por VBA como String. Si se deseas que sea reconocido como otro tipo (número, fecha u otro) deberás hacer la conversión del tipo de variable. Puedes revisar el tutorial de variables para más información.

2.4. Cuadro Combinado (ComboBox)

Este elemento es también conocido como drop-down. Su función es albergar una lista de opciones para que el usuario escoja sólo una de ellas.

2.5. Casilla (CheckBox)

Es un elemento booleano (toma valores True o False) que puede ser modificado por el usuario final.

2.6. Botón de opción (OptionButton)

Similar al CheckBox, es otro elemento booleano (toma valores True o False) que puede ser modificado por el usuario.

2.7. Botón de comando (CommandButton)

Es un elemento sobre el cual se asignan acciones que se quieren realizar en un programa, como ejecutar la macro, cerrar el Userform, abrir un archivo, entre otras.

3. Propiedades del Userform y de sus elementos

Los Userforms y sus elementos poseen propiedades que pueden ser modificadas directamente a través del cuadro de propiedades en el VBA. Algunas de estas propiedades son comunes a todos los elementos, como las relacionadas a la apariencia (ancho, largo, ubicación); otras propiedades son particulares para cada elemento. A continuación te mostramos una lista de las propiedades según el tipo de elemento.

Propiedad Descripción Aplica a:
(Name) Nombre del elemento. Es usado para identificar el elemento dentro del código VBA. Todos los elementos
Back Color Color de fondo Todos los elementos
Caption Texto de titulo Userform, Label, CheckBox, OptionButton, CommandButton
Enabled Activación Todos los elementos
Font Fuente del texto Userform, Label, TextBox, ComboBox, CheckBox, OptionButton, CommandButton
Height Valor de altura de elemento Todos los elementos
Left Ubicación horizontal Todos los elementos
Picture Imagen Userform, Image, Label, CheckBox, OptionButton, CommandButton
Picture-SizeMode Ajuste de tamaño de imagen Userform, Image, CommandButton*
TextAlign Alineación de texto Label, TextBox, ComboBox, Check Box, OptionButton
Top Ubicación vertical Todos los elementos
Visible Visibilidad Image, Label, TextBox, ComboBox, CheckBox, OptionButton, CommandButton
With Ancho Todos los elementos
Word-Wrap Ajuste de línea de texto Label, TextBox, Check Box, OptionButton, CommandButton

(*) La propiedad equivalente para el CommandButton se llama  Picture Position

4. Scripts en los Userforms

Estas son las instrucciones/acciones que se ejecutan cuando ocurra un evento sobre un elemento del Userform. Estos eventos pueden ser un click, el ingreso de datos en un TextBox, el cambio de selección en un ComboBox, entre otros.

Los script pueden ser interdependientes, es decir pueden ejecutarse en un elemento y tener efectos sobre otros elementos; por ejemplo, podemos programar que un TexBox se ha visible o invisible al activar o desactivar un CheckBox.

Te mostraremos algunos scripts típicos para desarrollar una interfaz que nos muestre un mensaje de saludo a partir de la información que ingresemos.

4.1. ComboBox.

Este tipo de elementos requieren que la lista que ellos despliegan sea previamente llenada, lo cual puede hacerse a través de los valores de una hoja de cálculo o indicando directamente los elementos que debe tomar la lista. Las instrucciones para ello serían:

Estructura With Nombre de ComboBox  
.AddItem elemento
End With

Ejemplo:

With ComboBox1
  .AddItem "Sr."
  .AddItem "Sra."
End With

A menos que se desee lo contrario o por requerimiento del código, es buena práctica colocar la instrucción de llenado del ComboBox en el evento de inicialización (Initialize) del UserForm, para que la información esté previamente cargada a la hora de que el usuario desee modificar el ComboBox. El código luciría como se muestra en el siguiente ejemplo:

Private Sub UserForm_Initialize()

With ComboBox1
.AddItem "Sr."
.AddItem "Sra."
End With

End Sub

El ComboBox de nuestro ejemplo tendrá 2 posibles selecciones: Sr. y Sra.

Para escribir un código de programación sobre un evento del Userform principal, basta con hacer doble click en el Userform y elegir el evento sobre el cual desea escribir. En nuestro caso, seleccionamos el evento “Initialize”. Los eventos pueden variar según el tipo de elemento. En la imagen verás la lista para el elemento Userform.

4.2 Checkbox / Option Button

Como te mencionamos anteriormente, este tipo de elementos toma valores True o False al activarlos o desactivarlos, respectivamente. Esta activación / desactivación la puedes aprovechar para generar efectos en otros parámetros o elementos del Userform.

En nuestro ejemplo, cuando el usuario haga click sobre el CheckBox1 para activarlo, el elemento ComboBox1 se habilitará; cuando el  CheckBox1 tenga el valor False (desactivado) el elemento ComboBox1 se deshabilitará, es decir, el usuario no tendrá acceso a los valores de la lista en el ComBobox1.

Estructura Condicional según el valor del elemento  
Nombre de elemento afectado.Enabled = True o False

Ejemplo:

If CheckBox1 = True Then
 ComboBox1.Enabled = True
Else
 ComboBox1.Enabled = False
 ComboBox1 = ""
End If

4.3 CommandButton

Normalmente sobre estos elementos es donde se asignan las rutinas más complejas. En este ejemplo asignaremos las instrucciones de generar le mensaje de saludo, que estará compuesto por la selección realizada en el elemento ComboBox1 y la palabra escrita en el elemento TextBox1.

Ejemplo:

MsgBox "Hola " & ComboBox1 & " " & TextBox1 & "." & vbCrLf & "Feliz Día!"

5. Mostrar y Ocultar Userforms

El llamado de un Userform se hace a través de la instrucción “Show” (mostrar).

Estructura NombreDeUserform.Show

Ejemplo:

UserForm1.Show

Para cerrar el Userform utilizaremos la instrucción “Unload”.

Estructura Unload NombreDeUserform

Ejemplo:

Unload UserForm1

Normalmente esta instrucción la colocamos en un CommandButton que ejecute la “Salida” del programa

6. Resultado

Una vez escritas todas las instrucciones que has aprendido en este tutorial, el resultado que obtendrás será un Userform como el siguiente, el cual muestra un mensaje de bienvenida luego de presionar el botón "Run!".

Como puedes ver, la generación de interfaz de usuario es una actividad relativamente sencilla. Su complejidad variará dependiendo del funcionamiento de tu programa y de la interacción entre los elementos.

No tenemos dudas de que con lo aprendido en este tutorial podrás armar tu propia interfaz de usuario.

 

 

¿Quieres saber más? Contáctanos

Diccionarios (Dictionaries) en VBA

Al igual que las Colecciones, los diccionarios son un tipo de arreglo que nos permite almacenar todo tipo de variables como números, textos, objetos y combinación de ellas. En este tutorial verás por qué consideramos esta estructura muy útil.

Su forma de trabajo hace que el Dictionary sea muy similar al Collection; sin embargo tienen algunas diferencias en sus estructuras. Aquí te mostramos un resumen con las características de los Diccionarios, Colecciones y Arreglos:

  Arreglos Colecciones Diccionarios
Facilidad de programación X    
Ordenamiento de elementos internos X X  
Edición de elementos internos X   X
Eliminación de elementos intermedios   X X
Buen desempeño en grandes bases de datos   X X
Manejo de información a través de claves (Keys)   X X

En este tutorial te explicaremos las formas más generales de trabajar con los diccionarios para la cantidad de variables que tú decidas. Existen unos pasos que podríamos omitir cuando tu diccionario almacene sólo una variable, pero nuestra intención es enseñarte todo!.

1. Declaración de diccionarios

Microsoft nos provee dos modalidades para la declaración: Early Binding y Late Binding.

La modalidad Early Binding necesita que actives la referencia “Microsoft Scripting Runtime”, lo cual podría no ser del agrado para algunos usuarios finales de nuestras herramientas, debido a que muchos no estarán familiarizados con VBA.

El Late Binding resulta ventajoso en el sentido de que la declaración la harás directamente en el código, sin labores extras para el usuario final, por ello trabajaremos bajo esta modalidad. La única desventaja de esta opción es que perderás la ayuda de escritura que el código muestra en los procedimientos disponibles, sin embargo con la explicación que te daremos, esa ayuda no sería necesaria 🙂

En este tutorial iremos desarrollando un ejemplo de creación de un diccionario que almacene la información de la nómina de una empresa.

 

1.2. Declaración del diccionario

La declaración de nuestro diccionario se hace bajo la siguiente estructura:

Set NombreDeDiccionario = CreateObject("Scripting.Dictionary")

Ejemplo de declaración de un diccionario en VBA:

Set Nomina = CreateObject("Scripting.Dictionary")

 

 

 

2. Añadir elementos al Diccionario

En muchas ocasiones necesitaremos añadir elementos al diccionario a partir de la información de una hoja Excel. Al tomar los datos de la hoja de cálculo, debemos definir cuál columna representará nuestro identificador único o Key y cuáles serán las variables agregadas o Ítems que pertenecerán a dicho Key.

Debemos recordar que el Key es un identificador único, así que en este ejemplo el nombre de la persona no sería un buen identificador, ya que en algún momento podría repetirse (en nuestra tabla existen dos personas distintas llamadas Ana). Te sugerimos usar el número de identificación (Columna A en este caso) como Key.

Debemos entonces hacer un recorrido por todas las filas llenas, para lo cual recurrimos a un Loop.

Para evitar errores en nuestra rutina, es conveniente revisar si el Key ha sido previamente utilizado en el diccionario, es decir, debemos verificar si la persona fue previamente registrada. Esto lo podremos hacer siguiendo la estructura:

Dim DeclaraciónVariables As Nombre de módulo de clase
Abrir Loop que barre la columna
Asigna Key  
If (Revisa si el Key ya esté utilizado) Then
  Acción si el Key fue utilizado
Else  (Acción si el Key está libre)  
  Set ObjetoDeClase = New NombreDeModuloDeClase           NombreDeDiccionario.Add Key, ObjetoDeClase(Ítems) o arreglo de items  
End If
ObjetoDeClase.NombreDeItem = CeldaQueContieneEseItem.Value (subItem) 
Cerrar el Loop

2.1. Ejemplo para añadir elementos al Diccionario sin usar módulo de clases

En lugar de un módulo de clases, esta modalidad hace uso de un Array auxiliar para almacenar la información de los ítems. Bajo este concepto, cuando queramos acceder a los elementos del Dictionary debemos hacerlo a través de la posición que cada ítem ocupa en el mismo. En este ejemplo, la primera posición la ocupa el ítem “Person”, la segunda el ítem “Age” y la tercera el elemento “Gen”.

'Declaración de diccionario
Dim key As Variant, listItem() As Variant
Set WorkerList = CreateObject("Scripting.Dictionary")
'-----------------------------------------------------------------------------
'--- Añadir elementos al Diccionario -
i = 2
Do While IsEmpty(ws.Cells(i, 1)) = False '--->Loop through "A" Column
 IDPerson = ws.Cells(i, 1).Value        '--->Key
 '---> Revisa si el key fue añadido al diccionario
 If WorkerList.Exists(IDPerson) = True Then
  MsgBox ("Key " & IDPerson & "is already used")
 Else
 '---> Asigna Items
    ReDim listItem(i - 1, 3)
    listItem(i - 1, 1) = ws.Cells(i, 2).Value '-->Person
    listItem(i - 1, 2) = ws.Cells(i, 3).Value '---> Age
    listItem(i - 1, 3) = ws.Cells(i, 4).Value '---> Gen
    WorkerList.Add IDPerson, listItem
 End If
 i = i + 1
Loop

2.2. Ejemplo para añadir elementos al diccionario con módulo de clases

2.2.1. Creación de módulo de clases

Aunque este paso no es obligatorio, es altamente recomendado para poder tener un mejor tratamiento y manejo de la información en el diccionario. Te recomendamos crear un módulo de clases donde almacenaremos todas las variables que estarán en el diccionario. Para ello haz clic sobre el menú “Insertar” de VBE y selecciona la opción “Módulo de clase”.

Si decides no usar el módulo de clases, tendrás que tener ciertas consideraciones (que aprenderás más adelante) a la hora de acceder al diccionario.

Es buena práctica renombrar el módulo de clases para relacionarlo con el diccionario que crearemos. Para ello debes dirigirte al nombre de la clase y escribir el nombre que desees.  Dado que haremos un diccionario de nómina, le colocaremos “clsNom” (las tres primeras letras para diferenciar nemotécnicamente que es un módulo de clases).

Dentro del módulo de clases declararemos los ítems o variables (según su tipo) con las que trabajaremos en nuestro diccionario, bajo la siguiente estructura:

Option Explicit
Public NombreDeVariable As TipodeVariable

Ejemplo de creación de módulo de clase para un diccionario VBA:

Option Explicit
Public Name As String   'Worker’s name
Public Age As Long      'Worker’s age
Public Gen As String    'Worker’s genre

2.2.2. Añadir elementos al diccionario VBA

Para implementar esta opción, deberás haber creado previamente el módulo de clases. La ventaja de este método es que posteriormente podrás acceder a cada elemento del diccionario solo con conocer su nombre, sin necesidad de conocer su posición.

La información que continua en el tutorial es basada en la estructura del módulo de clases, sin embargo, si tienes dudas con la otra modalidad, no dejes de contactarnos.

Dim key As Variant
Dim oNom As clsNom
'-----------------------------------------------------------------------------
'Declaración de diccionario
Set WorkerList = CreateObject("Scripting.Dictionary")
'-----------------------------------------------------------------------------
'--- Añadir elementos al Diccionario -
i = 2
Do While IsEmpty(ws.Cells(i, 1)) = False '--->Loop through "A" Column
 IDPerson = ws.Cells(i, 1).Value        '--->Key
'---> Revisa si el key fue añadido al diccionario
 If WorkerList.Exists(IDPerson) = True Then
  MsgBox ("Key " & IDPerson & "is already used")
 Else '---> Crea el objeto de clase (ClsNom)
  Set oNom = New clsNom
  WorkerList.Add IDPerson, oNom
 End If
 '---> Asigna Items
 oNom.Name = ws.Cells(i, 2).Value
 oNom.Age = ws.Cells(i, 3).Value
 oNom.Gen = ws.Cells(i, 4).Value
 i = i + 1
Loop

3. Acceder a elementos del diccionario

Al igual que las Colecciones, los diccionarios tienen un excelente desempeño para manejar grandes cantidades de datos que se relacionan con el identificador único (Key). Así, cuando necesitamos acceder a alguna información para luego actualizarla, eliminarla o sencillamente visualizarla, las instrucciones de VBA hacen una búsqueda en el diccionario por Key  o palabra clave.

Para acceder a los elementos del diccionario debemos seguir la siguiente estructura:

Abrir Loop que busca por cada key del diccionario  
With
NombreDeDiccionario(key)   
Acciones  
End With
Cerrar el Loop

Ejemplo para acceder a elementos de un diccionario VBA:

'--- Acceder al diccionario ---
For Each key In WorkerList.Keys '---> Busca en cada elemento del diccionario
With Nomina(key)            '---> Con el Key de objeto de clase: Acciones
  Debug.Print key, .Name, .Age, .Gen'---> Acción: Imprimir Key e ítems
 End With
Next key

4. Modificar el Diccionario

Sabiendo ya como acceder a los elementos del diccionario, para la modificación sólo restaría encontrar la entrada que deseamos modificar y hacer las respectivas acciones. Veamos ejemplos con las dos modificaciones más comunes: Actualización y Eliminación de entradas.

4.1. Actualizar entradas del diccionario

Identificar el key que deseamos modificar
Abrir Loop que busca por cada key del diccionario
Revisar si el key de loop es el que deseamos modificar  
With NombreDeDiccionario(key)   
Acciones sobre el ítem que seleccionamos en el loop  
End With
Cerrar el Loop

Ejemplo para actualizar datos en un diccionario VBA:

Dim ws As Worksheet
Dim i As Long
Dim oNom As clsNom
Dim key As Variant
 
Set ws = DictionaryWS
'-----------------------------------------------------------------------------
'Declaración de diccionario
Set WorkerList = CreateObject("Scripting.Dictionary")
'-----------------------------------------------------------------------------
'--- Añadir elementos al Diccionario -
i = 2
Do While IsEmpty(ws.Cells(i, 1)) = False '--->Recorrido por toda la columna A
 IDPerson = ws.Cells(i, 1).Value        '--->Key
'---> Revisa si el key fue añadido al diccionario
 If WorkerList.Exists(IDPerson) = True Then
  MsgBox ("Key " & IDPerson & "is already used")
 Else                                    '---> Crea Objeto de clase (ClsNom)
  Set oNom = New clsNom
  WorkerList.Add IDPerson, oNom
 End If
' ---> Asigna valores a los Items
 oNom.Name = ws.Cells(i, 2).Value
 oNom.Age = ws.Cells(i, 3).Value
 oNom.Gen = ws.Cells(i, 4).Value
 i = i + 1
Loop
'-----------------------------------------------------------------------------
'--- Actualización de diccionario ---
Query = "ID 09"              '---> Key a modificar
For Each key In WorkerList.Keys
    If key = Query Then     '---> Modifica si ek key es Query
      '---> Modificación de la entrada <---
      With WorkerList(key)
       .Age = .Age + 1 '---> Actualiza la Edad
      End With
    End If
Next key

Si deseamos limpiar o borrar la información de un ítem, debemos asignarle la el valor “Clear” a la entrada. Aquí te mostramos el ejemplo con el elemento “Age” (edad):

.Age = Clear    '---> Actualiza la Edad

4.2. Borrar Entradas del diccionario

Cuando necesitemos eliminar la información de una entrada del diccionario (por ejemplo, cuando la persona deje de prestar servicio en la empresa),  sería una acción similar a borrar una fila de la hoja de Excel:

La estructura es:

Identificar el key que deseamos eliminar 
NombreDeDiccionario.Remove key 

Ejemplo para eliminar entradas de un diccionario VBA:

'--- Borrar key & Items seleccionado ---
Query = "ID 09"              '---> Key a eliminar
For Each key In WorkerList.Keys
    If key = Query Then     '---> Elimina si el key es Query
       WorkerList.Remove key
    End If
Next key

Ahora bien, si lo que deseas es limpiar toda la información del diccionario, puedes utilizar la siguiente instrucción:

NombreDeDiccionario.RemoveAll

Ejemplo para limpiar información de un diccionario VBA:

'--- Borrar todo el diccionario --- 
WorkerList.RemoveAll

Quieres saber mas? Contáctanos...

 

Colecciones (Collections) en VBA

Las colecciones (Collections) son grupos de variables almacenadas en un solo lugar. Aunque las colecciones pueden confundirse con los Arrays (consulta nuestro tutorial de Arreglos para más detalles), ofrecen características únicas que facilitan el manejo de grandes cantidades de datos. Este tutorial te ayudará a identificar cuándo es más adecuado usar un arreglo o una colección.

La principal ventaja de las colecciones frente a los arrays es la flexibilidad en el manejo de datos, como el redimensionamiento dinámico. Por ejemplo, si tienes una colección de cuadros de colores y deseas eliminar uno o agregar otro, las colecciones hacen este proceso más sencillo. Sin embargo, a diferencia de los arrays, no puedes modificar directamente un valor dentro de una colección: solo es posible añadir o eliminar elementos.

Beneficios clave de las colecciones:

  • Redimensionamiento dinámico sin esfuerzo adicional.
  • Manejo eficiente de datos con identificadores únicos (keys), evitando duplicados.
  • Ideal para agrupar elementos de manera estructurada.

A continuación, exploraremos cómo trabajar con colecciones en VBA.


1. Declaración de una Colección

La declaración de una colección en VBA es similar a declarar una variable. Requiere definirla con Dim y luego inicializarla con Set.

Sintaxis:

Dim NombreColeccion As Collection
Set NombreColeccion = New Collection

Ejemplo:

Dim Square As Collection
Set Square = New Collection

2. Añadir Elementos a una Colección

Para agregar elementos a una colección, usa el método .Add. Cada elemento se añade con un índice consecutivo, comenzando desde 1. Opcionalmente, puedes asignar un identificador único (Key) al elemento para facilitar su búsqueda.

Ejemplo básico:

Square.Add "Black"         'Índice 1
Square.Add "Grey", "Favorite" 'Índice 2 con Key "Favorite"
Square.Add "Green"         'Índice 3

Para añadir un elemento antes de un índice o una Key específica:

Square.Add "Red1", before:=2      'Antes del índice 2
Square.Add "Red1", before:="Favorite" 'Antes del Key "Favorite"

También puedes utilizar bucles para añadir múltiples elementos de forma automatizada:

Dim i As Long
Dim ws As Worksheet

Set ws = Sheet1 'Nombre de la hoja
Set Square = New Collection

i = 2
Do While Not IsEmpty(ws.Cells(i, 1))
    Square.Add ws.Cells(i, 2)
    i = i + 1
Loop

3. Acceder a los Elementos de una Colección

Para obtener el valor de un elemento en la colección, usa su índice o Key:

Ejemplo con índice:

Debug.Print Square(2)

Ejemplo con Key:

Debug.Print Square("Favorite")

4. Eliminar Elementos de una Colección

Para eliminar un elemento, emplea el método .Remove con el índice o la Key del elemento que deseas borrar.

Ejemplo:

Square.Remove 3 'Elimina el elemento en el índice 3

Puedes eliminar varios elementos utilizando un bucle si es necesario.


5. Recorrer una Colección

Existen varias maneras de iterar sobre los elementos de una colección.

5.1 Usando For-Next o Do-Loop

Este método se basa en la propiedad .Count, que devuelve el número de elementos en la colección.

Ejemplo con For-Next:

For i = 1 To Square.Count
    Debug.Print Square(i)
Next

Ejemplo con Do-Loop:

i = 1
Do While i <= Square.Count
    Debug.Print Square(i)
    i = i + 1
Loop

5.2 Usando For Each

Este enfoque itera directamente sobre cada elemento sin necesidad de un contador, lo que suele ser más eficiente.

Ejemplo:

For Each Elem In Square
    Debug.Print Elem
Next

Conclusión

Las colecciones son una herramienta poderosa para manejar datos dinámicos en VBA, especialmente cuando necesitas agrupar elementos con identificadores únicos. Practica estos conceptos para aprovechar al máximo su flexibilidad y eficiencia.

¿Tienes preguntas o necesitas ayuda con un ejemplo más específico? Contáctanos para más información.

Arreglos (Arrays) en VBA

Un arreglo (Array) es un grupo de ítems “empaquetados” en una única variable; en VBA y en muchos otros lenguajes de programación encontraremos los Arrays como estructuras de uso común.

Definir un Array en VBA

Los meses del año son un ejemplo ilustrativo. Si necesitáramos guardar la información de cada periodo sin usar los Arrays deberíamos recurrir a doce (12) variables, una por mes. Para facilitar el manejo, podríamos generar un arreglo con 12 argumentos, uno por cada mes del año. Tenemos varias formas para declarar estos arreglos:

Opción 1 Dim Mes(1 To 12) As Integer
Opción 2 Dim Mes(1,12)
Opción 3 Dim Mes(11)
Opción 4 Option Base 1
Dim Mes(12)

Las dos primeras opciones son las más intuitivas: la primera genera un arreglo de 12 elementos, desde el elemento 1 hasta el 12. La segunda opción tiene una estructura matricial, por ello puede que nos resulte familiar. Puedes revisar el tutorial de Loops en VBA, así como los Tips y atajos en VBA de Seleccionar una celda o Encontrar última celda ocupada.

Los arreglos en VBA comparten en cierta forma la sintaxis con otros lenguajes en donde se maneja por defecto el cero como numero base, por lo tanto el arreglo como se describe en la opción 3, va desde el número 0 hasta el 11, es decir, 12 elementos. Sin embargo, para hacer la actividad más intuitiva, VBA nos permite cambiar la base por defecto a través de la declaración Option Base 1, así como lo vemos en la opción 4. Es recomendable que la declaración Option Base 1 se coloque al inicio de cada módulo.

Dimensionamiento del Arrays

A diferencia de las variables cuya declaración era opcional (puedes revisar un poco más en el tutorial de variables en VBA), la dimensión del arreglo debe ser previamente declarada antes de comenzar a introducir elementos en él.

Los ejemplos hasta ahora mostrados son unidimensionales, para mayor facilidad de comprensión, sin embargo es importante tener en cuenta que los Arrays pueden tener hasta más de 60 dimensiones.

Hagamos un ejemplo tridimensional: si en tu macro deseas almacenar la información mensual de las horas trabajadas por cada trabajador respecto a su turno de rotación, una opción inteligente sería mediante la declaración de un arreglo. Para dimensionar el arreglo debemos conocer los máximos valores que cada variable podría tomar. Para los meses su máximo valor será de 12; el número total de empleados depende de la plantilla de la empresa, en este caso supondremos un valor de 10. Partiendo de que los turnos de trabajo son de 8 horas por día, el número máximo de turnos será de 3. La declaración debería lucir como esta:

Ejemplo:

Option Base 1
Dim Horas (12, 10, 3)

Considerando que la base es 1, entonces 12 representa el número de meses, 10 el número de trabajadores y 3 el número de turnos.

Por lo tanto, para guardar la información se deberán llenar los espacios correspondientes a cada mes, empleado y turno. Algunos ejemplos serian:

Ejemplo a): Si la persona llamada “Trabajador #3” en el mes de Julio estuvo en el 2do turno y trabajó 125 horas, la asignación de valores en el Array sería:

Horas(7, “Trabajador#3”, 2)= 125

Ejemplo b): Si la persona llamada “Trabajador #8” en el mes de Abril estuvo en el 1er turno y trabajó 150 horas, la asignación de valores en el Array sería:

Horas(4, “Trabajador#8”, 1)= 150

Ejemplo c): Si la persona llamada “Trabajador #1” en el mes de Diciembre estuvo en el 3er turno y trabajó 200 horas, la asignación de valores en el Array sería:

Horas(12, “Trabajador#1”, 3)= 200

Extraer o leer información del Array

Afortunadamente para nosotros, VBA es muy intuitivo, así que si deseamos escribir en una celda o una variable el valor de determinado elemento de un arreglo, solo debes hacer referencia a la posición del arreglo, tal y como se muestra a continuación en un arreglo tridimensional:

Ejemplo en una celda:

Range("A2") = Horas(7, “Trabajador#3”, 2)

Ejemplo en una variable:

ResultadoHP= Horas(7, “Trabajador#3”, 2)

Bajo este enfoque, debes estar seguro de que en el Array existen los elementos que estas consultando para escribir en la celda, ya que en caso contrario VBA te mostrara un error de dimensionamiento. Para evitar ese tipo de errores, puedes emplear las funciones Lbound y Ubound, las cuales te permiten conocer los límites inferior y superior de tu arreglo, respectivamente.

Dimensionamiento dinámico del Array

Un uso avanzado de los arreglos refiere al dimensionamiento dinámico. Si retomamos el ejemplo anterior, el número de empleados podría cambiar respecto del tiempo.

Para lidiar con este caso, debemos inicializar el arreglo en vacío, siendo estrictamente necesario asignarle las dimensiones antes de almacenar alguna información en el arreglo mediante el comando de redimensionamiento Redim, tal y como se describe a continuación:

Option Base 1
Dim Horas() As Integer
Redim Horas(12, 10, 3)

Los valores para redimensionamiento pueden ser una constante como en el caso anterior, o también pueden ser variables previamente definidas como lo vemos en el siguiente ejemplo:

Option Base 1
Dim Horas() As Integer
Ntrab=10
Redim Horas(12, Ntrab, 3)

El redimensionamiento puede expandir o reducir el tamaño del arreglo, sin embargo, debemos tener en cuenta que el comando Redim borra toda la información previamente almacenada en el arreglo. Si deseamos expandir el arreglo y preservar la información contenida en él, debemos usar la instrucción Redim Preserve. En el ejemplo vemos los “Espacios vacíos” añadidos al arreglo, representados por los elementos que tienen el fondo verde.

Un código de redimensionamiento de número de trabajadores en el ejemplo ilustrado seria así:

Option Base 1
Dim Horas(12, 10, 3) As Integer
Ntrab=12
ReDim Preserve Horas(12, Ntrab, 3)

No debemos olvidar que en el redimensionamiento por reducción perderemos la información de los elementos que quedan “Excluidos” del Array. Por ejemplo, si pasamos del arreglo original de 3x3 a uno de 2x2 , perderíamos la información de los elementos que están en el fondo blanco.

Al igual que en el anterior, si deseamos preservar la información de los elementos del fondo azul, debemos utilizar la instrucción ReDim Preserve.

Quieres saber más? Contáctanos...

Referenciar hojas de cálculo (Worksheets)

Cuando desarrollamos códigos en VBA, en muchas ocasiones necesitamos referenciar distintas hojas (worksheets) de un mismo libro (workbook) o de un libro distinto al que contiene las macros para realizar operaciones entre ellas. A continuación te mostramos distintos métodos que podemos usar para hacer dichas referencias. Cada uno de estos métodos puede ser más o menos útil dependiendo de la naturaleza del desarrollo.

Referenciar hojas por su nombre visible

La referencia de las hojas por su nombre visible es muy usada, ya que a todos los que estamos acostumbrados al ambiente Excel nos resulta muy familiar. La debilidad de este método es que el nombre visible de la hoja debe permanecer inalterable para que no se genere un error en tu macro o código VBA.

Suponiendo que queremos referenciar una hoja para su activación, la secuencia de comandos para hacerlo es:

Sheets(“Nombre de pestaña”).Activate

Ejemplo:

Sheets(“Hoja 1”).Activate

Referenciar hojas por su índice o lugar en el libro

Este método aplica cuando se busca referenciar la hoja según el orden de la pestaña que ocupe en el libro de Excel. Así, la primera pestaña tendrá un índice de 1, la segunda un índice de 2 y así sucesivamente. Con este método podrás cambiar el nombre visible de la hoja sin ningún problema, pero el orden o índice de las pestaña u hoja referenciada debe ser siempre el mismo para que el código VBA haga lo que necesitamos.

Siguiendo el mismo ejemplo de activar una determinada hoja, la secuencia de comandos para hacerlo utilizando índices es:

Sheets(“Índice de  la pestaña”).Select

Ejemplo:

Sheets(3).Select

Nótese que en este caso utilizamos la opción .Select, en lugar de .Activate para activar la hoja, pero ambas opciones generan el efecto deseado.

Referenciar hojas por su nombre interno o nombre de código

El nombre visible de las pestañas en Excel no es necesariamente el mismo nombre interno o de código con el que Excel se refiere a las hojas  de trabajo. Para ver y modificar este nombre de código es necesario hacerlo desde el editor de VBA. Como ya te puedes imaginar, es más difícil que usuarios sin conocimientos de VBA tengan acceso a este nombre para modificaarlo, por lo que referencias las hojas de trabajo bajo este método ofrece mayor seguridad y estabilidad del código de nuestra macro, independientemente de si se modifica el nombre visible de la pestaña o su orden en el libro. Por esta razón es nuestra SmartCode Recomendation.

La secuencia de comandos para activar una hoja usando su nombre de código es:

Nombre Interno de la hoja.Activate

Ejemplo:

Hoja1.Activate

Quieres saber más? Contáctanos...

Selección de Rangos

La selección de Rangos o Select Range  es una actividad muy usada en la programación en VBA. Existen varios métodos muy similares entre sí para la selección de rangos de celdas, te presentaremos los más comunes.

Selección de rangos por referencias

En Excel estamos acostumbrados a referirnos a una celda según aparece por defecto en una hoja de cálculo, es decir, según la letra de la columna y el número de la fila. Si deseamos utilizar esta forma, debemos referirnos al rango con su identificación de columnas y filas tal y como aparecen en la hoja de cálculo separando con dos puntos “:” las celdas de inicio y fin del rango. Aunque no es obligatorio, es buena práctica hacer la referencia a la hoja donde se encuentra el rango que se desea seleccionar. La secuencia de comandos para hacerlo es:

Referencia a la hoja.Range(“Celda inicio rango:Celda fin rango”).Select

Ejemplo:

Sheets(“Hoja 2”).Range(“A2:B3”).Select

Selección de rangos en forma matricial

Aunque es similar a la selección de celdas, esta forma es más versátil porque te permitirá moverte entre filas o columnas fácilmente a través de Loops, por ello es nuestra SmartCode Recomendation. Te podrás referir a ella bajo la siguiente estructura:

Referencia a la hoja.Range(Celda inicio rango,Celda fin rango).Select

Donde la referencia a las celdas se debe hacer en forma matricial: Sheets(índice de hoja).Cells(Fila,Columna)

Ejemplo:

Sheets(2).Range(Sheets(3).Cells(2,1),Sheets(3).Cells(3,2)).Select

Quieres saber más? Contáctanos...

Seleccionar una celda de una hoja Excel

En VBA (Visual Basic for Applications), seleccionar celdas en Excel es una de las operaciones más comunes. Ya sea que quieras seleccionar una celda específica, un rango de celdas o moverte entre celdas en un bucle (loop), entender cómo referenciar celdas en VBA es fundamental. A continuación, te mostramos cómo hacerlo de manera eficiente y optimizada para tus macros en Excel.

1. Selección de celdas por referencia directa

La forma más básica de seleccionar una celda en VBA es referirse a su dirección directamente, como si estuvieras trabajando en Excel. Por ejemplo, si quieres seleccionar la celda "E2", usarías el siguiente código:

Range("E2").Select

Este método es ideal para selecciones simples, pero si necesitas manejar celdas dinámicas o realizar selecciones más complejas, te recomendamos utilizar métodos más avanzados.

2. Selección de celdas en forma matricial

Si necesitas seleccionar celdas de manera más flexible o realizar operaciones sobre múltiples celdas, puedes usar la forma matricial. Esto es especialmente útil cuando trabajas con bucles o estructuras más dinámicas. En este caso, puedes especificar la fila y la columna de la celda que deseas seleccionar.

Para hacer esto, puedes usar la función Cells en combinación con la referencia a la hoja de cálculo. Esto es útil cuando las filas y columnas son variables y no deseas hacer una referencia fija como en el ejemplo anterior.

Sheets("Nombre de la hoja").Cells(Fila, Columna).Select

Por ejemplo, si deseas seleccionar la celda en la fila 2 y columna 5 (que corresponde a la celda E2), el código sería:

Sheets("Hoja 1").Cells(2, 5).Select

Este enfoque es útil cuando trabajas con rangos variables o en casos en los que la celda de destino puede cambiar dependiendo de ciertas condiciones en tu código VBA.

3. Uso de bucles (Loops) para seleccionar celdas de forma dinámica

Cuando necesitas seleccionar múltiples celdas de forma dinámica, los bucles (loops) son extremadamente útiles. Puedes recorrer filas y columnas usando bucles For o For Each, lo que te permitirá realizar acciones sobre cada celda sin tener que referenciar manualmente cada una.

Por ejemplo, si quieres seleccionar todas las celdas en la columna "A" hasta la fila 10, puedes usar un bucle como este:

For i = 1 To 10
    Sheets("Hoja 1").Cells(i, 1).Select
Next i

Este código seleccionará cada celda en la columna A (desde A1 hasta A10) una por una. Puedes modificarlo fácilmente para recorrer otras columnas o rangos de celdas.

El uso de loops permite automatizar tareas repetitivas de forma eficiente, lo que es una ventaja en la programación de macros en Excel.

4. Consejos adicionales para seleccionar celdas en VBA

Algunos consejos adicionales para trabajar con celdas en VBA:

  • Evita el uso excesivo de .Select: Si bien es útil en algunos casos, es mejor evitar el uso excesivo de la función .Select para optimizar el rendimiento de tus macros.
  • Especifica siempre la hoja de trabajo: Al trabajar con varias hojas, siempre es recomendable especificar la hoja de trabajo para evitar confusión o errores en la selección de celdas.
  • Usa la propiedad .Activate con precaución: Si bien .Activate puede ser útil, puede afectar la visibilidad de las celdas seleccionadas. Utilízala solo cuando sea necesario.

Estos consejos pueden ayudarte a hacer tu código más eficiente y menos propenso a errores. Si quieres aprender más sobre la programación en VBA o necesitas ayuda con otros temas de Excel, consulta nuestros tutoriales o contáctanos para obtener asistencia personalizada.

 

Encontrar la última celda ocupada en una fila o columna de la hoja Excel

Una de las tareas más comunes al trabajar con hojas de cálculo en Excel y VBA es determinar la última celda ocupada en una fila o columna. Esto es útil cuando necesitas escribir datos de manera eficiente, ya que al identificar la última celda con datos, puedes desplazarte fácilmente a la primera celda vacía para ingresar nuevos valores. Este tutorial te ayudará a encontrar la última celda ocupada en Excel utilizando VBA, optimizando tu flujo de trabajo.

Figura 1. Última celda ocupada.

Cómo Encontrar la Última Celda Ocupada con un Loop en VBA

Una opción para encontrar la última celda ocupada es utilizando un loop en VBA. Aunque no es la más eficiente en términos de rendimiento, este método te permite recorrer todas las celdas de un rango (ya sea una columna o fila) y verificar si están vacías. A continuación te mostramos un ejemplo de cómo escribir en la primera celda vacía tras identificar la última fila ocupada:

Sub getLastRow()
i = 1
 Do
     If IsEmpty(Cells(i, 1)) = True Then Exit Do
     i = i + 1
 Loop
lastRow = i - 1
Cells(lastRow + 1, 1) = "Primera celda disponible" 
End Sub

Este código recorre la columna A y encuentra la última fila ocupada. Luego, se escribe en la primera celda disponible justo después de la última fila con datos.

También puedes adaptar este método para encontrar la última columna ocupada en una fila específica. A continuación te mostramos cómo hacerlo:

Sub getLastColumn()
 j = 1
 Do
     If IsEmpty(Cells(1, j)) = True Then Exit Do
     j = j + 1
Loop 
lastColumn=j - 1
Cells(1, lastColumn + 1) = "Primera celda disponible" 
End Sub

Método Rápido: Encontrar la Última Celda Ocupada sin Loop

Si prefieres un enfoque más rápido y eficiente en términos de rendimiento, te recomendamos usar el método descrito a continuación. Este método es ideal para encontrar la última celda ocupada en una columna específica o en una fila específica sin necesidad de recorrer todas las celdas con un loop. Aquí te mostramos cómo:

Para encontrar la última fila ocupada en una columna, puedes usar el siguiente código:

Variable = celda(Rows.Count, “Referencia de Columna”).End(xlUp).Row

Este código buscará la última fila ocupada en la columna indicada. A continuación, un ejemplo de cómo implementarlo:

Sub getLastRow()
lastRow = Cells(Rows.Count, "A").End(xlUp).Row
Cells(lastRow + 1, 1) = "Primera celda disponible"
End Sub

De manera similar, si necesitas encontrar la última columna ocupada en una fila específica, puedes usar el siguiente código:

Variable = Cells(Índice de fila, Columns.Count).End(xlToLeft).Column

Este comando devuelve el índice de la última columna ocupada en la fila indicada. Aquí tienes un ejemplo:

Sub getLastColumn()
lastColumn = Cells(1, Columns.Count).End(xlToLeft).Column
Cells(1, lastColumn + 1) = "Primera celda disponible"
End Sub

Este método es ideal para optimizar tu código VBA en Excel y mejorar el rendimiento, especialmente cuando trabajas con hojas de cálculo grandes.

Otros Métodos para Encontrar la Última Celda Ocupada

Existen varios métodos para encontrar la última celda ocupada en Excel utilizando VBA. Además de los métodos mencionados anteriormente, aquí te presentamos dos enfoques adicionales que pueden ser útiles según el contexto:

Uso de UsedRange

El objeto UsedRange te permite obtener el rango de celdas en uso, lo cual es útil cuando necesitas determinar rápidamente el área que contiene datos sin tener que recorrer todas las celdas. Aquí te mostramos cómo encontrar la última fila y columna ocupada:

Sub getLastRowUsedRange()
    Dim lastRow As Long
    lastRow = ActiveSheet.UsedRange.Rows.Count
    MsgBox "La última fila ocupada es: " & lastRow
End Sub
Sub getLastColumnUsedRange()
    Dim lastColumn As Long
    lastColumn = ActiveSheet.UsedRange.Columns.Count
    MsgBox "La última columna ocupada es: " & lastColumn
End Sub

Uso de Find

El método Find es una opción muy rápida para encontrar la última celda ocupada en una fila o columna. Utiliza esta técnica si prefieres una búsqueda precisa y eficiente. A continuación te mostramos un ejemplo para encontrar la última fila ocupada:

Sub getLastRowFind()
    Dim lastRow As Long
    On Error Resume Next
    lastRow = Cells.Find(What:="*", After:=[A1], SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
    On Error GoTo 0
    MsgBox "La última fila ocupada es: " & lastRow
End Sub

De manera similar, puedes usar Find para encontrar la última columna ocupada:

Sub getLastColumnFind()
    Dim lastColumn As Long
    On Error Resume Next
    lastColumn = Cells.Find(What:="*", After:=[A1], SearchOrder:=xlByColumns, SearchDirection:=xlPrevious).Column
    On Error GoTo 0
    MsgBox "La última columna ocupada es: " & lastColumn
End Sub

¿Quieres saber más sobre cómo mejorar tu productividad en Excel con VBA? ¡Contáctanos!

Bucles en VBA: Optimiza tu Programación

Este tutorial es esencial para comprender cómo los bucles en VBA pueden simplificar tus tareas en Excel. Los lazos o loops son fundamentales en la programación, y entender su funcionamiento te permitirá crear programas más eficientes.

¿Qué es un bucle en programación?

Un loop es la repetición cíclica de una actividad, limitada a un número finito de repeticiones. Un bucle se puede interrumpir al alcanzar el número establecido de repeticiones o al cumplirse una condición específica. Para más información sobre condicionales, revisa nuestro tutorial sobre Condicionales en VBA.

Definición de un Loop en programación
Figura 1. Definición de un Loop en programación.

Tipos de bucles en VBA

En VBA, existen dos estructuras principales para implementar bucles: For / Next y Do / Loop. Cada una tiene características únicas que la hacen adecuada para diferentes situaciones. A continuación, exploraremos ambos tipos con ejemplos prácticos.

Estructura For Next

La estructura For Next permite realizar una acción repetitiva desde un número inicial (NI) hasta un número final (NF). A continuación, se muestra un ejemplo de cómo se puede estructurar un bucle For:

NI NF Total de repeticiones
1 10 10
10 19 10
81 91 10

El número de repeticiones debe ser un entero. La estructura For Next se declara de la siguiente manera:

For Variable = NI To NF Step incremento Declaración del lazo
Actividad repetitiva Actividad
Next Declaración del lazo

Ejemplo del bucle For Next en VBA

A continuación, veremos cómo encontrar la última celda ocupada en un rango utilizando un bucle For Next:

Ejemplo estructura For Next
Figura 2. Ejemplo de la estructura For Next.
Sub Tutorial5a_Loops()
For i = 1 To 10
  If Cells(i + 1, 1) = "" Then
    Ultima_fila = i 
    Exit For
  End If
Next
MsgBox ("Última fila: " & Ultima_fila)
End Sub

En este código, el programa verifica si la celda está vacía, y si es así, se detiene y muestra la última fila ocupada.

Estructura Do Loop

La estructura Do Loop no incrementa automáticamente la variable de repetición. Ofrece tres modalidades que permiten un control más flexible:

Modalidad Do

Esta forma permite declarar el bucle y especificar la condición de salida. Debe usarse con precaución para evitar bucles infinitos.

Do Declaración del lazo
Actividad repetitiva Actividad
Variable=Variable+1 Control del número de repetición
Loop Declaración del lazo

Ejemplo del bucle Do Loop en VBA

El siguiente ejemplo muestra cómo encontrar la última fila ocupada utilizando Do Loop:

Ejemplo estructura Do
Figura 3. Ejemplo de la estructura Do.
Sub Tutorial5b_Loops()
i = 2
Do
  If Cells(i, 1) = "" Then
    Ultima_fila = i - 1
    Exit Do
  End If
  i = i + 1
Loop
MsgBox ("Última fila: " & Ultima_fila)
End Sub

Modalidad Do While

Esta modalidad se ejecuta mientras se cumpla una condición especificada. Veamos cómo aplicarla:

Estructura Do While
Figura 4. Estructura Do While.
Sub Tutorial5c_Loops()
i = 2
Do While Cells(i, 1) <> ""
  'Actividad repetitiva
  i = i + 1
Loop
Ultima_fila = i - 1
MsgBox ("Última fila: " & Ultima_fila)
End Sub

Modalidad Do Until

Esta modalidad se ejecuta hasta que se cumpla una condición. Aquí hay un ejemplo:

Ejemplo estructura Do Until
Figura 5. Ejemplo de la estructura Do Until.
Sub Tutorial5d_Loops()
i = 2
Do Until Cells(i, 1) = ""
  'Actividad repetitiva
  i = i + 1
Loop
Ultima_fila = i - 1
MsgBox ("Última fila: " & Ultima_fila)
End Sub

Como puedes ver, el bucle se ejecuta hasta encontrar la primera celda vacía.

Conclusión

Con lo aprendido en este tutorial, podrás utilizar las estructuras de bucles en VBA sin dificultad. Se recomienda evitar la modalidad Do por el riesgo de bucles infinitos. Opta por For Next, Do While o Do Until para un control más seguro y efectivo.

¿Quieres saber más? Contáctanos...

Uso del condicional If en VBA (if, elseif, else, end if)

A partir de este tutorial, empezaremos a explorar las bondades de programar, siendo una de ellas la capacidad de hacer que el computador “tome decisiones” a través de los condicionales.

¿Qué es un Condicional?

Un condicional es una evaluación que se realiza en el flujo de la información (una o más variables) y permite discernir si se cumple o no con una condición establecida. Según la respuesta, se tomarán diferentes acciones.

¿Cómo Escribir un Condicional en VBA?

Para escribir un condicional (If en VBA), debemos evaluar una variable y dar instrucciones sobre qué hacer si se cumple la condición. Esta evaluación se realiza utilizando el comando If.

Ejemplo de Condicional If en VBA: Entradas al Cine

Imaginemos que estamos creando un sistema para vender entradas de cine, donde el precio de la entrada depende de la edad del espectador. En este caso, definimos las siguientes reglas:

  • Los niños de 12 años o menos recibirán una entrada "Preferencial".
  • Los adultos mayores de 12 años recibirán una entrada "Regular".

Para implementar estas reglas en VBA, utilizaremos una estructura condicional If que evaluará la edad ingresada en la celda B2. Si la edad es menor o igual a 12, se asignará "Preferencial" a la celda C2. De lo contrario, se asignará "Regular". Aquí tienes el código correspondiente:


Sub AsignarEntrada()
    Dim edad As Integer
    ' Leer la edad de la celda B2
    edad = Range("B2").Value

    ' Evaluar la condición
    If edad <= 12 Then
        Range("C2") = "Preferencial" ' Entrada para niños
    Else
        Range("C2") = "Regular" ' Entrada para adultos
    End If
End Sub

En este ejemplo, si el usuario ingresa un valor en la celda B2 (por ejemplo, 10), el sistema evaluará la condición:

  • Si 10 <= 12 es verdadero, la celda C2 mostrará "Preferencial".
  • Si el usuario ingresa 15, el sistema evaluará 15 <= 12, lo que es falso, y la celda C2 mostrará "Regular".

Condicionales If Anidados en VBA

A veces, es necesario evaluar una segunda condición después de la primera evaluación. Esto se denomina "Condicional Anidado". La estructura será similar a la siguiente:

Ejemplo de Condicional If Anidado en VBA

Continuando con el ejemplo de la entrada al cine, podríamos agregar una evaluación adicional. Supongamos que queremos ofrecer entradas "Preferenciales" también a personas de tercera edad (mayores de 59 años). El código podría verse así:


Sub AsignarEntradaCompleta()
    Dim edad As Integer
    edad = Range("B2").Value

    If edad <= 12 Then
        Range("C2") = "Preferencial" ' Entrada para niños
    ElseIf edad > 59 Then
        Range("C2") = "Preferencial" ' Entrada para tercera edad
    Else
        Range("C2") = "Regular" ' Entrada para adultos
    End If
End Sub

Uso de Or y And (Operadores Lógicos) en Condicionales VBA

También es posible evaluar múltiples condiciones en un mismo condicional usando los operadores lógicos And y Or.

Ejemplos de Uso de Or y And en Condicionales de VBA

Si queremos considerar un rango de edad para las entradas "Regular", podemos usar el operador And:


Sub AsignarEntradaConOperadores()
    Dim edad As Integer
    edad = Range("B2").Value

    If edad > 12 And edad < 60 Then
        Range("C2") = "Regular"
    Else
        Range("C2") = "Preferencial"
    End If
End Sub

De manera similar, usando el operador Or podemos evaluar si una entrada es "Preferencial" si la edad es menor a 13 o mayor a 59:


Sub AsignarEntradaConOr()
    Dim edad As Integer
    edad = Range("B2").Value

    If edad < 13 Or edad > 59 Then
        Range("C2") = "Preferencial"
    Else
        Range("C2") = "Regular"
    End If
End Sub

Conclusiones

Como has visto, hay diferentes formas de programar instrucciones de decisión en VBA, y cada método tiene sus ventajas. Con la práctica, mejorarás en la escritura de código más compacto y libre de errores.

¿Quieres saber más? Contáctanos...