martes, 26 de marzo de 2013

Declaración de variables en VBA para Excel (II)


Si el lector ya está familiarizado con el concepto de variable en el primer artículo de la serie ¿Qué es una variable en VBA para Excel?  y también ha entendido el artículo Declaración de variables en VBA para Excel (I) , podría disponerse a leer este artículo que a buen seguro, le resultará interesante.

En el anterior post hablábamos de variables que representaban a valores (ya sean fechas, números enteros, decimales, etc.). En este artículo veremos las variables que representan a objetos (debemos saber que en VBA llamamos objetos a cualquier elemento de Excel como hojas, celdas, gráficos, formas, tablas, etc.).



Declarar variables de objeto está, si cabe, más justificado que declarar variables de valores, puesto que el ahorro en tiempo de escritura de código, en tiempo de ejecución del mismo, así como la organización y orden conseguidos en la estructura del procedimiento o macro, son espectaculares.

¿Cómo declarar una variable de objeto?

La declaración de una variable de objeto sería:

Dim Variable As TipoObjeto

Que significa:

Establecer Variable como TipoDeObjeto

Una vez declarada la variable, se le puede asignar un tipo de objeto, pero en este caso (a diferencia de las variables asignadas a valores) debemos comenzar la línea con la palabra Set , como en esta macro:

Sub VariableObjeto()

     Dim MiCelda As Range

     Set MiCelda = Worksheets("Hoja1").Range("A1")

     MiCelda.Value = 4560
     MiCelda.Interior.Color = RGB(166, 210, 241)
     MiCelda.Font.Italic = True
     MiCelda.Font.Bold = True

End Sub

La macro anterior declara la variable "MiCelda" como un rango, después asigna la variable a la celda A1 y posteriormente (en las últimas líneas) realiza varias acciones con la celda, nombrándola en todas las líneas siempre con el nombre de variable declarado al principio (en una línea inserta el valor 4560, en otra línea proporciona el color azul claro, en otra aplica cursiva y en la última aplica negrita).

Si no hubiéramos utilizado una variable de objeto , el código de las 3 líneas que modifican la celda A1 podría  haber sido así de largo:

Sub VariableObjeto()

     Worksheets("Hoja1").Range("A1")4560
     Worksheets("Hoja1").Range("A1").Interior.Color = RGB(166, 210, 241)
     Worksheets("Hoja1").Range("A1").Font.Italic = True
     Worksheets("Hoja1").Range("A1").Font.Bold= True

End Sub

El primer código se ejecuta de forma más rápida que este último, porque Visual Basic no tiene que buscar una y otra vez la ruta de la celda A1. Aunque aun podríamos perfeccionarlo (en cuanto a eficiencia) de la siguiente forma:

Sub VariableObjeto()

     Dim MiCelda As Range

     Set MiCelda = Worksheets("Hoja1").Range("A1")

     With MiCelda

          .Value = 4560
          .Interior.Color = RGB(166, 210, 241)
          .Font.Italic = True
          .Font.Bold = True

     End With

End Sub

Siendo este el código más corto y rápido de todos.

¿Qué tipos de objetos pueden establecerse como variables?

En el ejemplo anterior, el tipo de objeto era Range, puesto que se quería asignar la variable a una celda. También sería Range si quisiéramos asignarla a columnas, filas, etc.

En el caso de querer asignar variables a un tipo de objeto "Hoja", deberíamos poner Worksheet . Otro ejemplo podría ser ListObject para referirnos a objetos tipo "Tabla de Excel". El usuario puede elegir el tipo de objeto al que refererirse en la lista que el editor de VBA ofrece mientras se escribre:


Otras utilidades

Declarar variables de objeto no sirve únicamente para acortar el código y hacerlo más eficiente, un ejemplo lo tenemos en el siguiente código, que utiliza una variable de objeto para que Excel vaya recorriendo una serie de hojas hasta que encuentra una que se llama "HojaClave" y la seleccione.

Sub VariableObjeto()

     Dim MiHoja As Worksheet

     For Each MiHoja In Worksheets

          If MiHoja.Name = "HojaClave" Then
               MiHoja.Select
          End If

     Next MiHoja

End Sub

Después de declarar la variable de objeto, utilizamos un bucle For Each - Next y dentro de él, utilizamos un condicional If - End If. Declarar una variable nos ha evitado tener que nombrar mediante código cada una de todas las hojas que tengamos para buscar la que deseamos.

Si tradujéramos el código a lenguaje castellano, sería:

Iniciamos Subrutina VariableObjeto()

     Establezco MiHoja como TipoDeObjetoHojaDeExcel

     Por Cada MiHoja En LaColecciónDeHojasDeMiLibro

          Si MiHoja.Nombre = "HojaClave" Entonces
               MiHoja.Seleccionada
          FinalDelCondicionalSI

     ExaminarSiguiente MiHoja

End Sub


Recorrer hojas o celdas en busca de una que cumpla con una condición, es una de las utilidades mayores de la declaración de variables de objeto, puesto que permite utilizarse con bucles y condicionales que detectan si se cumple la condición que queremos y pueden actuar.

Si desea llevar a la práctica todo lo que le hemos ofrecido en este artículo, puede asistir a nuestros cursos prácticos de Excel o puede solicitarlos in company:








Declaración de variables en VBA para Excel (I)


Es conveniente leer el artículo ¿Qué es una variable en VBA para Excel? antes de abordar el actual, especialmente si el lector no conoce qué es una variable.

Una vez que nos decidimos a utilizar una variable en nuestro código VBA de Excel, aunque no es obligatorio, lo ortodoxo es declararla previamente. Esto es, decirle a Excel de forma explícita que la vamos a utilizar.

¿Cómo declarar una variable?

La forma por medio de la cual se declara una variable depende de varios factores. Uno de ellos es dónde la vamos a utilizar posteriormente (sólo en la macro actual o en otras macros). De momento nos vamos a referir a variables que se utilizan en una misma macro. Es decir, su vida y su ámbito de actuación es lo que tarda una macro en ejecutarse.

Una declaración de variable sería:

Dim Ventas As Double

Que significa:

Establecer Ventas como VariableTipoNúmeroDecimalDoble

Una vez declarada, la variable se puede utilizar asignándole previamente un valor, como en esta macro:

Sub Variable()



    Dim Ventas As Double



    Ventas = Hoja2.Range("A1").Value

    MsgBox ("Las ventas mensuales han sido " & Ventas * 0.03)
    Range("A2") = Ventas * 0.03
    MsgBox ("El promedio de ventas diarias ha sido de " & Ventas / 20)
    Range("A3") = Ventas / 20

End Sub


¿Qué tipos de datos puede representar una variable?


En el ejemplo anterior, era Double (tipo decimal que puede albergar valores con deimales desde +/- 5E-324 hasta 1.8E308 y nos ocupará 8 bytes en la memoria de nuestro ordenador) , pero por supuesto, existen otros que ocupan más o menos memoria y que tienen distintas características y posibilidades. Podemos ver un resumen en la web msdn de Microsoft.

¿Cómo declarar varias variables?

Podemos utilizar tres métodos:
  • El "extendido" sería declarar cada una de las variables en una línea. Por ejemplo:
          Dim J As Variant
          Dim H as Long
          Dim N as Integer
  •  El "comprimido" sería declarar todas las variables a la vez en una línea de código:
          Dim J As Variant, H As Long, N As Integer
  • Con "signos", que sería sustituir "As XXXX" por un signo. Por ejemplo:
          Dim MiVariable$   (declara MiVariable como una variable de tipo String (texto)
 
 

¿Por qué declarar variables?

Si no es obligatorio declarar variables, ¿por qué hacerlo?

La ortodoxia en programación dice que las variables hay que declararlas, al igual que la ortodoxia en la creación de gráficos dice que es necesaria una leyenda para identificar las categorías representadas, al igual que la ortodoxia dice que nuestro hogar debe estar ordenado para vivir de forma más cómoda y eficiente.

Si declaramos las variables:
  • Ocuparán menos espacio en memoria, que si no las declaramos (por defecto, Visual Basic asignaría el tipo variant que ocupa bastante memoria: 22 bits).
  • Nuestra macro será difícil de interpretar para otros usuarios que puedan necesitar leer el código VBA (incluso para nosotros mismos). Tener al principio de la macro una lista con las variables declaradas resulta muy util y aclarador.
  • Podríamos utilizar esa variable posteriormente en varias macros. En este caso, la forma de declarar la variable no es exactamente igual, sino que la línea  Dim Variable As TipoDato se debe colocar al principio de todo el módulo para que el ámbito de la variable sea precisamente de módulo y no a nivel de una macro concreta (ámbito local a nivel procedimiento):

Está claro que si nuestra macro es muy pequeña y de uso totalmente particular quizá no sea necesaria la declaración de variables.

Por último, decir que podemos hacer que el editor de VBA nos obligue a declarar las variables para evitar olvidos. Esto se hace desde el menú "Herramientas" y después seleccionando "Opciones..." y por último activar la siguiente casilla:


Una vez hecho esto y a partir de ahora, veremos esto al principio de cada módulo que inciemos:


... y no funcionará cualquier variable que no haya sido declarada antes.

En el siguiente artículo veremos la posibilidad y la forma de declarar variables objeto. Hasta ahora, las variables a las que nos hemos referido albergan valores (de un tipo u otro, pero valores), pero también las variables pueden representar a objetos.... como por ejemplo, celdas, hojas, etc. Veremos que en ocasiones son muy útiles las variables de objeto:


Si desea llevar a la práctica todo lo que le hemos ofrecido en este artículo, puede asistir a nuestros cursos prácticos de Excel o puede solicitarlos in company:








lunes, 25 de marzo de 2013

¿Qué es una variable en VBA para Excel?


Iniciamos con este artículo una serie dedicada a las variables en Visual Basic for Applications (VBA) para Excel.

¿Qué es una variable?

En el ámbito de la programación en VBA, una variable es un nombre que hace las funciones de contenedor polivalente que puede albergar distintos valores o datos. De similar forma, en una ecuación todos sabemos que una X también hace las veces de contenedor que en un momento dado puede tener un valor, pero en otro momento o circunstancia puede tener otro distinto.


Si queremos expresar la comisión que obtendrá un comercial (3%) en función de las ventas de pares de zapatos que hay en una empresa, podríamos hacerlo así:

(Nº de pares de zapatos * 20 €)  * 0,03 = Comisión

Pero si, por ejemplo, en un contrato o cualquier otro documento, repetidas veces debemos reflejar y dejar claro cómo se calcula la comisión del comercial sería mucho más eficiente representar el cálculo de las Ventas por una sola palabra... así:

Ventas*0,03 = Comisión

De esta última forma ahorramos tinta, papel,  tiempo de escritura y tiempo de lectura. Además, reducimos considerablemente el riesgo de faltas de ortografía y de olvidar el precio de venta por par de zapatos. Acabamos de utilizar la variable Ventas.

Cuando estamos programando en Visual Basic ocurre lo mismo que en el ejemplo anterior. A veces necesitamos utilizar repetidas veces un valor que puede variar en algún momento dado y es conveniente asignarle un nombre que lo represente y que sea fácil recordar. Por ejemplo:

Ventas = WorkSheets("Hoja1").Range("A1").Value

Con la creación de la variable Ventas, cada vez que tengamos que hacer referencia e ella en nuestra macro o procedimiento, sólo tenemos que poner Ventas en vez de  WorkSheets("Hoja1").Range("A1").Value

Un ejemplo de utilización


Sub Variable()

    Ventas = Hoja2.Range("A1").Value

    MsgBox ("Las ventas mensuales han sido " & Ventas * 0.03)
    Range("A2") = Ventas * 0.03
    MsgBox ("El promedio de ventas diarias ha sido de " & Ventas / 20)
    Range("A3") = Ventas / 20

End Sub


... en vez de haber escrito todo este código:


Sub SinVariable()

    MsgBox ("Las ventas mensuales han sido " & Hoja2.Range("A1").Value * 0.03)
    Range("A2") = Hoja2.Range("A1").Value * 0.03
    MsgBox ("El promedio de ventas diarias ha sido de " & Hoja2.Range("A1").Value / 20)
    Range("A3") = Hoja2.Range("A1").Value / 20

End Sub


... que es más ineficiente por ser más largo (más difícil de interpretar, lento al ejecutarlo, susceptible de errores al escribirlo, etc.).

Declaración de variables (introducción)

Una vez dicho todo esto, debemos añadir que Excel interpreta de forma inteligente el tipo de variable a la que nos estamos refiriendo. Es decir, en los ejemplos anteriores la variable se refería a valores numéricos, pero en otros casos pueden ser textos, fechas, etc.

Ese "reconocimiento inteligente" que hace Excel del tipo de variable, requiere la utilización de más memoria de nuestro ordenador (debido a que asigna por defecto un tipo de variable-comodín llamado "variant"y por lo tanto es conveniente facilitarle las cosas indicándolo nosotros en lo que se llama una "declaración de variable".

Haciendo una analogía en otros ámbitos, cuando tenemos que interpretar un gráfico que tiene varias series o categorías, suele existir una leyenda que identifica cada serie con el tipo de gráfico. Pues esa leyenda sería la "declaración de series" similar a una declaración de variables en VBA.


En el próximo artículo trataremos más a fondo el tema de la declaración de variables y por qué realizarla.

Declaración de variables en VBA para Excel (I)
Declaración de variables en VBA para Excel (II)
Declaración de variables en VBA para Excel (III)

Si desea llevar a la práctica todo lo que le hemos ofrecido en este artículo, puede asistir a nuestros cursos prácticos de Excel o puede solicitarlos in company:








Advertencia de seguridad de macros deshabilitadas en Excel


A casi todos los usuarios de Excel nos ha aparecido alguna vez en la parte superior de la pantalla una franja de "Advertencia de seguridad" diciendo que "Las macros se han deshabilitado" y con un botón que nos da acceso a "Habilitar contenido", ya sea directamente (como en Excel 2010 y 2013):


... o mediante un cuadro de "Opciones", como en Excel 2007:



Algunas nociones previas

Antes que nada y para aquellos que no han utilizado nunca macros, definimos qué es una macro de Excel y proporcionamos algunas nociones:

Macro (del griego μακρο que significa "grande") es la abreviatura de "macroinstrucción" y es una serie ordenada de instrucciones escritas en un lenguaje de programación llamado VBA (Visual Basic for Applications), que se ejecutan cuando el usuario lo decide o cuando ocurre algo (evento) durante la utilización de Excel.

Las instrucciones escritas en una macro pueden ser acciones que cotidianamente hacemos en Excel desde la interfaz de usuario (u otras que sólo pueden ocurrir mediante una macro) como seleccionar una hoja, eliminar filas o columnas, seleccionar una celda, etc.

A la hora de hacer una macro, disponemos de 3 posibilidades, según tengamos más o menos conocimientos en la materia:
  • Escribir las instrucciones directamente (si conocemos el lenguaje VBA) en un programa ad-hoc llamado "Editor de VBA" y al que se puede acceder desde Excel. Posteriormente y cuando lo deseemos, ejecutaremos la macro para que se reproduzcan las acciones que representan las instrucciones.
  • De forma inversa a la anterior, podríamos realizar las acciones que nosotros queremos grabándolas para que Excel las convierta en lenguaje VBA. Una vez grabadas y convertidas a Visual Basic, podremos ejecutarlas cuando queramos.
  • La tercera opción es una mezcla de las dos anteriores. Es decir, se graban las acciones para que queden registradas en una macro y después modificamos el código resultante para "enriquecerlo" con instrucciones más personalizadas.
Las macros quedan asociadas y almacenadas en el archivo de Excel con el que se grabaron. Los archivos que contienen macros tienen la extensión .xlsm  en vez de  .xlsx (hablamos siempre de versiones superiores a Excel 2003).

Advertencia de seguridad. Las macros se han deshabilitado.

Por defecto, Microsoft Excel está configurado de tal forma que si intentamos abrir un archivo que contiene macros grabadas, recibimos unos avisos como los de las imágenes del principio de este artículo. El motivo es preservar la seguridad, puesto que en teoría (aunque de forma bastante improbable) alguien podría enviarnos un archivo de Excel con macros que contengan instrucciones malintencionadas o en forma de virus. Puesto que hay posibilidad de que una macro se ejecute automáticamente al abrir el archivo, la configuración inicial de Excel deja deshabilitadas las macros.

Ante esto, tenemos dos posibilidades:
  • Habilitamos las macros desde la "Advertencia de seguridad" que nos ofrece Excel al abrir el archivo (ver las imágenes del principio del artículo para las versiones 2007, 2010 y 2013). En este caso se habilitan sólo para el archivo en cuestión.
  • Habilitamos las macros haciendo click en "Opciones de Excel" / "Configuración del centro de confianza" / Configuración de macros



Esta última opción hace que Excel acepte en adelante y sin advertencias todos los archivos que tienen macros.

Otras opciones de seguridad

Evitar la "Advertencia de seguridad"

Tenemos la posibilidad de no recibir advertencias de seguridad como las de las imágenes del principio de este post. Para ello y, dentro del "Centro de confianza", activamos la siguiente casilla:


aunque si las macros están deshabilitadas, no funcionarán. Tan sólo evitaríamos la advertencias.

Documentos confiables en Excel 2010 y 2013

En estas versiones, cuando hacemos click en el botón "Habilitar macros" de la "Advertencia de segurdad", Excel memoriza nuestra "benevolencia" y en adelante el archivo será considerado como "confiable" siempre que tengamos la siguiente configuración en la categoría "Documentos confiables" del "Centro de confianza":


Vista protegida en Excel 2010

Cuando descargamos una hoja de cálculo que iba adjunta en un e-mail, o bien un archivo descargado de internet, es detectado por Excel 2010 como potencialmente peligroso y se abre en modo "Vista protegida" siempre que tengamos la siguiente configuración en la categoría "Vista protegida" del "Centro de confianza":



Si desea llevar a la práctica todo lo que le hemos ofrecido en este artículo, puede asistir a nuestros cursos prácticos de Excel o puede solicitarlos in company: