lunes, 27 de diciembre de 2021

Condicional IF ELSE anidado en VBA para Microsoft Excel

Dentro de un bloque de código se puede escribir cualquier código, incluso un nuevo bloque de código.

Esto se denomina anidamiento, y permite, por ejemplo, incluir un condicional dentro de otro condicional.

La mayoría de los lenguajes de programación imponen un máximo de niveles de anidamiento.

En el ejemplo de hoy veremos un condicional con anidamiento en una macro de Microsoft Excel programada en VBA.


Este es el código del ejemplo.




Option Explicit


Sub condicionalAnidado()

    Dim edad As Integer

    edad = InputBox("Introduce tu edad:")

    

    If edad < 18 Then

        If edad < 17 Then

            If edad < 16 Then

                If edad < 15 Then

                    If edad < 14 Then

                        If edad < 13 Then

                            If edad < 12 Then

                                If edad < 11 Then

                                    If edad < 10 Then

                                        MsgBox ("tienes menos de 10 años")

                                    End If

                                    MsgBox ("tienes menos de  11 años")

                                End If

                                MsgBox ("tienes menos de  12 años")

                            End If

                            MsgBox ("tienes menos de  13 años")

                        End If

                        MsgBox ("tienes menos de  14 años")

                    End If

                    MsgBox ("tienes menos de  15 años")

                End If

                MsgBox ("tienes menos de  16 años")

            End If

            MsgBox ("tienes menos de  17 años")

        End If

        MsgBox ("tienes menos de 18 años")


    Else

        MsgBox ("Eres mayor de edad")

    End If

    End Sub


Dentro de la primera estructura condicional if se encuentra todo el código que hemos resaltado en azul.
Cómo se puede contar son otros 8 condicionales if.

Dentro del segundo se incluirían los resultados a continuación.


Siendo el condicional más interno y resaltado en la siguiente imagen.

En este código si el dato introducido es menor que 10 se valoran todos los condicionales hasta llegar a este.


Si se cumple este condicional se mostrara el mensaje indicando que se es menor de 10 años.

Y también todos los mensajes indicando que 6 menor de 11 12 13 14 15 16 17 y 18.



domingo, 26 de diciembre de 2021

Condicional if else en VBA para Microsoft Excel - Ejemplo Mayoría de edad

Cuando creamos una estructura condicional de tipo IF ELSE en VBA para Microsoft Excel, es muy importante evaluar correctamente el valor del límite, para estar seguros de que se ejecuta el código correcto para este caso.

Para este ejemplo de la mayoría de edad se trata de evaluar correctamente el valor de 18 años.


Este es el código que usaremos:




 Option Explicit


Sub condicional()

    

    'Declaramos una variable numerica

    Dim edad As Integer

        

    edad = InputBox("Introduce tu edad:")

    

    If edad > 18 Then

        MsgBox ("Eres mayor de edad")

    Else

        MsgBox ("Eres menor de edad")

    End If


End Sub




Aunque aparentemente el código es correcto cuando lo tengo esperemos que tiene un problema en la condición.

Es muy importante siempre evaluar el el valor límite de la condición.

En este caso se trata de evaluar la edad la cual se pasa de ser menor de edad al mayor.

Este valor es el 18 r introduciendo este valor deberíamos obtener como respuesta que es mayor de edad.

Cómo vemos no es así la condición que hemos usado es que fuera mayor que 18, pero realmente con 18 ya debería ser mayor de edad.

Por lo tanto esta condición es incorrecta.

Como solución podemos comparar edad con maior que 17.

Otra opción es evaluar si el valor es mayor o igual al límite.

En este caso es el que elegiremos.


En este caso el resultado es correcto.


Siempre es muy importante evaluar el correcto funcionamiento del valor límite, para asegurarse de que el código funciona correctamente.

sábado, 25 de diciembre de 2021

Calendario Vital

Cada vez más entendemos que el tiempo es lo único que no se puede comprar.

Hoy día de Navidad os traigo algo para reflexionar.

Se trata de un calendario vital que he creado en Google Drive y os comparto.

https://docs.google.com/spreadsheets/d/1OVmBHiNf9mzn5wfE-A2C6KoNDlFElxYqNPC7VoxJ_XE/edit?usp=sharing

No es más que un conjunto de celdas que representan las semanas de nuestra vida.

En él he resaltado, la semana actual (resaltada en azul), la de nuestra jubilación en España (con 67 años resaltada en rosa) y la de nuestra muerte estimada (resaltada en rojo).

Si alguna vez os habéis preguntado que haríais si supieseis cuanto tiempo os queda de vida, solo tenéis que elegir vuestro país, vuestro sexo y poner la fecha de nacimiento (Ninguno de estos datos se almacena).



Como veis en mi caso aún me quedan algunas semanas de trabajo por delante.


viernes, 24 de diciembre de 2021

Condicional con bloque Else en VBA para Microsoft Excel

Aunque es posible evaluar si una condición es verdadera con un bucle IF y con otro bucle IF evaluar si es falsa, este es un proceso poco práctico.

En todos los lenguajes de programación existe la estructura IF ELSE.

Se trata de un condicional IF, que en su parte ELSE incluye las instrucciones que se ejecutarán si no se cumple la condición. De esta forma es posible definir el funcionamiento del programa tanto si se cumple como si no se cumple la condición.


El código del ejemplo de hoy es este:

Option Explicit

Sub condicional()

    'Declaramos una variable numerica

    Dim numeroSecreto As Integer

    Dim respuesta As Integer

        

    'asignamos un valor por error a una variable con otro nombre

    numeroSecreto = 4

    

    respuesta = InputBox("dime un numero")

 

    If numeroSecreto = respuesta Then

        'mostramos mensaje

        MsgBox ("Has acertado")

    Else

        'mostramos mensaje

        MsgBox ("No has acertado")

    End If

End Sub


Partimos del código del ejemplo que mostrábamos el último día.

En este ejemplo se va el vamos si hay número era igual a otro almacenar una variable y eso quedamos en instrucción.

Y a continuación en otro condicional evaluamos la condición contraria esto es si el valor almacenado era distinto al indicado.


El usar dos condiciones por separado, una y la inversa puede provocar que al crear la condición inversa nos equivoquemos y dejemos alguna posibilidad sin tener en cuenta.

Editar este inconveniente todos los lenguajes de programación e incluyendo un condicional if else if.

En la parte b en valoremos aquellas instrucciones que deben ejecutarse si se cumple la condición y en la parte él se las que deben ejecutarse si no se cumple la condición.

Para transformar el código anterior, lo único que tenemos que hacer es eliminar el ENF IF del primer bucle y la condición del segundo y sustituirlo por la instrucción ELSE.

El código queda como se muestra a continuación.

Debemos tener en cuenta que dentro de cualquier bloque de instrucciones es posible incluir cualquier instrucción.

Esto hace posible crear bucles anidados.


miércoles, 22 de diciembre de 2021

Introducción al uso de la instrución condicional If en VBA

Con la instrucción If then en VBA podremos decidir si ejecutar o no una instrucción.

Esto nos permite pasar de ejecutar linealmente cada línea de código a poder saltarnos algunas dependiendo de si se cumple la condición evaluada o no.



Este es el código del ejemplo de hoy.

a

a


Option Explicit


Sub condicional()

    

    'Declaramos una variable numerica

    Dim numeroSecreto As Integer

    Dim respuesta As Integer

        

    'asignamos un valor por error a una variable con otro nombre

    numeroSecreto = 4

    

    respuesta = InputBox("dime un numero")

    

    If numeroSecreto = respuesta Then

        'mostramos mensaje

        MsgBox ("Has acertado")

    End If

    

    If numeroSecreto <> respuesta Then

        'mostramos mensaje

        MsgBox ("No has acertado")

    End If

End Sub


Solicitamos un número al usuario e introduce un número incorrecto.

Tras la primera comparación, saltamos el primer mensaje.

Y procedemos a comprobar si el mensaje es distinto del valor de la variable.

 If numeroSecreto <> respuesta Then

Como se cumple la condición mostramos el mensaje.


Repetimos la ejecución, pero en este caso el valor es igual al de la variable.


La primera comprobación es correcta.

    If numeroSecreto = respuesta Then

Se muestra el primer mensaje.



Usando condicionales y bucles conseguiremos que nuestras macros puedan parecer tener algo de inteligencia, y podremos automatizar gran cantidad de tareas.

lunes, 20 de diciembre de 2021

Creación de variables de tipo erróneo al usar declaración implícita en VBA para Microsoft Excel

Uno de los peores errores que se pueden producir al usar la declaración implícita de variables es que el entorno de programación defina un tipo de variable distinta de la que el programador piensa que se está usando.

En el ejemplo de hoy se crea una variable de tipo texto cuando se esperaba la creación de una de tipo entero.



Al no obligar a la declaración específica de variables la variabilidad se crea en un momento de que el entorno de programación la detecta y que será sin embargo en este caso como le hemos asignado una cadena de texto la maniobra se crea como si fuese texto.


Esto que en principio no es un problema si tenemos claro que queremos que se valor según texto se puede convertir a un grave problema si creíamos que este valor iba a ser un número.

Imaginemos que la variable se crea cuando recogemos un dato del usuario y a este le hemos preguntado su edad sin usuario en lugar de escribir la con números lo hace con texto habremos general una variable de tipo texto.

Si por el contrario definimos específicamente la variable indicando el tipo de dato que queremos que contenga al crearla, sí amor asignarle otro tipo de dato el entorno de formación mostrará un error.


Este caso se debe aquella variables de tipo entera y hemos intentado indicar un valor de tipo texto.

Para quitarnos los olvidos a la hora de declarar las variables o que se declaren variables debido a errores ortográficos lo mejor es usar la directiva Option Explicit, en todas nuestras macros.

De esta forma siempre estaremos obrigados a definir el tipo de las variables.

domingo, 19 de diciembre de 2021

Forzar declaración explícita de variables en VBA para Microsoft Excel

En los lenguajes de programación existen dos formas de declarar variables.

La declaración explícita exige que sea el programador el que defina el nombre de la variable y el tipo de dato que puede almacenar.

El entorno de programación en caso de detectar el intento de usar una variable no definida generará un error.

Por otra parte existen lenguajes que permiten la declaración implícita de variables.

Esto es cuando el entorno de programación detecta el primer uso de una variable, comprueba qué valor se le ha asignado y crea la variable del tipo correspondiente.

VBA permite los dos modos de funcionamiento.

En VBA existe la instrucción Option Explicit para exigir la declaración explícita de variables.

En caso contrario visual Basic for Applications creará las variables a medida que las vaya encontrando.

Esto puede generar errores debido a fallos tipograficos como el que os mostramos en el ejemplo de hoy.

Siempre es recomendable utilizar la declaración explícita.

Esto nos dará un control total sobre las variables que usamos y el tipo de datos que almacenan.


El código del ejemplo es el siguiente:


Sub declaracionExplicitaVariables()

    

    'Declaramos una variable numerica

    Dim edad As Integer

    

    'asignamos un valor por error a una variable con otro nombre

    edade = 28

    

    'mostramos el valor de la variable declarada

    MsgBox (edad)


End Sub



Declaramos la variable edad

Asignamos el valor 28 a la variable

Mostramos el valor de la variable en pantalla

Ejecutamos la macro

Pero el valor mostrado no es el esperado.

Se muestra 0 cuando debería mostrarse 28.


Exigimos la declaración explícita de variables,

mediante la instrucción Option Explicit.

Y ejecutamos de nuevo la macro.


Ahora se muestra un error de compilación.

No se ha definido la variable.

Parece que se ha cometido un error tipográfico

al escribir el nombre de la variable edad.


Corregimos el error tipográfico.


Mediante copia y pega.


Y volvemos a ejecutar.


Ahora el resultado si es el esperado.




Sin la instrucción Option Explicit

VBA utiliza la definición implícita de variables, creando las variables que no han sido definidas, la primera vez que son usadas.

En este caso existían dos variables

edad con el valor 0

edade con el valor 28

a

sábado, 18 de diciembre de 2021

Escribir en una celda con nombre de Microsoft Excel mediante VBA

En VBA para Microsoft Excel también podemos referirnos a las celdas con el método Range y el nombre de celda que le hayamos asignado en Excel.

Es útil utilizar los nombres de celdas en lugar de las referencias, para referirse a ellas. Especialmente si en la hoja de cálculo es posible que se añadan o eliminen filas, columnas o celdas.


Este es el código que usaremos en el ejemplo de hoy:



Sub escribirEnCeldaConNombre()

    

    'Escribimos en la celda amarillla

    'que originalmente esta en B2

    Range("B2").Value = "Celda Amarilla"

    

    'Escribimos en la celda verde

    'que originalmente esta en B4

    'refiriendonos a ella por el nombre asignado

    Range("celdaVerde").Value = "Celda Verde"

     

End Sub







Insertamos una fila y una columna desplazando las celdas resltadas en color de sus ubicaciones originales.

Y volvemos a ejecutar la macro.

Como resultado el código de la primera línea ya no hace referencia a la celda amarilla mientras que el de la segunda si que haciendo referencia a la celda verde.


En la primera instrucción haremos referencia a la celda mediante la combinación de la letra de la columna y el número de la fila.

Haremos lo mismo en la primera ejecución para la segunda celda.



Comenzamos pintando la celda B2 de amarillo y la celda B4 de verde para tener una referencia visual sobre ellas.

La primera ejecución el código en el cual usamos las referencias de celda para referirnos a ellas vemos que efectivamente podemos escribir los textos correspondientes en cada una de las celdas.



Para la segunda ejecución de la macro haremos una pequeña modificación en la segunda línea del código.

En la segunda instrucción usaremos el nombre que le hemos asignado a la celda.


Asignamos un nombre a la celda B4, que tenemos pintada de color verde.



La nueva ejecución produce el mismo resultado que la anterior.

Demuestra que en VBA es posible referirse a las celdas con nombre mediante su propio nombre en vez de hacerlo con la referencia.

Insertamos una fila y una columna desplazando las celdas resltadas en color de sus ubicaciones originales.

Y volvemos a ejecutar la macro.



Como resultado el código de la primera línea ya no hace referencia a la celda amarilla mientras que el de la segunda si que haciendo referencia a la celda verde.



Esta forma de referirnos a las cerdas en v va nos va a permitir mantener la referencia a la cerda a pesar de insertar o eliminar filas o columnas.

Es muy útil para usarlo cuando no está definido totalmente el formato de la hoja en la que vamos a trabajar.

viernes, 17 de diciembre de 2021

Escribir en una celda de Microsoft Excel mediante VBA

Hoy muestro dos formas de escribir en las celdas de una hoja de cálculo de Microsoft Excel mediante VBA.

Ambas instrucciones nos permiten escribir en la celda deseada.


Range("A1").Value

Permite acceder mediante la notación típica de Microsoft Excel


Cells(2, 1).Value

Requiere indicar el número de fila y columna, lo que será útil a la hora de recorrer conjuntos de celdas mediante bucles.



Este es el código del ejemplo de hoy:


Sub escribirEnCelda()


    'Declaracion de Variables

    Dim variableTexto As String

    

    variableTexto = "Hola Mundo en Excel."

    

    'Con Range podemos obtener un rango del tamaño de una celda

    'mediante esta forma podemos acceder a la celda

    'usando su nomenclatura habirual en excel

    Range("A1").Value = variableTexto

    

    'tambien podemos usa Cells, que en realidad nos devuelve un Range

    'con este metodo deberemos indicar el numero de fila y columna

    'es un buen metodo para usar en bucles

    Cells(2, 1).Value = variableTexto

     

End Sub



Aquí vemos como al finalizar la ejecución del código, las celdas A1 y A2 de Excel contienen el mismo texto.


Vemos el resultado más de cerca.

La función Range requiere al menos un parámetro de tipo celda, esto se puede hacer indicando el nombre de la celda mediante una cadena de texto.

Sin embargo, a la función Cells se le indica el número de fila y el número de columna.

Ambas funciones permiten llegar al mismo resultado.

Ojo. La función Cells sin indicar ningún parámetro, hace referencia a todas las celdas de una hoja.