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

Selección de celdas por referencias

En Excel estamos acostumbrados a referirnos a la celda según aparece en la hoja de cálculo. BAjo este concepto, si deseas seleccionar la celda “E2”, la secuencia de comandos sería:

Range(“E2”).Select

Selección de celdas en forma matricial

Este es un metodo más flexible pues te permitirá moverte entre celdas fácilmente a través de Loops, por ejemplo. Por ello es nuestra SmartCode Recomendation.

Deberás reconocer el número de fila y columna de la celda que deseas seleccionar. Así, la columna “E” es la número 5. Te recomendamos incluir la identificación de la hoja de cálculo para evitar ambigüedades. La secuencia de comandos para hacerlo es:

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

Ejemplo:

Sheets(“Hoja 1”).Cells (2,5).Select

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

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

Una de las actividades más comunes en Excel/VBA es escribir datos sobre una hoja de cálculos. Para ello, muchas veces deberás saber cual es la última celda con datos en la hoja de Excel y desplazarte una casilla en la hoja de cálculo (en dirección vertical u horizontal según lo requieras) para encontrar la primera celda disponible, por lo que estamos seguros de que este Tip será de gran utilidad para ti.

Figura 1. Última celda ocupada.

Identificación por Loop

Aunque no es la forma más práctica ni eficiente, por el tiempo de cómputo que esta conlleva, la secuencia por loop en VBA puede ser usada para encontrar la última celda ocupada. Esta se pasea por todas las celdas de un rango (por una columna o fila) y evalúa en cada caso si cumple la condición de celda vacía. El código podría ser como se indica en el siguiente ejemplo, en el cual se escribe en la primera celda disponible luego de encontrar la última fila con datos en el libro Excel:

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) = "First available cell" 
End Sub

También es posible hacer el Loop avanzando en columnas en la hoja de trabajo, para conocer la última columna ocupada y escribir en la primera columna disponible, como se muestra a continuación:

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) = "First available cell" 
End Sub

 

 

 

Búsqueda directa

Por ser la forma más rápida y de menor costo computacional esta es nuestra SmartCode Recomendation. Consiste en aplicar los comandos VBA descritos a continuación para encontrar la última celda ocupada en una columna específica de la hoja Excel, o la última celda ocupada en una fila específica. Para encontrar la última celda ocupada en una columna puedes utilizar los comandos que describen a continuación:

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

Ejemplo:

Sub getLastRow()

lastRow = Cells(Rows.Count, "A").End(xlUp).Row 
Cells(lastRow + 1, 1) = "First available cell"

End Sub

Similarmente, para encontrar la última celda ocupada en una una fila los comandos serian:

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

Ejemplo:

Sub getLastColumn()

lastColumn = Cells(1, Columns.Count).End(xlToLeft).Column 
Cells(1, lastColumn + 1) = "First available cell"

End Sub

 

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

 

 

Loops o Bucles en VBA

Estamos seguros de que este tutorial lo visitarás más de una vez, no solo por la frecuencia del uso de los lazos cerrados o loops en la programación sino por la importancia que tiene entender claramente el potencial de estas funciones en un programa.

¿Qué es un loop, bucle o lazo en programación?

Un loop es básicamente la repetición cíclica de una actividad, acotada en un número finito de repeticiones. El loop puede romperse ya sea por agotar el número de repeticiones pre-establecidas o por el cumplimento de alguna otra condición (puedes repasar los conceptos básicos de los condicionales en nuestro tutorial de Condicionales en VBA).

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

Tipos de loop en VBA

En VBA existen esencialmente dos estructuras para hacer los lazos cerrados: For / Next y Do / Loop. Cada una tiene sus características particulares que la pueden hacer más adecuada que la otra para ser usada en ciertos escenarios. Es común toparnos con situaciones en las que sea posible utilizar cualquiera de las dos estructuras, por ello en este tutorial utilizaremos un mismo ejemplo para explicar ambas opciones, para que así tú puedas decidir cual se adapta mejor a tu lógica de programación.

Estructura For Next

Esta modalidad permite hacer una actividad repetitiva desde un número inicial (NI) hasta un número final de repeticiones (NF). Si deseamos hacer, por ejemplo, diez repeticiones, podríamos hacerlos bajo una infinidad de combinaciones:

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

El número de repeticiones o ciclos deben estar definidos por números enteros (puedes repasar los conceptos básicos en nuestro tutorial de Variables).

La estructura For Next requiere del empleo de una variable entera, que va a ir aumentando progresivamente desde un NI hasta (To) NF, según un paso (Step) predefinido, de la siguiente manera:

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

El paso incremento debe se un entero positivo o negativo.

Ejemplos del bucle For Next en VBA

Tomemos el ejemplo de una actividad muy común cuando hacemos un programa en VBA: encontrar la última celda ocupada en un rango determinado. Si queremos encontrar el número de la última fila cuya celda está ocupada podemos usar un condicional que evalúe si la celda está vacía, y en caso de ser negativo, avanzar hasta la próxima fila.

En el siguiente ejemplo podemos observar que existen varios nombres escritos en la columna A, siendo el último nombre "Ana", ubicado en la fila 6. De esta manera, si nuestra función es correcta, debe poder identificar que la fila 6 contiene la última celda ocupada.

Sub Tutorial5a_Loops()
For i = 1 To 10
  If Cells(i + 1, 1) = "" Then
    Ultima_fila = i 
    Exit For
  End If
Next
MsgBox ("Ultima fila: " & Ultima_fila)
End Sub

VBA ofrece distintos métodos para referirnos a las celdas y rangos, en este caso elegimos la opción de manejarla como elemento de una matriz bajo la forma Cells(i+1,1). Como inicialmente el valor de i=1, la evaluación de celda vacía en un principio se hace sobre el elemento Cells(2,1), que equivale a la celda “A2”. Luego cuando el programa llega a la instrucción Next, la variable i pasa a ser igual a 2 (debido a que el paso o incremento "Step" lo definimos como 1), evaluando entonces el elemento Cells(3,1) que equivale a “A3”. La rutina del ejemplo está diseñada para que la evaluación se repita hasta que i=10. Sin embargo, cuando i=6 el programa detecta que la fila i+1 ( “A7” ) está vacía y sale del lazo.

Estructura Do Loop

La traducción literal es hacer (Do) el lazo (Loop). Esta estructura no cuenta con la particularidad de la forma For Next de aumentar automáticamente la variable entera que mide el número de repeticiones, pero sí nos ofrece 3 modalidades que nos dan un amplio espectro de alcance:

Modalidad fundamental: Do

Bajo esta forma, sólo debemos declarar la estructura y especificar bajo que condición saldremos del lazo; es una especie de lazo infinito, por ello debemos manejarla con cuidado si no queremos colgar nuestro computador 🙂

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

Ejemplos del bucle Do Loop en VBA

Para el ejemplo anterior de la última fila ocupada en una hoja de Excel, la estructura Do podría emplearse de la siguiente manera:

Figura 3. Ejemplo 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 ("Ultima fila: " & Ultima_fila)
End Sub

Modalidad Do While

La diferencia de esta forma con respecto a la anterior es que en ella se declara una instrucción adicional: While, que significa que el lazo o Loop se hará mientras se cumpla con una condición que declares dentro de la misma estructura:

Do While Condición Declaración del lazo
   Actividad repetitiva Actividad
   Variable=Variable+1 Control del numero de repetición
Loop Declaración del lazo

Ejemplos de Do While en VBA

El ejemplo que venimos desarrollando podría definirse de la siguiente manera:

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 ("Ultima fila: " & Ultima_fila)
End Sub

En este caso la instrucción Do While se ejecutará mientras las celdas de la columna A no estén vacías (<>""); al aparecer la primera celda vacía el lazo se romperá.

Modalidad Do Until

Esta es muy similar a la modalidad anterior, con la diferencia de que este lazo se ejecutará hasta que una condición pre-establecida se cumpla. Tiene las mismas ventajas, bondades y limitaciones que la modalidad Do While, sólo que se hace un enfoque diferente a la condición que se desea cumplir. El esquema de esta instrucción es el siguiente:

Do Until Condición Declaración del lazo
   Actividad repetitiva Actividad
   Variable=Variable+1 Control del numero de repetición
Loop Declaración del lazo

Ejemplos de Do Until en VBA

En nuestro ejemplo, la instrucción Do Until podría ser adaptada de la siguiente manera:

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

Como puedes observar, el lazo se ejecutará hasta que se encuentre la primera celda vacía.

Con lo que hemos aprendido en este tutorial podrás usar sin dificultad cualquiera de las estructuras de lazos. Nuestra recomendación es evitar en lo posible la modalidad fundamental Do por las implicaciones que ella puede tener. En su lugar puedes usar las intrucciones For Next, Do While o Do Until.

 

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, una de ellas es hacer que el computador “tome decisiones” y esto se hace a través de los condicionales.

¿Qué es un condicional?

Un condicional es un cuestionamiento que se hace en el flujo de la información (una o más variables) y en el cual se pude discernir si cumple o no con una condición que se establezca, y en función de esa respuesta se tomarán acciones.

Figura 1. Diagrama condicional.

Es muy común que encontremos situaciones en las que cuando no se cumpla la condición dada, la decisión conlleve a una acción que nos regrese al punto inicial de cuestionamiento.

Figura 2. Diagrama condicional con re-evaluación.

Aunque parezca lógico, es importante dejar en claro que la única limitación sobre el tipo de preguntas es que las mismas puedan ser respondidas con la información que se maneje en el programa que estemos desarrollando. En este sentido, es posible hacer preguntas independientemente del tipo de variables, por ejemplo:

Tipo de variable Pregunta ejemplo
String ¿El número de caracteres es menor que el máximo permitido?
Date ¿La fecha de finalización es posterior a la fecha tope?
Integer ¿Es esta persona mayor de edad?
Double ¿Es el volumen de un objeto menor a la capacidad una caja?

Para poder lidiar con estas preguntas es necesario tener la información adecuada para cada caso, y la más importante tener una definición clara de la condición que se desea cumplir.

 

 

 

¿Cómo escribir un condicional en VBA?

Para escribir un condicional (If en VBA) debemos hacer el cuestionamiento sobre la variable a evaluar y luego dar la instrucción de qué hacer si se cumple la condición dada. Este cuestionamiento se hace a través del uso de la función o comando If.

Opcionalmente se puede dar la instrucción de hacer algún tipo de actividad en caso de no cumplir con la condición; en caso de no dar esta instrucción sencillamente no se hará ninguna acción. Tomemos un ejemplo de las entradas al cine según las edades de las personas; si es para un niño (lo definiremos como: edad menor o igual a 12 años) será entonces una entrada “Preferencial”, de lo contrario (edad mayor o igual a 12 años) será una entrada “Regular”, tal y como se muestra a continuación en la siguiente estructura IF:

Ejemplos de condicional If en VBA

If Range("B2") <= 12 Then Cuestionamiento (obligatorio)
     Range("C2") = "Preferencial" Resultado si se cumple
Else En caso de no cumplir (opcional)
     Range("C2") = "Regular" Resultado si no se cumple
End If Cierre (obligatorio)
Figura 3. Estructura de la función condicional en VBA.
Sub Tutorial4a_Condicional()
Dim edad As Integer
If Range("B2") <= 12 Then
  Range("C2") = "Preferencial"
Else
  Range("C2") = "Regular"
End If
End Sub

Condicionales If anidados en VBA

Es posible que luego de la evaluación de una variable, sea necesario hacer una segunda evaluación de otra condición; esto es lo que denominaríamos como “Condicional Anidado”, y la estructura será similar a la que mostramos a continuación:

Ejemplos de condicional If anidado en VBA

If Range("B2") > 12 Then Cuestionamiento 1 (obligatorio)
  If Range("B2") < 60 Then Cuestionamiento 2
Range("C2") = "Regular" Resultado si se cumple 2
Else En caso de no cumplir 2 (opcional)
Range("C2") = "Preferencial" Resultado si no se cumple 2
End If Cierre 2 (obligatorio)
Else En caso de no cumplir 1 (opcional)
  Range("C2") = "Preferencial" Resultado si no se cumple 1
End If Cierre 1 (obligatorio)

Para hacerlo más claro, retomemos el ejemplo de la entrada al cine: los tickets preferenciales pueden ser para niños o adultos de tercera edad; una forma de evaluar sería con este orden:

  • Que la persona sea un adulto: edad mayor a 12 años, lo cual excluye a los niños (entrada preferencial).
  • Que el adulto sea menor a 60 años, condición que excluye a las personas de tercera edad (entrada preferencial).

El cumplimiento positivo de estas dos condiciones elegirá a una persona entre 13 y 59 años, que son los que pagarían la entrada “Regular”. Ahora puedes verlo más claramente si lo llevamos a un diagrama de flujo y código en VBA:

Figura 4. Condicional VBA anidado .
Sub Tutorial4b_Condicional()
Dim edad As Integer
If Range("B2") > 12 Then
  If Range("B2") < 60 Then
    Range("C2") = "Regular"
  Else
    Range("C2") = "Preferencial"
  End If
Else
  Range("C2") = "Preferencial"
End If
End Sub

Condicionales múltiples (If Elseif) en VBA

Existe una modalidad que llamaremos múltiple condicional, que es muy parecida al condicional anidado, la diferencia principal es que el condicional secundario se hace sólo si NO se cumple el primer condicional. Esta opción se utiliza mediante la instrucción Elseif en VBA y debe ir seguido a un If principal, tal y como se muestra en la siguiente estructura:

Ejemplos de condicional múltiple en VBA

If Condición A Then Cuestionamiento A (obligatorio)
     Decisión positiva de A Resultado si se cumple
Elseif Condición B Then Cuestionamiento B (obligatorio)
     Decisión positiva de B Resultado si se cumple
Else En caso de no cumplir A o B (opcional)
     Decisión negativa de A y B Resultado si no se cumple
End If Cierre (obligatorio)

La cantidad de Elseif  o condicionales adicionales no tiene límites, todo depende de la evaluación y las decisiones que ese deseen tomar.

Conociendo ya la estructura, es momento de revisar el diagrama de flujo con el código VBA:



Figura 5. Condicional múltiple en VBA.
Sub Tutorial4c_Condicional()
If Range("B2") > 59 Then
  Range("C2") = "Preferencial"
ElseIf Range("B2") < 13 Then
  Range("C2") = "Preferencial"
Else
  Range("C2") = "Regular"
End If
End Sub

Uso de Or y And (operadores lógicos) en condicionales VBA

En algunos casos es posible hacer que un mismo condicional evalúe dos o más requisitos a través de los comparadores lógicos And (“y”) y Or (“o”).

El operador And aprueba la condición solo si se cumple la primera “Y” la segunda condición a la vez. Por ejemplo: ¿Es la edad mayor a 12 años y menor a 60?

Ejemplos de uso de Or y And en condicionales de VBA



Figura 6. Uso del operador lógico “And” en VBA.
Sub Tutorial4d_Condicional()
If Range("B2") > 12 And Range("B2") < 60 Then
  Range("C2") = "Regular"
Else
  Range("C2") = "Preferencial"
End If
End Sub

Similarmente, el operador Or considerará cierta la condición evaluada si se cumple al menos una de las propuestas; por ejemplo: “la entrada Preferencial es para personas con edades menores de 13 años O mayores de 59 años.


Figura 7. Uso del operador lógico “Or” en VBA.
Sub Tutorial4e_Condicional()
If Range("B2") < 13 Or Range("B2") > 59 Then
  Range("C2") = "Preferencial"
Else
  Range("C2") = "Regular"
End If
End Sub

Al igual que los condicionales anidados y múltiples, no existe limitación sobre la cantidad de operadores lógicos y sus combinaciones.

Como puedes ver, hay más de una forma de programar una instrucción de decisión en el computador, algunas maneras son más compactas que otras, como lo vimos en el ejemplo que desarrollamos durante este tutorial.

Con la práctica, irás adquiriendo destrezas que te permitirán hacer un código de programación más compacto y a prueba de errores.

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

 

Variables en VBA

¿Qué son las variables en VBA y por qué se usan?

En términos prácticos, las variables son elementos que permiten operar en un código en cualquier lenguaje de programación: números, letras, vectores, matrices. Las variables ocupan un espacio en la memoria de nuestro computador, y su buen uso impactará positivamente en la velocidad del código. Es esta la razón por la que traemos el tema a este tutorial.

Haciendo un símil con la vida real, cuando nos disponemos a guardar la ropa en una gaveta o armario, la podemos llenar de muchas cosas atendiendo la limitación física del espacio, pero si ordenamos correctamente, es muy probable que podamos almacenar más ropa en ella y con toda seguridad será más fácil encontrar algo que se desee; esto es lo que ocurre con los computadores: si almacenamos las variables adecuada y ordenadamente, optimizaremos su uso y tendremos mayor capacidad de almacenar más información y manejarla de mejor manera.

Figura 1. El buen manejo de las variables contribuye con el orden y la eficiencia del código.

¿Qué es la declaración de variables en VBA?

La declaración de variables es una actividad en la cual se emite la instrucción al computador de reservar cierta cantidad de memoria para una determinada variable según su tipo.

Algunos lenguajes de programación exigen declarar las variables de forma obligatoria, sin embargo, la flexibilidad de VBA permite proceder sin este paso, aunque debemos tener en mente que, cada vez que el computador se encuentre con una variable no definida, VBA tendrá que pausar momentáneamente la ejecución del programa para decodificar el tipo de variable adecuada en cada caso, lo cual se traduce en trabajos repetitivos e innecesarios que debe hacer el computador y que a su vez llevan tiempo. En tal sentido para ahorrar tiempo y memoria, es muy buena práctica declarar las variables.

Nuestras primeras macros serán cortas y sencillas, sin embargo queremos enseñarte las mejores técnicas de programación, por ello nos tomaremos unos minutos con este tutorial para asentar bases firmes en tus conocimientos de VBA.

Tipos de variables en VBA

Como ya fue descrito, una variable ocupa un espacio en la memoria del computador de acuerdo a su tipo. Acá tenemos una lista de las variables más usadas comúnmente por los programadores en VBA, como lo son las variables Boolean, Integer, String, Variant, entre otras, con información adicional de interés.

Tipo de variable Denominación en VBA Espacio ocupado (byte) Rango de valores Ejemplo
Booleana Boolean 2 Verdadero o Falso Answer= TRUE
Entero Integer 2 –32.768 ↔ 32.767 Cant= 5
Objeto Object 4 Cualquier objeto Celda(“A1”)
Doble precisión Double 8 Positivos:
4,94×19-324 ↔ 
1,79×19308
Negativos:
-1,79×19308 ↔ 
-4,94×19-324
Pi= 3.14159265
Moneda Currency 8 –922.337.203.685.477 ↔
922.337.203.685.477
Monto= 5.5
Fecha Date 8 01/01/0100 ↔ 31/12/9999 BD= 09/08/1985
Texto (cadena de caracteres) String 1 por caracter Cualquier texto Prod= “Carro”
Variable especial Variant Varía Varía según el tipo de datos Total= Pi*Cant

 

VBA le asigna por defecto a una variable no declarada la categoría Variant o variable especial. Cada vez que sea necesario operar con alguna variable de este tipo, el computador deberá revisar si en ella está almacenado un número (inclusive revisaría el tipo de número: real o entero), texto, fecha u otro. Lo ideal es ahorrarle ese trabajo el computador y hacerle saber de antemano cuanta memoria debe reservar para cada variable, y es aquí donde se fundamenta la importancia de esta actividad.

Niveles de variables en VBA

Dentro del Visual Basic for Applications, tendremos la opción de organizar nuestros macros en diferentes niveles: módulos, funciones y rutinas. Las variables empleadas en cada nivel pueden ser públicas (Public) o privadas (Private):

Tipo de variable Usada en:
Privada Un mismo procedimiento (rutina o función) para un mismo modulo
Pública Todos los procedimientos de todos los módulos

Es importante saber que dos variables privadas diferentes pueden tener el mismo nombre y ser utilizada en dos procedimientos diferentes porque estas variables ¡no son compartidas! Así que cuando un procedimiento termine, el valor almacenado en la memoria para esa variable será desechado. Caso contrario con las variables públicas en las que el valor permanecerá activo mientras esté corriendo tu macro, independientemente si estas en un módulo u otro.

Normalmente se viene a la mente esta pregunta: ¿Por qué no emplear variables públicas todo el tiempo? La respuesta se vendrá haciendo más clara conforme nuestros programas vayan siendo más complejos.

Un ejemplo típico podría ser cuando tratemos de ubicar la última fila ocupada de un libro, es una actividad muy común; es probable que en una macro debamos hacer esta actividad varias veces, en este sentido, si no queremos cometer un error, lo más recomendable es que cuando terminemos de correr esa función la variable se borre automáticamente, ya que de lo contrario estaríamos obligados a “reiniciar” los valores; para ello, la mejor practica seria que esa variable sea privada.

Probablemente esto no se vea tan claro aún, sin embargo, estamos seguros de que lo iremos entendiendo conforme nos vayamos adentrando en el mundo de la programación VBA.

¿Cómo declarar una variable en VBA?

  • Lo primero que debemos hacer es abrir el editor de comandos de VBA (puedes referenciarte a nuestro primer tutorial).
  • Para hacer la declaración, debemos seguir la siguiente estructura, que comienza con las instrucción Dim:
Instrucción de declaración Variable Como Tipo de variable

Ejemplo:

Dim pi As Double

Es muy importante que identifiques el tipo de variable que deseamos almacenar; en este caso, tal y como lo vimos previamente, el número pi se puede categorizar como doble precisión (Double).

  • Finalmente imprimimos el resultado, en este caso a través de un mensaje en pantalla, siguiendo la estructura según se muestra:

Ejemplo:

MsgBox(pi)
Figura3. Declaración de variable de doble precisión.
Sub Tutorial3b_Variables()
Dim pi As Integer
pi = 3.141592
MsgBox (pi)
End Sub

Algunos tips de las variables en VBA

Para que el VBA nos obligue a declarar siempre las variables, y así evitemos errores de declaración por defecto y uso de variables públicas y privadas inadecuadas, debemos escribir Option Explicit antes de cualquier rutina o función de cualquier módulo, tal y como se muestra:

Figura 6. Instrucción de declaración explicita de las variables.

En caso de que asignemos la opción explicita e involuntariamente obviemos declarar una variable, nos aparecerá un error de definición de variable que será muy fácil de identificar, pues el mismo VBA nos resaltarán la variable en cuestión; sólo tendremos que declararla al principio del nuestra rutina o función según su tipo.

Figura 7. Error de falta de definición de variable.

Otra ventaja de declarar variables mediante la instrucción Dim es que podemos hacer aparecer un menú con la lista de variables declaradas, lo cual nos ayuda a escoger o escribir adecuadamente la variable que deseamos referenciar. Este menú aparece cuando escribimos (al menos) la primera letra de la variable y presionamos CTRL + la barra espaciadora del teclado. Observarás en la lista varios elementos, pero distinguirás las variables declaradas en la lista con un icono que tiene una mano, que identifica que la misma fue una entrada realizada por el usuario.

Sobre los nombres de las variables en VBA

El computador no asocia una variable a un elemento físico, químico, económico o mecánico en particular, por lo tanto la principal regla es colocar nombres que sean representativos de la variable a tratar, ya que debemos recordar que los ¡programadores somos humanos! y nosotros somos propenso a equivocarnos. Un computador será, sin problemas, capaz de diferenciar variables cuyos nombres sean por ejemplo mmmmnmmm y otra mmmmmmmm. Como verás éstos son nombres diferentes, pero a la vez muy parecidos, y es muy probable que nos causen cierta confusión.

Otras reglas sobre los nombres de las variables:

  • El primer carácter del nombre de la variable debe ser siempre una letra, aunque después utilices combinación con números y signos
  • Aunque nemotécnicamente es válido, VBA no reconoce la diferencia entre mayúsculas y minúsculas, por lo tanto nombres como “Var” y “var” serán reconocidas como una misma variable; de hecho si en nuestro programa utilizamos una declaración adecuada, el mismo VBA hará una corrección y llevará estas dos variables a una misma manera.
  • No es permitido el uso de espacios, operadores matemáticos, puntos ni símbolos como numeral (#), Dólar ($), porcentaje (%) o cierre de exclamación (!) entre otros.
  • Aunque parezca poco relevante, como cultura general, el máximo número de caracteres en el nombre de una variable será 255.
 

 

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

Uso de la grabadora de macros de Excel

La grabadora de macros es una utilidad que te ayuda a dar los primeros pasos en el mundo de la programación en Visual Basic for Applications (VBA), y para los que tienen ya un camino recorrido en este mundo VBA, permite aclarar dudas sobre cómo hacer ciertas actividades repetitivas mediante la revisión de las instrucciones en el editor de comandos. Si quieres saber como se utiliza la grabadora de macros de Excel o como grabar una macro en Excel, estás en el sitio indicado.

Cuando actives esta utilidad, se grabará lo que hagas en el los programas de Office; puede ser utilizado en Excel y otros paquetes de Office como Word y PowerPoint. En este sencillo ejemplo que haremos a continuación, grabaremos como hacer automáticamente el cambio de formato de celdas y texto, así como desplazarnos entre celdas vecinas y como repetir la secuencia con sólo con hacer un Click.

Activar la grabadora de macros

Para activarla debes ir a la pestaña “DESARROLLADOR” y ubicar el icono de la grabadora de macros.

Figura 1. Ubicación de la grabadora de macros.

Alternativamente la puedes ubicar en la pestaña “VISTA” seleccionando el comando “Grabar Macro…” del menú “Macros”.

Figura 2. Ubicación alternativa de la grabadora de macros.

Preparar la grabación de la macro

Aparecerá una la ventana “Grabar macro”, allí le colocarás a tu macro el nombre que se desees. También tendrás la opción de asignarle una combinación de teclas que te permitirán correr tu macro de una forma rápida. Si no le asignas la “Tecla de método abreviado” podrás acceder a tu macro a través de otra forma que te la explicaremos más adelante.

A esta macro la denominaremos “Mi_Segunda_Macro” y su método abreviado será “CTRL + m”.

Figura 3. Grabar Macro.

Cuando presionemos Aceptar, se iniciará la grabación. Es importante saber que a partir de este momento, cualquier acción que hagamos dentro de Office: integradamente Word, Excel y los demás programas del paquete, será grabada.

Sabremos que la grabadora está corriendo porque en el lugar que aparecía “Grabar macro” ahora aparecerá “Detener Grabación”.

Grabar la macro de Excel

En esta macro, una vez hayas seleccionado la celda A1, grabaremos las siguientes acciones:

  • Cambiarle el relleno a la celda “A1” a color amarillo.
  • Seleccionar con el mouse o desplazarse con el teclado hasta la celda “B1” y modificarle el formato del texto colocándolo color Naranja.
  • Similarmente, pasar a la celda “C1” y cambiarle el color del texto a azul.
  • Repetiremos el paso con la celda combinada “B2:C2” al cambiarle el color del texto a Marrón.
  • Selecciona las celdas “A1:C2” y cámbiale el tipo y tamaño de letra a “Arial Narrow” 18 pt.
Figura 4. Antes y después de ejecutar la macro.

Cómo se detiene la grabación de la macro de Excel?

Una vez completadas todas las actividades que queremos dejar en la macro, es necesario detener la grabación presionando el comando “Detener grabación”.

Figura 5. Detener la grabación.

Revisar la secuencia de comandos en VBA

Tal y como vimos en el primer tutorial, podemos entrar al editor de comandos de VBA y ver lo que fue grabado. Esta actividad es opcional, sólo debes realizarla si necesitas complementar algo o si ya tienes cierta experiencia.

Figura 6. Editor de comandos de VBA.
Sub Mi_Segunda_Macro()
'
' Mi_Segunda_Macro Macro
'
' Acceso directo: CTRL+m
'
With Selection.Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.Color = 65535
.TintAndShade = 0
.PatternTintAndShade = 0
End With
Range("B1").Select
With Selection.Font
.Color = -16750849
.TintAndShade = 0
End With
Range("C1").Select
With Selection.Font
.ThemeColor = xlThemeColorAccent1
.TintAndShade = -0.249977111117893
End With
Range("B2:C2").Select
With Selection.Font
.Color = -16764058
.TintAndShade = 0
End With
Range("A1:C2").Select
Range("B2").Activate
With Selection.Font
.Name = "Calibri"
.Size = 18
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.TintAndShade = 0
.ThemeFont = xlThemeFontMinor
End With
Range("A1").Select
End Sub

Ejecutar nuevamente la macro de Excel

La secuencia que acabas de grabar será repetida cada vez que ejecutes tu macro a partir del comando “Macro” que encontrarás en la pestaña “DESARROLLADOR”. Se mostrará un cuadro donde veras en forma de lista todas las macros que hayas grabado. Sólo deberás seleccionar la macro que desees utilizar y luego presionar “Ejecutar”.

Figura 7. Ubicación de macros grabadas.

También podrás ejecutar la macro mediante el método abreviado que le hayas asignado, en este caso lo colocamos como “CTRL + m”.

Alternativamente podremos acceder a la listas de macros grabadas a través del comando “Ver macros” que está ubicado en el menú “Macros” de la pestaña “VISTA”.

Figura 8. Ubicación alternativa de las macros grabadas.

Esta macro modifica el formato de las casillas; esta acción se repetirá independientemente del texto que esté en estas celdas, inclusive si las celdas están vacías. Puedes probar como funciona nuestra macro cambiando el texto y luego ejecutándola; veras que cada celda toma el formato de texto que le indicamos al grabar la macro.

Figura 9. Antes y después de ejecutar la macro con otro texto.

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

 

 

Mi Primera Macro en Excel

¿Qué es una macro de Excel?

Si eres un usuario de Excel seguramente te has encontrado en la necesidad de ejecutar tareas repetitivas. Pues bien, las macros permiten automatizar esas tareas repetitivas para ahorrarte tiempo y esfuerzo a la hora de trabajar en Excel, así que si quieres aprender como usarlas has llegado al sitio correcto. 

El lenguaje en el que se se escriben las macros de Excel se llama Visual Basic for Applications, más conocido como VBA. La buena noticia es que no tienes que ser un experto en programación para iniciar en este mundo.

En este primer tutorial te enseñaremos a crear tu primera Macro en Excel. Se trata de hacer aparecer un mensaje que diga "Hello World!". Para ello sigue los siguientes pasos:

Activar la pestaña de Desarrollador en Excel

En primer lugar, debemos estar seguros de tener activa la pestaña “DESARROLLADOR” en la cinta de opciones, ya que la misma dispone de opciones de interés para los programadores.

Para ello, abre un nuevo archivo de Excel y observa si esta pestaña está disponible.

En caso contrario, haz clic derecho en cualquier parte de la cinta de opciones y selecciona la opción “Personalizar la cinta de opciones…”. Luego activa la casilla de “Desarrollador” y presiona “Aceptar”.

Ingresar al editor VBA

El ingreso a al editor VBA puede darse por dos vías:
a) Mediante la combinación de teclas Alt + F11
b) Presionando el botón “Ver código” en la cinta de opciones “DESARROLLADOR”

Agregar un nuevo módulo en VBA

Dentro del entorno VBA, haz clic derecho en la carpeta de proyecto del libro de Excel (usualmente ubicada en la parte izquierda de la pantalla). Del menú desplegable selecciona Insertar / Módulo

Escribir el programa en VBA

Escribiremos un programa que emita el mensaje “Hello World!”. Para ello crearemos una subrutina (Sub) que llamaremos “MiPrimeraMacro”. El nombre de la subrutina no debe contener espacios ni caracteres especiales. El comienzo de la subrutina está denotado con la palabra “Sub”, y el final con la frase “End Sub” .

Dentro de la subrutina definiremos una variable de tipo “string” (hablaremos más adelante sobre los tipos de variables) que almacenará el texto a mostrar. A esta variable le asignaremos el nombre  “strSaludo”. El código debe lucir como se indica a continuación:

Sub MiPrimeraMacro()
     Dim strSaludo As String
   
     strSaludo = "Hello World!"
  
     MsgBox strSaludo
  
End Sub 
 

Ejecutar el programa en VBA

El programa los podemos ejecutar desde distintas vías:
a) Presionando la tecla F5
b) Presionando el botón de Ejecutar macro

c) Asignando la macro a un botón. Para ello ve a la pestaña “DESARROLLADOR” y selecciona “Insertar/Botón”. Luego haz clic en cualquier parte de la hoja para seleccionar la posición del botón. Excel preguntará por el nombre de la macro asociada a ese botón; selecciona “MiPrimeraMacro” y presiona aceptar.

Una vez que ejecutes la macro debe aparecer el siguiente mensaje:

¡Felicidades! Haz escrito tu primera macro.Guardar el libro Excel habilitado para macros

Asegúrate de guardar los documentos que contengan macros bajo la extensión “.xlsm” (habilitado para macros).

 

 

 

 

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