miércoles, 7 de septiembre de 2016

Introducción de Macros

¿Que es una macro ?.
Una macro son un conjunto de instrucciones que sirven para automatizar procesos. Refiriéndonos a excel, supongamos que realizamos frecuentemente la acción de seleccionar un rango para aplicarle negrita, cambio de fuente y centrado. En lugar de hacer estas acciones manualmente, se puede elaborar una macro e invocarla para que ejecute los tres procesos automáticamente.

Objetos, propiedades y métodos.
A la hora de trabajar con macros en excel, deben tenerse claros ciertos conceptos de lo que se llama
programación orientada a objetos (OOP). No nos extenderemos demasiado sobre la OOP, pero si definiremos a continuación los conceptos de Objeto, Propiedades y Métodos.

Objeto.
Cuando en el mundo real nos referimos a objeto significa que hablamos de algo más o menos abstracto que puede ser cualquier cosa. Si decidimos concretar un poco más podemos referirnos a objetos coche, objetos silla, objetos casa, etc. En OOP, la generalización (o definición) de un objeto se llama Clase, así la clase coche seria como la representante de todos los coches del mundo, mientras que un objeto coche seria un coche en concreto. De momento, no definiremos ni estudiaremos las clases sino que nos concentraremos en los objetos, tenga en cuenta pero que cualquier objeto está definido por una clase.
Cuando decimos que la clase coche representa a todos los coches del mundo significa que define como es un coche, cualquier coche. Dicho de otra forma y para aproximarnos a la definición informática, la clase coche define algo que tiene cuatro ruedas, un motor, un chasis,... entonces, cualquier objeto real de cuatro ruedas, un motor, un chasis,... es un objeto de la clase coche.

Propiedades.
Cualquier objeto tiene características o propiedades como por ejemplo el color, la forma, peso, medidas, etc. Estas propiedades se definen en la clase y luego se particularizan en cada objeto. Así, en la clase coche se podrían definir las propiedades Color, Ancho y Largo , luego al definir un objeto concreto como coche ya se particularizarían estas propiedades a, por ejemplo, Color = Rojo, Ancho = 2 metros y Largo = 3,5 metros.

Métodos.
La mayoría de objetos tienen comportamientos o realizan acciones, por ejemplo, una acción evidente de un objeto coche es el de moverse o lo que es lo mismo, trasladarse de un punto inicial a un punto final.
Cualquier proceso que implica una acción o pauta de comportamiento por parte de un objeto se define en su clase para que luego pueda manifestarse en cualquiera de sus objetos. Así, en la clase coche se definirían en el método mover todos los procesos necesarios para llevarlo a cabo (los procesos para desplazar de un punto inicial a un punto final), luego cada objeto de la clase coche simplemente tendría que invocar este método para trasladarse de un punto inicial a un punto final, cualesquiera que fueran esos puntos.
Repasemos a continuación todos estos conceptos pero ahora desde el punto de vista de algunos de los
objetos que nos encontraremos en Excel como WorkSheet (Objeto hoja de cálculo) o Range (Objeto casilla o rango de casillas).
Un objeto Range está definido por una clase donde se definen sus propiedades, recordemos que una propiedad es una característica, modificable o no, de un objeto. Entre las propiedades de un objeto Range están Value , que contiene el valor de la casilla , Column y Row que contienen respectivamente la fila y la columna de la casilla, Font que contiene la fuente de los caracteres que muestra la casilla, etc.

Range, como objeto, también tiene métodos, recordemos que los métodos sirven llevar a cabo una acción sobre un objeto. Por ejemplo el método Activate, hace activa una celda determinada, Clear, borra el contenido de una celda o rango de celdas, Copy, copia el contenido de la celda o rango de celdas en el portapapeles,...

Conjuntos.
Una conjunto es una colección de objetos del mismo tipo, para los que conozcan algún lenguaje de programación es un array de objetos. Por ejemplo, dentro de un libro de trabajo puede existir más de una hoja (WorkSheet), todas las hojas de un libro de trabajo forman un conjunto, el conjunto WorkSheets.
Cada elemento individual de un conjunto se referencia por un índice, de esta forma, la primera, segunda y tercera hoja de un libro de trabajo, se referenciarán por WorkSheets(1), WorkSheets(2) y WorkSheets(3).

Objetos de Objetos.
Es muy habitual que una propiedad de un objeto sea otro objeto. Siguiendo con el coche, una de las propiedades del coche es el motor, y el motor es un objeto con propiedades como cubicaje, caballos, número de válvulas, etc. y métodos, como aumentar_revoluciones, coger_combustible, mover_pistones, etc.
En Excel, el objeto WorkSheets tiene la propiedad Range que es un objeto, Range tiene la propiedad Font que es también un objeto y Font tiene la propiedad Bold (negrita). Tenga esto muy presente ya que utilizaremos frecuentemente Propiedades de un objeto que serán también Objetos. Dicho de otra forma, hay propiedades que devuelven objetos, por ejemplo, la propiedad Range de un objeto WorkSheet devuelve un objeto de tipo Range.

Programación Orientada a Objetos o Programación Basada en Objetos.
Hay una sutil diferencia entre las definiciones del título. Programación orientada a Objetos, significa que el programador trabaja con objetos fabricados por él mismo, es decir, el programador es quien implementa las clases para luego crear objetos a partir de ellas. Lo que haremos nosotros, por el momento, será utilizar objetos ya definidos por la aplicación Excel (WorkSheets, Range,...) sin implementar ninguno de nuevo, por lo que en nuestro caso es más correcto hablar de programación basada en objetos. Observe que esta es una de las grandes ventajas de la OOP, utilizar objetos definidos por alguien sin tener que conocer nada sobre su implementación, sólo debemos conocer sus propiedades y métodos y utilizarlos de forma correcta.

Editor de Visual Basic.
El editor de visual básic es la aplicación que utilizaremos para construir las macros que interactuaran
junto con los libros de trabajo. A continuación prepararemos un archivo en el que escribiremos las
primeras instrucciones en Visual basic.
Preparar un archivo nuevo.
Para entrar en el editor de Visual Basic, ejecute los pasos siguientes.
1. Active opción Herramientas/ Macro/ Editor de Visual Básic. Se abrirá la ventana siguiente. 


Maximize la ventana para trabajar más cómodamente y procure tener activadas la ventana Explorador de proyectos y la ventana Propiedades (Ver/ Explorador de proyectos y Ver/ Ventana propiedades).

Insertar un nuevo módulo.
Un módulo sirve para agrupar procedimientos y funciones. El procedimiento y la función son entidades de programación que sirven para agrupar instrucciones de código que realizan una acción concreta.
Para insertar un módulo active opción del menú Insertar/ Módulo. Se activará una nueva ventana, si
aparece demasiado pequeña, maximícela.

Insertar un procedimiento.
Ya hemos dicho que un procedimiento es un bloque de instrucciones de código que sirven para llevar a cabo alguna tarea específica. Un procedimiento empieza siempre con la instrucción
   
            SubNombre_Procedimiento

Y termina con la instrucción

           End Sub.

A continuación crearemos un procedimiento para poner el texto "Hola" en la casilla A1.

Ejemplo 1

           Sub Primero
                   Range("A1").Value = "Hola"
           End Sub


Observe el código.

          Range("A1").Value="Hola"

En esta línea estamos indicando que trabajamos con un objeto Range. Para indicarle que nos referimos a la casilla A1, encerramos entre paréntesis esta referencia (más adelante verá otra forma de referirnos a las casillas). De este objeto, indicamos que queremos establecer un nuevo valor para la propiedad Value,
observe que para separar el objeto de su propiedad utilizamos la notación punto.
Recuerde que el conjunto Range es un objeto que pende del objeto WorkSheets, así por ejemplo el siguiente código haría lo mismo que el anterior.

                        WorkSheets(1).Range("A1").Value = "Hola"

Bueno, de hecho no hace lo mismo, en la primera opción, el texto "Hola" se pone dentro de la casilla A1 de la hoja activa, mientras que en el segundo es en la casilla A1 de primera hoja ( del conjunto de hojas).
La segunda notación es más larga, pero también más recomendable ya que se especifican todos los objetos. En muchas ocasiones se pueden omitir algunos objetos precedentes, no le aconsejamos hacerlo, sus programas perderán claridad y concisión.
Si desea hacer referencia a la hoja activa puede utilizar ActiveSheet, así, el primer ejemplo lo dejaremos de la manera siguiente.

                      Sub Primero
                              ActiveSheet.Range("A1").Value = "Hola"
                      End Sub


Si desea poner "Hola" (o cualquier valor) en la casilla activa, puede utilizar la propiedad (objeto) Activecell de WorkSheets. Así para poner "Hola" en la casilla activa de la hoja activa seria,


                     Sub Primero
                            ActiveSheet.ActiveCell.Value = "Hola"
                     End Sub

Para terminar con este primer ejemplo. WorkSheets están dentro del Objeto WorkBooks (libros de trabajo) y WorkBooks están dentro de Application. Application es el objeto superior, es el que representa la aplicación Excel. Así, el primer ejemplo, siguiendo toda la jerarquía de objetos quedaría de la forma siguiente.

                      Sub Primero
                              Application.WorkBooks(1).WorkSheets(1).Range("A1").Value = "Hola"
                      End Sub

Insistiendo con la nomenclatura, Application casi nunca es necesario especificarlo, piense que todos los objetos penden de este, WorkBooks será necesario implementarlo si en las macros se trabaja con diferentes libros de trabajo (diferentes archivos), a partir de WorkSheets, es aconsejable incluirlo en el código, sobre todo si se quiere trabajar con diferentes hojas, verá, sin embargo, que en muchas ocasiones no se aplica

Ejecutar un procedimiento o función.
Pruebe ejecutar el primer procedimiento de ejemplo.
1. Sitúe el cursor dentro del procedimiento.
2. Active opción de la barra de menús Ejecutar/ Ejecutar Sub Userform. También puede hacer clic
sobre el botón 




o pulsar la tecla F5.

Para ejecutar el procedimiento desde la hoja de cálculo.
Debe estar en una hoja, no en el editor de Visual Basic
1. Active opción de la barra de menús Herramientas/ Macro/ Macros. Se despliega una ventana que
muestra una lista donde estás todas las macros incluidas en el libro de trabajo.
2. Seleccione la macro de la lista y pulse sobre el botón Ejecutar.


Ejemplo 2
En este segundo ejemplo simplemente ampliaremos la funcionalidad de la macro del ejemplo 1. Además de escribir "Hola" en la casilla A1 de la celda A1, la pondremos en negrita y le daremos color al texto.
Para ello utilizaremos las propiedades Bold y Color del objeto Font.
            Sub Segundo
                    ActiveSheet.Range("A1").Value = "Hola"
                    ActiveSheet.Range("A1").Font.Bold = True
                    ActiveSheet.Range("A1").Font.Color = RGB(255,0,0)
            End Sub

True.
True, que traducido es verdadero, simplemente indica que la propiedad Bold está activada. Si se deseara desactivar, bastaría con igualarla al valor False.

La función RGB.
Observe que para establecer el color de la propiedad se utiliza la función RGB(Red, Green, Blue), los
tres argumentos para esta función son valores del 0 a 255 que corresponden a la intensidad de los colores Rojo, Verde y Azul respectivamente.

Referenciar un rango de celdas.
Sólo tiene que cambiar a la forma Casilla_Inicial:Casilla_Final. Por ejemplo aplicar el último ejemplo al rango de casillas que va de la A1 a la A8, ponga.

           Sub Segundo
                  ActiveSheet.Range("A1:A8").Value = "Hola"
                  ActiveSheet.Range("A1:A8").Font.Bold = True
                  ActiveSheet.Range("A1:A8").Font.Color = RGB(255,0,0)
           End Sub


Variables.
A continuación vamos a repetir el programa Ejemplo1, pero en lugar de poner "Hola" en la casilla A1 de la hoja activa, dejaremos que el usuario entre un texto desde teclado y a continuación guardaremos ese valor en esa casilla. Observe que el valor que entre del usuario debe guardarse en algún lugar para poder ponerlo después en la casilla A1; pues bien, ese valor se guardará en una variable. Una variable es simplemente un trozo de memoria que la función o procedimineto se reserva para guardar datos, la forma general de declarar una variable es


DIM variable AS tipo.

Siendo variable el nombre que se asigna a la misma y Tipo el tipo de datos que se guardarán (números, texto, fecha, boleanos,...). En nuestro ejemplo, declararemos la variable de tipo String (tipo texto), y lo haremos de la forma siguiente.

Dim Texto As String

Con esto estamos indicando que se reserve un trozo de memoria (el que sea) , que se llama Texto y que el tipo de datos que se guardarán ahí serán caracteres.

La Función InputBox.

Esta función muestra una ventana para que el usuario pueda teclear datos. Cuando se pulsa sobre Aceptar, los datos entrados pasan a la variable a la que se ha igualado la función. Vea la línea siguiente.

Texto = InputBox("Introduzca el texto", "Entrada de datos").

Si en la ventana que muestra InputBox pulsa sobre el botón Aceptar, los datos tecleados se guardarán el la variable Texto.

Sintaxis de InputBox.

InputBox(Mensaje, Título, Valor por defecto, Posición horizontal, Posición Vertical, Archivo
ayuda, Número de contexto para la ayuda).

Mensaje : Es el mensaje que se muestra en la ventana. Si desea poner más de una línea ponga
Chr(13) para cada nueva línea, vea el ejemplo siguiente.

Título : Es el título para la ventana InputBox. Es un parámetro opcional.
Valor por defecto: Es el valor que mostrará por defecto el cuadro donde el usuario entra el valor.
Parámetro opcional.

Posición Horizontal: La posición X de la pantalla donde se mostrará el cuadro, concretamente es
la posición para la parte izquierda. Si se omite el cuadro se presenta horizontalmente centrado a
la pantalla.

Posición Vertical: La posición Y de la pantalla donde se mostrará el cuadro, concretamente es la
posición para la parte superior. Si se omite el cuadro se presenta verticalmente centrado a la pantalla.

Archivo Ayuda: Es el archivo que contiene la ayuda para el cuadro. Parámetro opcional.

Número de contexto para la ayuda: Número asignado que corresponde al identificador del archivo de ayuda, sirve para localizar el texto que se debe mostrar. Si se especifica este parámetro, debe especificarse obligatoriamente el parámetro Archivo Ayuda.