miércoles, 7 de septiembre de 2016

Temario







Macros y Visual Basic para aplicaciones

Descripción​: El desarrollo de macros en excel, es una herramienta poco implementada por su desconocimiento, pero ideal para el manejo de tareas repetitivas y la creación de herramientas personalizadas de excel. Automatiza con las macros aquellas tareas que desarrolla diariamente y deje que excel con un clic haga por usted aquellas tareas u operaciones rutinarias. La capacitación puede ser dictada en Excel 2003, 2007 o 2010.

Dirigido a​: Usuario habituales y permanentes de Excel que quieran aprender a automatizar tareas y cálculos, automatización de informes, desarrollo de funciones personalizadas, recolección de datos y desarrollo de pequeñas aplicaciones

Prerrequisitos​: Manejo y conocimientos de nivel medio en Excel, Manejo básico de Windows.

Contenido

● Grabar macros

● Sintaxis básica macro

● Creación de parámetros

● Información desde celda, Inputbox, cuadros de texto

● Códigos condicionales de Visual Basic

● Repaso general

● Ejercicio particular cada alumno según su necesidad

Ejercicio de Diagnostico

Para acceder descarguelo AQUÍ

Tutorial de Visual Basic

Para Acceder presionar AQUI

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.


Instrucciones en VBA para Excel


Algunos de las instrucciones o comandos en Visual Basic para Excel más utilizados en programación de VBA son los que veremos a continuación:

Activar una hoja en Visual Basic para Excel: para ir a una hoja de cálculo de Excel utilizaremos el siguiente comando en VBA Shetts (“Hoja”).Select

Convertir texto en un número en Excel: si queremos convertir el texto a un valor numércio usaremos la función val(TextoAConvertirNumero)

Abrir un formulario en Excel con VBA: para abrir un formulario usaremos la siguiente instrucción NombredelFormulario.show

Mostrar un mensaje con Visual Basic: si queremos mostrar un mensaje al usuario usaremos el comando MsgBox “mensaje entre comillas”

Escribir en una celda de Excel: para escribir en una celda de Excel realizaremos la instrucción Activecell, el nombre de la fórmula y el texto que deseamos insertar en la celda.

Poner negrita en Visual Basic para Excel: la negrita se podrá utilizar en Visual Basic gracias al comando Selection.FontBold=True

Letra cursiva en Excel con VB: la cursiva la utilizaremos con la instrucción Selection.Font.Underline=True

Alinear el texto a la izquierda y derecha: para alinear el texto a la izquierda emplearemos los siguientes comandos, siendo necesario cambiar el xlLeft por xlRight si queremos alinear el texto a la derecha:

With Selection

.HorizontalAlignment=xlLeft

End With

Visual Basic

Visual Basic para aplicaciones es una combinación de un entorno de programación integrado denominado Editor de Visual Basic y del lenguaje de programación Visual Basic, permitiendo diseñar y desarrollar con facilidad programas en Visual Basic. El término “para aplicaciones” hace referencia al hecho de que el lenguaje de programación y las herramientas de desarrollo están integrados con las aplicaciones del Microsoft Office (en este caso, el Microsoft Excel), de forma que se puedan desarrollar nuevas funcionalidades y soluciones a medida, con el uso de estas aplicaciones.

El Editor de Visual Basic contiene todas las herramientas de programación necesarias para escribir código en Visual Basic y crear soluciones personalizadas.

Este Editor, es una ventana independiente de Microsoft Excel, pero tiene el mismo aspecto que cualquier otra ventana de una aplicación Microsoft Office, y funciona igual para todas estas aplicaciones. Cuando se cierre la aplicación, consecuentemente también se cerrará la ventana del Editor de Visual Basic asociada.

Creación de un “botón” que al apretarlo escriba HOLA

Vamos a crear un botón, que al hacer clic sobre él, muestre en la celda A1 la expresión “HOLA”.


Para ello, en primer lugar, se instalará en el documento de Microsoft Excel, el menú Programador (Menú Archivo -> Opciones -> Personalizar cinta de opciones y se selecciona la casilla Programador).


Una vez hecho esto, aparecerá la pestaña Desarrollador desde la que se pueden añadir los botones dentro de la pestaña.

En él se tomará el icono que representa a un botón, desplegándose en la Hoja1, por ejemplo, del documento Excel. De los dos botones que hay (tanto en formularios como en ActiveX), se seleccionará el de Controles de ActiveX, ya que de este modo se podrá cambiar el color y otras opciones del propio botón.


Una vez hecho esto, se pulsará dos veces sobre dicho botón para acceder así al Editor de Visual Basic, con el que se realizará el pequeño programa requerido, tal y como sigue:




Acumulación de “HOLA”’s en la misma celda.


Ahora vamos a cambiar el programa anterior, cambiando una de las líneas de programa, para hacer que cada vez que se haga un clic en el botón, se acumule un nuevo “HOLA” (igual que podría ser cualquier otro valor numérico o cadena de caracteres) al anterior. De esta forma, se identificará el contenido de la primera celda como un contador, acumulándose, en cada clic sobre el botón, una nueva cadena de texto en dicha celda contador.





Acumulación de texto en varias diagonales sucesivas

Continuando el ejemplo anterior, vamos a definir una lista en varias diagonales, en las que se mostrará el texto previamente definido (“BIENVENIDO”). En la nueva versión del programa anterior, se podrá observar cómo utilizar la función “condición” (representada por la función if) y el bucle (mediante la aplicación de la función for, entre otras opciones).
Así, para hacer que la palabra “BIENVENIDO” aparezca colocada siguiendo varias diagonales un número determinado de veces. Se definen, inicialmente, dos variables contador como enteros (función Dim… As Integer), y que representan además los índices de las celdas de la Hoja de Cálculo (filas y columnas). Se define el texto en la primera celda. Seguidamente, se define la condición de que la suma de los índices de celda (variables contadores) sean números pares, con la utilización de la función mod (función resto, dividiendo el número requerido por dos, si el resto es 0, el número es par), así se tendrían definidas las diferentes diagonales. Esta “condición” estaría colocada dentro de un doble bucle for (bucle anidado), en el que el valor de cada nueva celda de la diagonal, tendrá el mismo valor que la anterior.




Acumulación de texto en varias diagonales sucesivas

Continuando el ejemplo anterior, vamos a definir una lista en varias diagonales, en las que se mostrará el texto previamente definido (“BIENVENIDO”). En la nueva versión del programa anterior, se podrá observar cómo utilizar la función “condición” (representada por la función if) y el bucle (mediante la aplicación de la función for, entre otras opciones).
Así, para hacer que la palabra “BIENVENIDO” aparezca colocada siguiendo varias diagonales un número determinado de veces. Se definen, inicialmente, dos variables contador como enteros
(función Dim… As Integer), y que representan además los índices de las celdas de la Hoja de Cálculo (filas y columnas). Se define el texto en la primera celda. Seguidamente, se define la condición de que la suma de los índices de celda (variables contadores) sean números pares, con la utilización de la función mod (función resto, dividiendo el número requerido por dos, si el resto es 0, el número es par), así se tendrían definidas las diferentes diagonales. Esta “condición” estaría colocada dentro de un doble bucle for (bucle anidado), en el que el valor de cada nueva celda de la diagonal, tendrá el mismo valor que la anterior.





martes, 6 de septiembre de 2016

Ejemplos de Select case en VBA

La estructura Select en VBA es importante porque nos permite tener un control de las instrucciones agrupándolas, la sintaxis a emplear es como sigue:
Select [ Case ] expresión a evaluar
[ Case lista de expresiones
[Instrucciones a ejecutar] ]
[ Case Else
[ Instrucciones a ejecutar en el caso del else] ]
End Select
Primero tenemos la expresión a evaluar, en esta de debe evaluarse un dato el cual puede encontrarse dentro de la lista de expresiones.
Así podríamos encontrar mostrar el siguiente ejemplo de Select Case en VBA
Sub EjemploSelectCase()
Dim numero As Integer
numero = 8
Select Case numero
Case 1 To 5
     MsgBox “El número esta entre 1 y 5 “
Case 6, 7, 8
     MsgBox “El número esta entre 6, 7 y 8 “
Case 9 To 10
     MsgBox “El número esta entre 9 y 10 “
Case Else
     MsgBox “El número no esta entre 1 y 10 “
End Select
End Sub
Dependiendo del valor de la variable “numero” se ejecutará el bloque correspondiente


La función Select Case nos permite poder escoger de entre más de dos alternativas o instrucciones, a diferencia de la función If. A continuación se les invita a revisar 5 ejemplos en donde se puede aplica esta función:


Por ejemplo se plantea un caso en el que se desea determinar para el procesamiento de  una encuesta en particular el nivel socio económico al que pertenece una persona de acuerdo con su ingreso mensual. Para esto se creo una macro con la instrucción descrita anteriormente, SELECT CASE, en la que se establecen NSE A,  B+, B-, C+, C- y D. La macro empieza ejecutarse al hacer click en el botón que aparece en la hoja1 como muestra la siguiente imagen.  

Luego de hacer click aparece lo siguiente






lunes, 5 de septiembre de 2016

Colores

Para poder asignar un color a una celda o auna fuente, tenemos la propiedad ColorIndex, la cual podrá recibir colores del 1 al 56.

Si queremos darle un color rojo a la celda activa usamos:
ActiveCell.Interior.ColorIndex = 3
Si queremos darle un color azul al fuente de la celda activa usamos:
ActiveCell.Font.ColorIndex = 5
Aunque también podemos utilizar la propiedad Color de la siguiente manera.
ActiveCell.Interior.Color = vbRed
Para la propiedad Color tenemos 8 constantes de color a utilizar sin necesidad de saber el índice del color.








domingo, 4 de septiembre de 2016

Ciclo FOR NEXT

¿Qué es FOR NEXT en VBA?

El For Next en VBA  es una instrucción de uso muy frecuente, el propósito del For Next en VBA es realizar la repetición de un conjunto de instrucciones un determinado número de veces, veamos a continuación como emplear esta instrucción.

Sintáxis de FOR NEXT en VBA

FOR (variable inicializada) to límite  [Step avance ]
Instrucciones a ser repetidas
Next
La “variable inicializada” es el punto de partida de una variable, por ejemplo si ahí colocamos x = 2, entonces X comenzará almacenando el valor de 2 y se incrementará hasta alcanzar el valor que indique “límite“, el cierre del for se produce con la instrucción Next.
El uso de “Step” es opcional (por ello aparece entre corchetes), y permite determinar como va avanzando el valor de X hasta llegar al “límite“, si no se coloca esta parte se asume que se va incrementando de uno en uno, el valor de “Step” también puede ser negativo.

¿Cómo usar FOR NEXT en VBA?

Por ejemplo si empleamos lo siguiente:
FOR x =2 to 10
MSGBOX x
Next
Tendríamos que las instrucciones a ser repetidas se ejecutarían 9 veces, durante la primera ejecución x valdría 1, en la siguiente ejecución x valdría 2 y así sucesivamente hasta alcanzar el valor de 10.
Y si por ejemplo realizamos lo siguiente
FOR x =2 to 10 step 2 
MSGBOX x
Next
Lo que ocurriría es que X comenzaría valiendo 2, luego 4, luego 6 y así sucesivamente hasta alcanzar el valor de 10.



EJERCICIO SENCILLO





sábado, 3 de septiembre de 2016

Declaración de variables en VBA para Excel

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) 






viernes, 2 de septiembre de 2016

Uso de For each … Next en vba Excel

El constructor For each … Next nos permite la manipulación de objetos dentro de una colección. Una colección es el conjunto de elementos de un mismo tipo, por ejemplo, colección de celdas, de hojas, de libros, de ventanas, objetos gráficos, etc.
A diferencia del constructor For … Next, que nos permite elegir el inicio y fin de una numeración, la cual se puede asignar para varios motivos, For  each … Next incluye todos los objetos de las colecciones de Office.
Expongo 3 macros sencillas que nos permitirán conocer el uso del constructor, lo demás será cuestión de aplicar los métodos o procedimientos de cada objeto en cuestión.
Colección de celdas
Aplicable en la manipulación de celda contenidas en un rango elegido, por ejemplo: cambiar color, tamaño, insertar comentario, aplicar una función, etc. El siguiente ejemplo nos arroja un objeto MsgBox donde nos dice la ruta de cada celda elegidas, así como su contenido:


miércoles, 31 de agosto de 2016

Cells.Find

El único parámetro obligatorio es el que establece lo que queremos buscar, y que es:
what:=”valor a buscar”
Tan solo con esto, la instrucción nos devolverá la celda en la que se encuentre el valor buscado o nothing, en caso de que no lo halle.
After:=celda
Le podemos indicar a partir de que celda queremos empezar a buscar
lookIn:=donde buscar
Con dos opciones: buscar en valores (xlValues) y buscar en formulas (xlFormula)
LookAt:=como buscar
con xlWhole para búsquedas de palabra exacta, o xlPart para búsquedas con parte de la palabra
SearchOrder:= orden de busqueda
para indicarle si queremos realizar la busqueda por filas(xlRows) o por columnas(xlColumns)
SearchDirection:= direccion de la busqueda
Pensado para continuar con la busqueda con dos posibles opciones:
§  xlNext – Continuar con siguiente
§  xlPrevious-Continuar con anterior
MatchCase:=true/false

Para indicar si ha de detectar mayúsculas y minúsculas

lunes, 29 de agosto de 2016

domingo, 28 de agosto de 2016

Condicionales y Ciclos

Acceso a las Propiedades de los objetos



Obtener el nombre de una hoja de trabajo

(Propiedad Name)

Sub Propiedades()
'Nombre de la primera hoja de trabajo
'
    MsgBox Worksheets(1).Name
    
End Sub


Obtener el tamaño de la letra de una celda

(Propiedad Font.Size)

Sub Propiedades1()
'Tamaño de letra
'
    MsgBox Worksheets(1).Cells(1).Font.Size

End Sub


Obtener la dirección de la celda activa

(Propiead Address)

Sub Propiedades2()
' Dirección de la celda activa
'
    MsgBox ActiveCell.Address

End Sub


Cambiar el tipo de letra de una celda

(Propiedad Font.Name)

Sub Propiedades3()
' Cambiando el tipo de letra
'
    Worksheets(1).Cells(1).Font.Name = "Georgia"

End Sub


Cambiar el estilo de letra de una celda

(Propiedad Font.Bold)

Sub CambiarTipoLetra()
  Range("A2").Font.Bold = True
End Sub

Contar el número de hojas de un libro de trabajo

(Propiedad Count)

Sub ContarHojas()
'Contar el número de hojas de un libro de trabajo
'
Dim numHojas As Integer
    numHojas = Application.Sheets.Count
    MsgBox numHojas
End Sub



Acceso a los Métodos de los Objetos

Los métodos en VBA normalmente hacen algo o realizan ciertas operaciones sobre los objetos.

Seleccionar celdas

Sub SeleccionarCeldas()
'Seleccionar la celda A1
    Range("A1").Select
End Sub

Sub SeleccionarRangoCeldas()
'Seleccionar un rango de celdas
    Range("A1:A5").Select
End Sub

Limpiar el contenido de un rango de celdas

Sub LimpiarContenidos()
' Limpiar el contenido del rango A1:A5
    Range("A1:A5").ClearContents
End Sub

Activar una hoja de trabajo

Sub Metodos()
' Activa la hoja de trabajo "Hoja2"´
'
    Sheets("Hoja2").Activate
End Sub

Impresión previa de una hoja de trabajo

Sub Metodos2()
' Impresión previa de la hoja de trabajo número 1
'
    Sheets(1).PrintPreview (True)
End Sub

Copiar rangos

Sub CopiarRangos1()
'Copia el contenido de la celda A1 a la celda B1
    Range("A1").Copy Range("B1")
End Sub

Sub CopiarRangos2()
'Copia el contenido del rango A1:A5 a B1
    Range("A1:A5").Copy Range("B1")
End Sub

Cortar rangos

Sub CortarRangos()
'Corta el contenido de la celda A1:A5 y lo pega en la celda B1
    Range("A1:A5").Cut Range("B1")
End Sub



Ciclo For...Next

Ciclo For...Next


For contador = inicio To final [STEP incremento]
   [instrucciones]
Next [contador]



Sub Ciclos()
Dim i As Integer

    For i = 1 To 10
        Cells(i, 1).Value = i
    Next i
    
End Sub



Sub Ciclos2()
Dim i As Integer

    For i = 1 To 10
        Cells(i, 1).Value = i
        Cells(i, 2).Value = i ^ (1 / 2)
        Cells(i, 3).Value = i ^ 2
        Cells(i, 4).Value = i ^ 3
    Next i
    
End Sub



Cambiar el incremento en el ciclo

Sub Ciclos4()
Dim i As Integer
Dim UltimaFila As Long

    UltimaFila = Cells(Rows.Count, 1).End(xlUp).Row

    For i = 2 To UltimaFila Step 2
     Cells(i, 1).Resize(1, 4).Interior.ColorIndex = 36
    Next i
    
End Sub


Sub Ciclos5()
'Escribe el texto "Mayor que cero" a la derecha
'de la columna de trabajo
'
Dim UltimaFila As Integer
Dim ColumnaTrabajo
Dim i As Integer

    ColumnaTrabajo = 3
    UltimaFila = Cells(Rows.Count, ColumnaTrabajo).End(xlUp).Row
    
    For i = 1 To UltimaFila
    
        If Cells(i, ColumnaTrabajo).Value > 0 Then
            Cells(i, ColumnaTrabajo + 1).Value = "Mayor que cero"
        End If
        
    Next i
    
End Sub


Ciclos dentro de ciclos

Sub Ciclos()
Dim i As Integer
Dim j As Integer

    For i = 1 To 10
        For j = 1 To 5
            Cells(i + 1, j + 1).Value = i * j
        Next j
    Next i
    
End Sub


Ciclo Do While...Loop

Repetir el ciclo hasta que se cumpla alguna condición


 Do {While | Until} condición
       'código
  Loop



Sub Ciclos()
Dim fila As Integer
    fila = 1

    Do While Cells(fila, 1) <> ""
         Cells(fila, 2).Value = fila
         fila = fila + 1
    Loop
End Sub


Repetir el ciclo hasta que se encuentre una celda vacía

Sub Ciclos()
Dim i As Integer

    i = 1
    
    Do While Not IsEmpty(Cells(i, 1))
      i = i + 1
    Loop
    
   Cells(i, 1).Select
End Sub

Ciclo Do...Loop Until

Repetir el ciclo hasta que se cumpla alguna condición


Do
       'código
    Loop {While | Until} condición


Sub Ciclos()
Dim fila As Integer

    fila = 1
    Do
        Cells(fila, 2) = fila
        fila = fila + 1
    Loop Until Cells(fila, 1).Value = ""

End Sub

Repetir el ciclo hasta que se encuentre una celda vacía

Sub Ciclos()
Dim i As Integer

    i = 0
    
    Do
      i = i + 1
    Loop Until IsEmpty(Cells(i, 1))
    
   Cells(i, 1).Select
End Sub

Cambiar los colores del fondo de una celda

Cambiar el color del fondo de una celda

Propiedad rango.Interior.ColorIndex 

Muestra los primeros 21 colores de fondo que pueden obtener con la propiedad ColorIndex del objeto Interior.

Sub IndiceColor()
Dim i As Integer

Cells(1, 1).Value = "Índice de color"
Cells(1, 2).Value = "Color"

For i = 0 To 20
    Cells(i + 2, 1).Value = i
    Cells(i + 2, 2).Interior.ColorIndex = i
Next i

End Sub


Excel índice de colores


Cambiar el color del fondo de una celda

Tabla antes de la macro

Excel tabla ventas

Cambia el color de las filas que contienen en la segunda columna la palabra "Ventas"
Sub CambiaFondoCelda()
Dim i As Integer

For i = 2 To 11
    If Cells(i, 2).Value = "Ventas" Then
        Cells(i, 1).Resize(1, 4).Interior.ColorIndex = 6
    End If
Next i

End Sub


Tabla después de la macro


Excel Cambiar color de fondo de la celda

Ciclos que muestran el uso de contadores y acumuladores

El siguiente procedimiento muestra el uso de contadores y 
acumuladores en un ciclo.
Calcula la suma y el promedio de un conjunto de números en un 
rango dado.


Calcular sumas y promedios de un rango dado


Sub Promedios()
Dim suma As Double
Dim promedio As Double
Dim n As Double
Dim celda As Range

    suma = 0 'acumula los valores
    n = 0    'cuenta los valores
    
    For Each celda In Selection
        n = n + 1
        suma = suma + celda.Value
    Next celda
    
    promedio = suma / n
    MsgBox "Valores leídos = " & n & vbCrLf & _
           "Suma = " & suma & vbCrLf & _
           "Promedio = " & promedio
End Sub



Cuenta el número de valores mayores, menores o iguales al promedio 
de un conjunto de numero en un rango dado,




Ejemplo del uso de contadores en VBA


Sub Contadores()
Dim suma As Double
Dim promedio As Double
Dim n As Double
Dim celda As Range
Dim mayor As Double
Dim menor As Double
Dim igual As Double

    suma = 0 'acumula los valores
    n = 0    'cuenta los valores
    
    For Each celda In Selection
        n = n + 1
        suma = suma + celda.Value
    Next celda
    
    promedio = suma / n
    
     mayor = 0 'cuenta los valores mayores al promedio
     menor = 0 'cuenta los valores menores al promedio
     igual = 0 'cuenta los valores mayores al promedio
     
     For Each celda In Selection
        
        If celda.Value > promedio Then
            mayor = mayor + 1
        End If
        
        If celda.Value < promedio Then
            menor = menor + 1
        End If
        
        If celda.Value = promedio Then
            igual = igual + 1
        End If
        
     Next celda
    
     MsgBox "Valores leídos      = " & n & vbCrLf & _
            "Promedio            = " & promedio & vbCrLf & _
            "Mayores al promedio = " & mayor & vbCrLf & _
            "Menores al promedio = " & menor & vbCrLf & _
            "Iguales al promedio = " & igual & vbCrLf

End Sub