Manual Excel Macros I

download Manual Excel Macros I

of 39

Transcript of Manual Excel Macros I

  • Microsoft EXCEL

    Curso Terico-Prctico

    Compilado por: Rubby Cortz Vogth

  • Pgina 2 de 39

    Diseo de bases de datos El diseo de una base de datos es de suma importancia ya que de ello depender que nuestros datos estn correctamente actualizados y la informacin siempre sea exacta. Si hacemos un buen diseo de base de datos podremos obtener reportes efectivos y eficientes. En esta ocasin veremos algunas recomendaciones a seguir al momento de realizar el diseo y modelo de una base de datos. No importa la herramienta que se utilice para almacenar la informacin, puede ser Excel, Access o sistemas de gerenciamiento de bases datos ms complejos como Microsoft SQL Server pero siempre se debe disear y modelar una base de datos antes de tomar la decisin de crearla. Conceptos bsicos sobre el diseo de bases de datos En cualquier base de datos la informacin est almacenada en tablas las cuales a su vez estn formadas por columnas y filas. La base de datos ms simple consta de una sola tabla aunque la mayora de las bases de datos necesitarn varias tablas.

    Las filas de una tabla tambin reciben el nombre de registros y las columnas tambin son llamadas campos. Disear y modelar una base de datos Al disear una base de datos determinamos las tablas y campos que darn forma a nuestra base de datos. El hecho de tomarnos el tiempo necesario para identificar, organizar y relacionar la informacin nos evitar problemas posteriores. Es por eso que para disear una base de datos es necesario conocer la problemtica y todo el contexto sobre la informacin que se almacenar en nuestro repositorio de datos. Debemos determinar la finalidad de la base de datos y en base a eso reunir toda la informacin que ser registrada.

    A continuacin 5 pasos esenciales para realizar un buen diseo y modelo de una base de datos: 1. Identificar las tablas De acuerdo a los requerimientos que tengamos para la creacin de nuestra base de datos, debemos identificar adecuadamente los elementos de informacin y dividirlos en entidades (temas principales) como pueden ser las sucursales, los productos, los clientes, etc. Para cada uno de los objetos identificados crearemos una tabla. Si en una base de datos los objetos principales son los empleados y los departamentos de la empresa entonces tendremos una tabla para cada uno de ellos. Si en otra base de datos los objetos principales son los libros, autores y editores entonces necesitaremos tres tablas en nuestra base de datos.

  • Pgina 3 de 39

    2. Determinar los campos Cada entidad representada por una tabla posee caractersticas propias que lo describen y que lo hacen diferente de los dems objetos. Esas caractersticas de cada entidad sern nuestros campos de la tabla los cuales describirn adecuadamente a cada registro. Por ejemplo, una tabla de libros impresos tendr los campos ISBN, ttulo, pginas, autor, etc.

    3. Determinar las llaves primarias Una llave primaria es un identificador nico para cada registro (fila) de una tabla. La llave primaria es un campo de la tabla cuyo valor ser diferente para todos los registros. Por ejemplo, para una tabla de libros, la llave primaria bien podra ser el ISBN el cual es nico para cada libro. Para una tabla de productos se tendra una clave de producto que los identifique de manera nica.

    4. Determinar las relaciones entre tablas Examina las tablas creadas y revisa si existe alguna relacin entre ellas. Cuando encontramos que existe una relacin entre dos tablas debemos identificar el campo de relacin. Por ejemplo, en una base de datos de productos y categoras existir una relacin entre las dos tablas porque una categora puede tener varios productos asignados. Por lo tanto el campo con el cdigo de la categora ser el campo que establezca la relacin entre ambas tablas.

    5. Identificar y remover datos repetidos Finalmente examina cada una de las tablas y verifica que no exista informacin repetida. El tener informacin repetida puede causar problemas de consistencia en los datos adems de ocupar ms espacio de almacenamiento. Por ejemplo, una tabla de empleados que contiene el cdigo del departamento y el nombre del departamento comenzar a repetir la informacin para los empleados que pertenezcan al mismo departamento. Qu pasara si el nombre del departamento cambiara de Informtica a Tecnologa? Tendramos que ir registro por registro modificando el nombre correspondiente y podramos dejar alguna incongruencia en

  • Pgina 4 de 39

    los datos. Una mejor solucin es tener una tabla exclusiva de departamentos y solamente incluir la clave del departamento en la tabla de empleados.

    De esta manera dejamos de repetir el nombre del departamento en la tabla de empleados y ahorramos espacios de almacenamiento. Y en caso de un cambio de nombre de departamento solamente debemos realizar la actualizacin en un solo lugar. El diseo de bases de datos es un tema muy extenso y es difcil considerar todos sus aspectos en unas pocas horas. Sin embargo, al seguir estas 5 reglas bsicas del diseo de bases de datos estaremos dando un

    paso hacia adelante en las buenas prcticas de creacin y gestin de bases de datos. Prctica 1: Creacin de una Base de Datos de Registro de Ventas Diarias Una buena idea al momento de disear una Base de Datos es pensar en qu reportes vamos a requerir de ella. Por ejemplo si deseamos saber cunto vendemos por zonas, en la tabla Clientes debemos incluir un campo (columna) llamado Zona y si deseamos saber qu porcentaje de nuestras ventas son realizadas por nuestro personal femenino, debemos incluir un campo Gnero en la Tabla Vendedores. En las bases de datos de ventas, casi siempre es necesario incluir las columnas Mes y Semana, para conocer nuestra ventas semanales y su evolucin histrica, algunas veces adems, es til incluir el Da de la Semana (Lunes, Martes. ) para extraer reportes que nos permitan orientar nuestras promociones y/o polticas de mercadeo. Veamos el formato de nuestra Base de Datos en el archivo de ejemplo 01_Base_de_Datos.xlsx.

  • Pgina 5 de 39

    Para formatear nuestra Base de Datos, realizaremos los siguientes pasos:

    1. Dar formato como tabla a cada una de nuestras Tablas. 2. Asignarles un nombre. 3. Dar Nombre de Rango a las claves primarias y a las secundarias que sean necesarias. 4. Marcar los duplicados y quitarlos si fuera el caso. 5. Validar los datos 6. Colocar las frmulas en nuestra Base de Datos.

    Paso 1:

    Marcar el rango de la Tabla (encabezado y datos) Click en la Ficha Inicio. Click en el botn Dar Formato como tabla y elegir una de las opciones. Marcar la casilla La tabla tiene encabezados y Aceptar.

    Paso 2:

    Click en cualquier celda de la Tabla correspondiente Click en la Ficha Diseo. En la caja de texto Nombre de la Tabla, asigne el nombre correspondiente.

  • Pgina 6 de 39

    Paso 3: Marcar el rango Click en la Ficha Frmulas. Click en el botn Asignar Nombre a un rango. En la ventana emergente, asigne el nombre correspondiente y haga click en Aceptar.

    Paso 4:

    Marcar el rango Click en la Ficha Inicio. Click en el Botn Formato condicional. Click en la opcin Resaltar reglas de celdas. Click en la opcin Duplicar Valores.

  • Pgina 7 de 39

    Paso 5:

    Marcar el rango Click en la Ficha Datos. Click en el Botn Validacin de Datos. En la ventana emergente, en el apartado Permitir, elegir: Lista. En la misma ventana, en el apartado Origen, escribir el nombre de rango asignado al origen.

    Paso 6:

    En la celda F6: =SI.ERROR(BUSCARV(E6;Tabla_Vendedores;2;FALSO);"")

    En la celda G6: =SI.ERROR(BUSCARV(E6;Tabla_Vendedores;3;FALSO);"")

    En la celda i6: =SI.ERROR(BUSCARV(H6;Tabla_Clientes;2;FALSO);"")

    En la celda J6: =SI.ERROR(BUSCARV(H6;Tabla_Clientes;3;FALSO);"")

    En la celda K6: =SI.ERROR(BUSCARV(H6;Tabla_Clientes;5;FALSO);"")

    En la celda L6: =SI.ERROR(BUSCARV(H6;Tabla_Clientes;6;FALSO);"")

    En la celda o6; =SI.ERROR(BUSCARV(M6;Tabla_Productos;2;FALSO);"")

    En la celda P6: =SI.ERROR(BUSCARV(M6;Tabla_Productos;3;FALSO);"")

    En la celda Q6: =SI.ERROR(BUSCARV(M6;Tabla_Productos;4;FALSO);"")

    En la celda R6: =SI.ERROR(N6*Q6;"")

  • Pgina 8 de 39

    Controles de Formulario y Controles ActiveX Controles de Formulario Los controles de formulario se usan cuando se desea hacer referencia e interactuar fcilmente con datos de celda sin usar cdigo de VBA y cuando se desea agregar controles a hojas de grfico. Controles ActiveX Los controles ActiveX pueden usarse en formularios de hoja de clculo, con o sin el uso de cdigo VBA, y en formularios del usuario de VBA. En general, use controles ActiveX cuando necesite requisitos de diseo ms flexibles que los proporcionados por los controles de formulario. Los controles ActiveX tienen amplias propiedades que puede usar para personalizar su apariencia, comportamiento, fuentes y dems caractersticas. Tambin puede controlar los diversos eventos que se producen cuando se interacta con un control ActiveX. Resumen de controles ActiveX Botn de comando: Ejecuta una macro que realiza una accin cuando un usuario hace clic en l. Cuadro combinado: Combina un cuadro de texto con un cuadro de lista para crear un cuadro de lista desplegable. Un cuadro combinado es ms compacto que un cuadro de lista pero requiere que el usuario haga clic en la flecha abajo para mostrar una lista de elementos. selo para permitir que un usuario escriba una entrada o elija solamente un elemento de la lista. Botn de opcin: Permite una nica eleccin dentro de un conjunto limitado de opciones que se excluyen mutuamente; generalmente est contenido en un marco o cuadro de grupo Casilla de verificacin: Activa o desactiva un valor que representa una seleccin inequvoca entre opuestos. Puede seleccionar ms de una casilla de verificacin a la vez en una hoja de clculo o en un cuadro de grupo. Cuadro de Lista: Muestra una lista de uno o ms elementos de texto de entre los cuales puede elegir el usuario. Use un cuadro de lista para mostrar grandes cantidades de opciones que varan en nmero o contenido. Cuadro de texto: Permite al usuario ver, escribir o editar texto o datos enlazados a una celda, en un cuadro rectangular. Un cuadro de texto tambin puede ser un campo de texto esttico que presenta informacin de solo lectura. Barra de desplazamiento: Se desplaza por un intervalo de valores cuando el usuario hace clic en las flechas de desplazamiento o arrastra el cuadro de desplazamiento. Adems, se puede mover por una pgina (en un intervalo preestablecido) de valores haciendo clic en el rea entre el cuadro de desplazamiento y cualquiera de las flechas de desplazamiento. Control de nmero: Aumenta o disminuye un valor, como un incremento numrico, una hora o una fecha. Para incrementar el valor, es necesario hacer clic en la flecha arriba; para disminuirlo, se debe hacer clic en la flecha abajo.

  • Pgina 9 de 39

    Etiqueta: Identifica el propsito de una celda o un cuadro de texto, o muestra texto descriptivo (como ttulos, leyendas, imgenes) o breves instrucciones. Imagen: Inserta una imagen, como mapa de bits, JPEG o GIF. Botn de alternancia: Indica un estado, como S/No, o un modo, como Activado/Desactivado. El botn alterna entre un estado habilitado o deshabilitado cuando se hace clic en l. Cuadro de grupo: Un objeto rectangular con una etiqueta opcional que agrupa controles relacionados en una nica unidad visual. Generalmente, se agrupan en un control de marco los botones de opcin, las casillas de verificacin o contenido estrechamente relacionado. El cuadro de grupo ActiveX no est disponible en la seccin Controles ActiveX del comando Insertar. No obstante, puede agregarlo desde el cuadro de dilogo Ms controles seleccionando Microsoft Forms 2.0 Frame. Ms controles: Muestra una lista de controles ActiveX adicionales disponibles en el equipo que puede agregar a un formulario personalizado, como el Control de calendario 12.0, por ejemplo.

  • Pgina 10 de 39

    Descripcin prctica de los Controles ActiveX (Con el archivo de ejemplo 03_Controles_ActiveX.xlsm)

    Botn de Comando Vamos a insertar un botn que al hacer click en l, nos pida un nmero, lo eleve al cuadrado y nos devuelva el resultado en la celda A1 y adems nos enve un mensaje de confirmacin.

    1. Seleccione la Ficha Programador. 2. Click en el Botn Modo Diseo. 3. Click en el Botn Insertar. 4. (Elija el control Botn de Comando y dibjelo con click sostenido en la hoja).

    Con el Botn seleccionado, hacemos Click en el Botn Propiedades y modificamos sus propiedades ms relevantes:

    A. Name: Cuando ingrese cdigo VB (o lo revise) se alegrar de haber puesto un nombre descriptivo al botn, relacionado a la tarea que ste ejecuta, y no simplemente CommandButton1, CommandButton2 etc.

    B. BackColor: Slo por cuestiones estticas. Es el color de la cara del Botn. Puede seleccionar el color que desee, colocando el cursor en esta caja de texto y desplegando sus opciones.

    C. Caption: Muy importante, le informar al usuario qu accin realiza el botn. D. Font: Slo por cuestiones estticas. Puede seleccionar el formato que desee. E. ForeColor: Slo por cuestiones estticas. Es el color del texto del Botn. Puede seleccionar el color

    que desee. F. Height: Es la altura del botn expresado en puntos . G. PrintObject: Determina si el botn ser visible en las copias impresas de la hoja. H. WordWrap: En True, recorre el texto una lnea hacia abajo cuando no cabe en una sola fila. I. Width: Es la anchura del botn expresado en puntos .

    (Un punto equivale a 1/72 de pulgada, es decir que en un milmetro hay 2,83 puntos).

  • Pgina 11 de 39

    Luego, cerramos la ventana Propiedades y hacemos doble click en el botn y esto nos lleva al editor de Visual Basic, donde escribimos:

    Private Sub CommandButton1_Click() 'RECIBE UN NMERO, LO ELEVA AL CUADRADO Y PRESENTA SU RESULTADO 'Declaramos las variables

    Dim numero As String Dim cuadrado As Integer

    'Solicitamos el nmero al usuario

    numero = InputBox("Ingrese un nmero", "Nmero a elevar al cuadrado") 'Si no se ingresa un nmero, salimos, caso contrario, realizamos el clculo y 'emitimos mensaje de confirmacin

    If numero = "" Then End

    Else cuadrado = numero * numero Range("A1").Value = cuadrado MsgBox ("El cuadrado del nmero " & numero & " es el nmero " & cuadrado _

  • Pgina 12 de 39

    & vbCrLf & "El resultado ha sido guardado en la celda A1.") End If

    End Sub

    Luego de escribir este cdigo, volvemos a Excel, quitamos el Modo Diseo, en el botn correspondiente y hacemos click en el botn, para probar nuestra macro:

    Cuadro Combinado Vamos a insertar un cuadro de lista que permita seleccionar uno de los departamentos de la empresa, los que estarn listado en las celdas G2:G8 (que luego ocultaremos). La particularidad de este control es que adems de mostrar el el dato seleccionado, lo exporta a una celda que nosotros le indicamos (puede ser de la misma o de otra hoja o, incluso, de otro libro). Insertamos el control y modificamos sus propiedades: LinkedCell y ListFillRange, la primera indica la celda adonde ser exportado el resultado, la segunda indica las celdas origen de la lista. La direccin en la propiedad LinkedCell se escribe as:

  • Pgina 13 de 39

    Para direccionar hacia la celda E2 de la misma hoja: E2

    Para direccionar hacia la celda E2 de otra hoja: OtraHoja!E2

    Para direccionar hacia la celda E2 de otra hoja de otro archivo: [OtroArchivo]OtraHoja!E2 (los caracteres de [ y ] -llaves- se consiguen con ALT-91 y ALT-93, respectivamente)

    Botn de Opcin Utilizado en formularios para preguntas de opcin mltiple donde el usuario slo puede seleccionar cualquiera de ellas, pero slo una a la vez. Comnmente se combina con el control Cuadro de Grupo, en el que se puede indicar un ttulo que describa al grupo, fuera de eso, funciona como un marco decorativo y nada ms. Vamos a insertar un Cuadro de Grupo, que contenga 4 Botones de opcin y 1 control Imagen, para que, al seleccionar el Estado Civil del usuario, nos muestre la imagen que le corresponde. Adems tenemos ya listos 4 archivos de imagen en una carpeta llamada Images, ubicada en la misma carpeta que nuestro archivo de ejemplo.

    Insertamos el control Cuadro de Grupo.

    Insertamos el control Imagen cambiamos su propiedad PictureSizeMode a 1-fmPictureSizeModeStrectch).

    Insertamos uno a uno los Botones de Opcin. Cambiamos la propiedad Caption de cada uno a: Soltero(a), Casado(a), Viudo(a) y

    Divorciado(a), en el orden en que fueron creados. En su propiedad LinkedCell colocamos F1, F2, F3 y F4, respectivamente. En la celda G1 colocamos: =SI(F1=VERDADERO;1;0) En la celda G2 colocamos: =SI(F2=VERDADERO;2;0) En la celda G3 colocamos: =SI(F3=VERDADERO;3;0) En la celda G4 colocamos: =SI(F4=VERDADERO;4;0)

    Hacemos doble click en cualquiera de los botones de opcin y colocamos los siguientes cdigos en cada uno de ellos:

  • Pgina 14 de 39

    Luego volvemos a Excel, deshabilitamos el botn Modo Diseo y probamos la macro. Observe cmo los valores de F1-G1, F2-G2, F3-G3 y F4-G4 van cambiando en cada seleccin, as como tambin la imagen mostrada.

    Calendario Disearemos una planilla que requiere la introduccin de fechas en 2 de sus celdas (Fecha de inicio y fecha de finalizacin), el contenido de la planilla puede ser cualquiera, ahora slo queremos ilustrar el uso de este interesante control. Este control no se encuentra en los botones, sino que se puede elegir de una lista adicional que aparece al hacer click en el botn Ms controles. Su nombre es Control de calendario 12.0 (no disponible en Excel 2010 y versiones posteriores). Nos muestra un calendario para que hagamos click en una fecha y, a travs de un evento programado por nosotros mismos, ese valor de fecha puede ser colocado en una celda. El cdigo es el siguiente:

  • Pgina 15 de 39

    1 Private Sub Worksheet_SelectionChange(ByVal Target As Range) 2 If Target.Address = "$C$2" Then 3 Calendar1.Left = 120 4 Calendar1.Value = Now 5 Calendar1.Visible = True 6 Else 7 If Target.Address = "$G$2" Then 8 Calendar1.Left = 366 9 Calendar1.Value = Now 10 Calendar1.Visible = True 11 Else 12 Calendar1.Visible = False 13 End If 14 End If 15 End Sub 16 17 18 Private Sub Calendar1_Click() 19 ActiveCell.Value = Calendar1.Value 20 Calendar1.Visible = False 21 End Sub Explicacin paso a paso:

    Lnea 1: El Evento SelectionChange dispara una accin cuando la seleccin de celda cambia, es decir que sucede inmediatamente pasamos de una celda a otra.

    Lnea 2: Significa Si la direccin de destino es la celda C2, entonces. (entonces se ejecutarn todas las instrucciones siguientes hasta que aparezca la instruccin ELSE (en la lnea 6).

    Lnea 3: Indica que el calendario aparecer a 120 puntos del margen izquierdo de la ventana.

    Lnea 4: Indica que el valor del calendario ser la fecha y hora actual (la de su PC).

    Lnea 5: Indica que el control calendario se mostrar en pantalla (TRUE = Verdadero)

    Lnea 6: La expresin Else significa Si no , en este caso quiere decir que si la direccin de destino no es la celda C2 (es cualquier otra celda, menos C2) entonces ejecute el siguiente grupo de instrucciones hasta que aparezca la instruccin End If.

    (Lneas 7, 8, 9, 10 y 11 explicadas en las lneas 2, 3, 4, 5 y 6).

    Lnea 12: Quiere decir que se ocultar el control Calendario, en este caso, suceder porque la celda de destino no es ni C2 ni G2.

    Lnea 13: Requerido por el sistema, finaliza la instruccin If de la lnea 7.

    Lnea 14: Requerido por el sistema, finaliza la instruccin If de la lnea 2.

    Lnea 15: Requerido por el sistema, finaliza la instruccin Private Sub de la lnea 1.

    Lnea 18: Es la subrutina que ejecuta las acciones que deben ocurrir cuando el usuario hace click en una de las fechas del calendario.

    Lnea 19: Indica que la Celda Activa (ActiveCell) tomar el valor del control calendario (osea, la fecha sobre la cual se hizo click).

    Lnea 20: Oculta el calendario porque ya logramos nuestro objetivo: capturar un valor de fecha.

    Lnea 21: Requerido por el sistema, finaliza la instruccin Private Sub de la lnea 18. Ahora podemos probar la macro.

  • Pgina 16 de 39

    Botn de Alternar Permite cambiar entre 2 estados, 2 opciones o 2 instrucciones. Funciona como un interruptor de apagado / encendido. En nuestro ejemplo, vamos a utilizarlo para cambiar la moneda en la que se expresa un reporte de ventas, cambiando de bolivianos a dlares y viceversa, cada que presionamos o soltamos el botn.

    Insertamos el control Botn de Alternar y cambiamos sus propiedades: LinkedCell: H1. Caption: Cambiar Moneda.

    En la celda i1, colocamos la frmula: =SI(H1=VERDADERO;"Dlares";"Bolivianos") Luego, hacemos doble click en el botn (Asumo que el Modo Diseo est habilitado), para ir al Editor de VBA y all introducimos el siguiente cdigo (puede copiarlo y pegarlo):

    Private Sub ToggleButton1_Click() 'CAMBIA LA MONEDA EN LA QUE SE MUESTRA EL CUADRO - BOLIVIANOS O DLARES - 'Si el botn est presionado If ToggleButton1 = True Then 'Tomamos el valor del tipo de cambio Range("F2").Select Selection.Copy 'Seleccionamos los valores a convertir Range("C4:E13").Select 'Convertimos los valores Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlDivide, SkipBlanks _ :=False, Transpose:=False Application.CutCopyMode = False 'Volvemos a posicionarnos en la celda del tipo de cambio Range("F2").Select 'Si el botn NO est presionado Else 'Tomamos el valor del tipo de cambio Range("F2").Select Selection.Copy 'Seleccionamos los valores a convertir Range("C4:E13").Select 'Convertimos los valores Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlMultiply, SkipBlanks _ :=False, Transpose:=False Application.CutCopyMode = False 'Volvemos a posicionarnos en la celda del tipo de cambio Range("F2").Select End If End Sub

  • Pgina 17 de 39

    El cambio de color del contenido y del ttulo del cuadro lo logramos a travs de la aplicacin de formato condicional a las celdas correspondientes. Ahora podemos probar la macro.

    Casilla de Verificacin Utilizado en formularios para preguntas de opcin mltiple donde el usuario slo puede seleccionar, ms de una a la vez. Comnmente se combina con el control Cuadro de Grupo, en el que se puede indicar un ttulo que describa al grupo, fuera de eso, funciona slo como un marco decorativo.

    Vamos a insertar un Cuadro de Grupo, que contenga 6 Casillas de verificacin y 6 Etiquetas (en ingls: Labels), para que, cuando el usuario seleccione sus respuestas, nos muestre las etiquetas con los comentarios y adems nos devuelve la puntuacin correspondiente. Cada que el usuario haga click en una casilla sta se deshabilitar para evitar que la respuesta sea corregida. Adems colocaremos un botn de comando que nos permita resetear el formulario, sin embargo estar protegido por

    la contrasea: excel123, para evitar que los usuarios lo ejecuten.

    Insertamos el control Cuadro de Grupo.

    Insertamos una a una las 6 casillas de verificacin y cambiamos sus propiedades: Name: Chk_Zeus (Chk_Jupiter, Chk_Ares, ), respectivamente. Caption: Zeus (Jupiter, Ares, ), respectivamente. Height: 18 Width: 120 Left: 19,5 LinkedCell: C4, C6, C8, C10, C12 y C14, respectivamente. Top: 46,5 70,5 94,5 118,5 142,5 -166,5 , respectivamente.

    Insertamos una a una las 6 Etiquetas y cambiamos sus propiedades: Name: Lbl_Zeus (Lbl_Jupiter, Lbl_Ares, ), respectivamente. Caption: (Texto correspondiente) Height: 18 Width: 420 Left: 270 BackColor: Rojo (Incorrectas), Verde (Correctas) Font: Calibri, negrita, tamao 11. ForeColor: Rojo (Incorrectas), Verde (Correctas) Top: (Igual que las casillas)

    Colocamos las frmulas: En la celda D4: =SI(C4=VERDADERO;25;0)

  • Pgina 18 de 39

    En la celda D6: =SI(C6=VERDADERO;-25;0) En la celda D8: =SI(C8=VERDADERO;25;0) En la celda D10: =SI(C10=VERDADERO;25;0) En la celda D12: =SI(C12=VERDADERO;-25;0) En la celda D14: =SI(C14=VERDADERO;25;0) En la celda D16: =SUMA(D4:D15)

    Luego de finalizar estas instrucciones, la hoja debe lucir as:

    El cdigo VBA: Para la casilla Zeus:

    Private Sub Chk_Zeus_Click() 'Desprotegemos la hoja ActiveSheet.Unprotect 'Mostramos el comentario de la respuesta Lbl_Zeus.Visible = True 'Deshabilitamos la casilla de verificacin para que no se pueda modificar Chk_Zeus.Enabled = False 'Protegemos nuevamente la hoja ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True End Sub

    Para el resto de las casillas, copiar el cdigo, cambiando la palabra Zeus (en os 2 lugares en que aparece) por el nombre de cada una de ellas (Jupiter, Ares, etc.) Para el botn Limpiar Respuestas:

    Private Sub Cmd_Limpiar_Click() 'LIMPIA EL FORMULARIO 'Declaramos las variables Dim respuesta As String Dim contrasea As String

  • Pgina 19 de 39

    'Definimos el valor de la contrasea contrasea = "excel123" 'Solicitamos la contrasea resp = InputBox("Ingrese la contrasea", "Contrasea") 'Si no se ingresa la contrasea, finaliza la macro If resp = "" Then End End If 'Verificamos si la contrasea es igual a lo que hemos definido If resp contrasea Then MsgBox ("La contrasea es incorrecta." & vbCrLf & "Verifique e intente de nuevo.") End Else 'Desprotegemos la hoja ActiveSheet.Unprotect 'Desactivamos todas las casillas de verificacin Chk_Zeus = False Chk_Jupiter = False Chk_Ares = False Chk_Atenea = False Chk_Marte = False Chk_Dionisio = False 'Ocultamos todas las etiquetas de comentarios de respuestas Lbl_Zeus.Visible = False Lbl_Jupiter.Visible = False Lbl_Ares.Visible = False Lbl_Atenea.Visible = False Lbl_Marte.Visible = False Lbl_Dionisio.Visible = False 'Habilitamos todas las casillas de verificacin Chk_Zeus.Enabled = True Chk_Jupiter.Enabled = True Chk_Ares.Enabled = True Chk_Atenea.Enabled = True Chk_Marte.Enabled = True Chk_Dionisio.Enabled = True 'Protegemos nuevamente la hoja ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True End If End Sub

    Ahora s, podemos probar la macro.

  • Pgina 20 de 39

    Formulario de Captura de Datos (Con el archivo de ejemplo O2_Formulario_de_captura_de_datos.xlsm). Los formularios en VBA no son ms que un cuadro de dilogo de Excel donde podemos colocar controles que nos ayudarn a solicitar informacin del usuario. Podemos colocar cajas de texto, etiquetas, cuadros combinados, botones de comando, etc.

    Crear el Formulario Los formularios de Excel son creados desde el Editor de Visual Basic donde debemos seleccionar la opcin de men Insertar y posteriormente la opcin UserForm.

    Inmediatamente se mostrar un formulario en blanco y el Cuadro de herramientas:

  • Pgina 21 de 39

    (Si no ve el Cuadro de herramientas puedes seleccionar el men Ver y la opcin Cuadro de herramientas). Agregar controles al formulario Para agregar un control al formulario debe seleccionarlo del Cuadro de herramientas y dibujarlo sobre el formulario. En el formulario de la imagen de lneas arriba, hemos agregado etiquetas y cuadros de texto as como un par de botones de comando:

    El texto de las etiquetas se modifica en la propiedad llamada Caption. Para realizar este cambio solamente selecciona el control y se mostrar la ventana de Propiedades donde podr hacer la modificacin. De igual manera el texto desplegado en los botones de comando se modifica en su propiedad Caption.

  • Pgina 22 de 39

    Escribir el cdigo para el botn Cancelar El botn cancelar cerrar el formulario sin guardar la informacin capturada en ningn lugar. El cdigo que debemos utilizar es el siguiente:

    Private Sub CommandButton2_Click() Unload Me

    End Sub Para agregar este cdigo puede hacer doble clic sobre el control. La sentencia Unload Me cerrar el formulario. Escribir el cdigo para el botn Aceptar A diferencia del botn Cancelar, el botn Aceptar colocar los datos de las cajas de texto en las celdas A1, B1 y C1. El cdigo utilizado es el siguiente:

    Private Sub CommandButton1_Click() Worksheets("Hoja1").Range("A2").Value = Me.TextBox1.Value Worksheets("Hoja1").Range("B2").Value = Me.TextBox2.Value Worksheets("Hoja1").Range("C2").Value = Me.TextBox3.Value

    End Sub Dibujar el Botn para abrir formulario Para abrir el formulario dibujaremos un Botn de Comando (Control ActiveX) en la hoja. Para dibujar el botn en la hoja, siga los siguientes pasos:

    5. Seleccione la Ficha Programador. 6. Click en el Botn Modo Diseo. 7. Click en el Botn Insertar. 8. (Elija el control Botn de Comando y dibjelo con click sostenido en la hoja). 9.

  • Pgina 23 de 39

    Luego, hacemos doble click en el botn y esto nos lleva al editor de Visual Basic, donde escribimos: Private Sub CommandButton1_Click() UserForm1.Show End Sub

    El formulario est listo para ejecutarse, pero antes, en el Men de Excel, asegrese que el Botn Modo Diseo est deshabilitado, en caso contrario la macro no se ejecutar. Para deshabilitar el Botn Modo Diseo, bsquelo en la Ficha Programador y desactvelo. El formulario est funcionando, sin embargo, note que cada vez que ingresamos datos, los nuevos valores reemplazan a los anteriores, esto se debe a que le hemos indicado a Excel que escriba directamente en las celdas A2, B2 y C2.

    Pues bien, ahora cambiaremos las instrucciones para decirle a Excel que primero encuentre la ltima fila con datos y que escriba inmediatamente debajo de esa fila. Utilizaremos para ello la funcin CONTARA, aplicndola en la celda G1 as:

    =CONTARA(A:A)+1 De esta manera le decimos a Excel que CUENTE cuntos valores hay en la columna A y que a ese resultado le sume 1 unidad (con eso habremos encontrado la primera fila LIBRE de la columna A. Ahora, vaya al Editor de Visual Basic y modifique el cdigo de la siguiente manera:

    Private Sub CommandButton1_Click() 'Declaramos las variables Dim fila As Long 'Obtenemos el nmero de la fila disponible fila = Range(G1).Value 'Insertamos los datos capturados Cells(fila, 1).Value = UserForm1.TextBox1.Value

  • Pgina 24 de 39

    Cells(fila, 2).Value = UserForm1.TextBox2.Value Cells(fila, 3).Value = UserForm1.TextBox3.Value End Sub

    Limpiar el formulario Note que luego de agregar los datos, stos permanecen en las cajas de texto del formulario, para limpiarlo, agregamos el siguiente cdigo (el del recuadro rojo):

    Adems hemos agregado un mensaje emergente al final de la macro, el cual le avisar al usuario en qu fila ha insertado los datos! Verificar Repetidos Hasta aqu nuestro formulario funciona, pero si deseamos que verifique si no existen valores repetidos, entonces el cdigo debe modificarse de la siguiente manera:

    Private Sub CommandButton1_Click() 'PERMITE INGRESAR DATOS EN UNA AGENDA DE CLIENTES 'Declaramos las variables

    Dim fila As Long Dim duplicados As Boolean Dim nombre As String Dim telefono As String Dim mail As String

    'Asignamos los valores a las variables nombre = UserForm1.TextBox1.Value telefono = UserForm1.TextBox2.Value mail = UserForm1.TextBox3.Value duplicados = False

  • Pgina 25 de 39

    'Obtenemos el nmero de la fila disponible fila = Range(G1).Value

    'Verificamos si se estn ingresando datos duplicados For i = 1 To fila If Cells(i, 1).Value = nombre Then If Cells(i, 2).Value = telefono Then If Cells(i, 3).Value = mail Then 'Se encontraron datos duplicados MsgBox "Datos duplicados en la fila " & i duplicados = True End If End If End If Next i

    'Si ho existen duplicados, continuamos corriendo la macro If Not duplicados Then

    'Insertamos los datos capturados Cells(fila, 1).Value = UserForm1.TextBox1.Value Cells(fila, 2).Value = UserForm1.TextBox2.Value Cells(fila, 3).Value = UserForm1.TextBox3.Value

    'Limpiamos el formulario UserForm1.TextBox1.Value = "" UserForm1.TextBox2.Value = "" UserForm1.TextBox3.Value = ""

    'Notificamos al usuario MsgBox "Datos insertados en la fila " & fila End If

    End Sub

    Cuadros de Dilogo Los cuadros de dilogo tienen como principal objetivo administrar los intercambios de datos con el usuario: mostrar mensaje, solicitar datos, ver o escribir datos, etc. Pueden utilizarse 3 tipos de cuadros de dilogo:

    a) Los cuadros de dilogo de Excel, llamados Cuadros de Dilogo Integrados, que permiten, por ejemplo, abrir o guardar un archivo, definir las opciones de formato, imprimir, etc.

    b) Los Cuadros de Dilogo Predefinidos, que permiten mostrar un mensaje, hacer una pregunta al usuario o pedirle que introduzca un dato.

    c) Los Cuadros de Dilogo Personalizados o Formularios diseados por el programador o usuario y permiten mostrar una interfaz amigable, de acuerdo a la creatividad del mismo.

    a) Cuadros de Dilogo Integrados: 1. El Objeto Dialog

  • Pgina 26 de 39

    Son objetos Dialog, pertenecientes a la coleccin Dialogs del objeto Application. Su sintaxis es la

    siguiente: Application.Dialogs(xlDialog).Show donde xlDialog es una constante Excel que indica el cuadro de dilogo que se mostrar a travs de la instruccin Show. Ejemplos de constantes xlDialog Constante Cuadro de dilogo que muestra xlDialogBorder Bordes xlDialogFontProperties Formato de Fuente xlDialogDisplay Opciones de visualizacin xlDialogDefineName Definir Nombre xlDialogFormulaGoto Cuadro Ir A xlDialogOpen Abrir archivo xlDialogSaveAs Guardar archivo como xlDialogSort (con celdas seleccionadas) Ordenar xlDialogPrint Imprimir Solo resta practicar con la gran cantidad de cuadros de dilogo existentes, para as tomarles la mano y saber hacer uso de ellos cuando nuestros proyectos as lo requieran. Una cosa ms: podemos averiguar si el usuario hizo uso o no de ese cuadro de dilogo que le ofrecemos, con lo siguiente: ret = Application.Dialogs(xlDialogAlignment).Show En la variable "ret" almacenamos uno de dos posibles valores: si "ret" devuelve FALSO, es porque presionaron "cancelar". Mas que til a la hora de tomar acciones en base a lo realizado. 2. Los Mtodos GetOpenFileName y GetSaveAsFileName Pertenecen al objeto Application y permiten mostrar los cuadros abrir y guardar como del men Archivo. A diferencia de de los objetos Dialogs de similar nombre, stos mtodos no ejecutan ninguna accin, slo permiten recuperar el nombre del archivo seleccionado o introducido por el usuario. b) Los Cuadros de Dilogo Predefinidos 1. La Funcin InputBox Permite escribir y devuelve el texto ingresado por el usuario (lo almacena en una constante).

    SU sintaxis es: InputBox(Mensaje, Ttulo, Valor por defecto, posicin x, posicin y) Donde: Mensaje = Mensaje que vemos justo encima del campo donde el usuario introduce el valor. Ttulo = Ttulo del cuadro de dilogo que se muestra en la barra superior de este. Valor por defecto = Valor que se muestra en el campo donde el usuario introduce el valor y que se considerar por defecto en el caso de que no se introduzca expresamente ningn valor. Posicin x = n de twips que el cuadro se situar hacia la derecha, desde el borde izquierdo de la pantalla (15 twips = 1pixel). Posicin y = n de twips que el cuadro se situar hacia abajo, desde el borde superior de la pantalla.

  • Pgina 27 de 39

    2. La Funcin MsgBox Esta funcin muestra un mensaje, en un cuadro de dilogo, acompaado eventualmente de un icono y de 1 a 3 botones. SU sintaxis es la siguiente: MsgBox(Mensaje, botones, Ttulo). Es posible saber qu botn apret el usuario, a travs de su constante de retorno: Constante Tipo de botones vbOkOnly Muestra slo el botn Aceptar. vbOKCancel Muestra solamente los botones Aceptar y Cancelar. vbAbortRetryIgnore Muestra los botones Abandonar, Repetir e Ignorar. vbYesNoCancel Muestra los botones S, No y Cancelar. vbYesNo Muestra los botones S y No. VbRetryCancel Muestra los botones Repetir y Cancelar. Constante Tipo de Iconos

    vbCritical Muestra el icono vbQuestion Muestra el icono del signo de interrogacin

    vbExclamation Muestra el icono

    vbInformation Muestra el icono Devolver informacin: Si quiere que el programa utilice la respuesta del usuario, estas son las cifras que devuelve.

    Ok = 1 Cancel = 2 Abort = 3 Retry = 4 Ignore = 5 Yes = 6 No = 7

    EVENTOS EN EXCEL Los eventos en Excel son acciones iniciadas por el usuario, como el seleccionar una hoja diferente dentro del libro o modificar el valor de una celda. Al suceder dicho evento se ejecutar un procedimiento asociado el cual contendr nuestro cdigo VBA. La programacin de eventos fue introducida en Excel 97 y ha sido de gran utilidad desde entonces ya que nos permite ejecutar cdigo VBA en el momento exacto en que el usuario realiza alguna accin determinada o cuando hay un cambio de estado en la aplicacin. Es importante mencionar que el catlogo de eventos en Excel ya est definido y no podemos definir nuevos eventos. Adems, cada evento tiene asociado un procedimiento con un nombre y argumentos especficos que debemos respetar para poder utilizarlos. Por ejemplo, si queremos mostrar un mensaje al momento de seleccionar la hoja 2 de nuestro libro, debemos utilizar el evento Workbook_SheetActivate de la siguiente manera:

  • Pgina 28 de 39

    Private Sub Workbook_SheetActivate(ByVal Sh As Object) MsgBox Usted ha activado la hoja2 End Sub Si cambiamos el nombre del procedimiento por Workbook_SheetActivate2, el cdigo jams se ejecutar porque Excel buscar el procedimiento con el nombre correcto pero no lo encontrar. Es as como podemos hacer nuestra primera conclusin: Los eventos en Excel ya estn definidos en la herramienta y debemos utilizar el nombre del procedimiento asociado a cada uno de ellos respetando tambin sus argumentos. Jerarqua de eventos en Excel Existen tres objetos en Excel que contienen la mayora de los eventos generalmente utilizados: Application, Workbook y Worksheet. El objeto de mayor jerarqua es Application y se refiere a Excel mismo. El siguiente objeto en la jerarqua es el objeto Workbook que hace referencia a un libro de Excel y el ltimo objeto de la jerarqua es Worksheet y que hace referencia a una hoja de Excel.

    Cada uno de estos objetos contiene eventos por s mismo pero tambin contiene eventos que hacen referencia a los eventos de los objetos por debajo de la jerarqua. Por ejemplo, el objeto Workbook tiene el evento SheetActivate que se activar cada vez que seleccionamos una hoja diferente de nuestro libro. El objeto Worksheet tiene el evento Activate que se ejecuta tambin al seleccionar una hoja especfica del libro. La diferencia entre ambos eventos es la siguiente. Si queremos ejecutar un cdigo solamente para la Hoja1, debemos utilizar el evento Activate del objeto Worksheet, pero si queremos que nuestro cdigo se ejecute al activar cualquier hoja del libro, entonces debemos utilizar el evento SheetActivate del objeto Workbook que al estar un nivel superior en la jerarqua tendr la capacidad de activar dicho evento sobre todas las hojas del libro.

  • Pgina 29 de 39

    La ejecucin comienza siempre con los eventos del objeto de menor jerarqua y contina con los objetos de mayor jerarqua. En nuestro ejemplo, al seleccionar la Hoja1 se mostrar primero el mensaje del procedimiento Worksheet_Activate y posteriormente el mensaje del procedimiento Workbook_SheetActivate. Eventos disponibles para un objeto Hasta ahora hemos hablado sobre los eventos de Excel y los procedimientos vinculados a cada uno de ellos. Tambin conocemos los objetos que contienen los eventos, su jerarqua y el orden de ejecucin, as que solo nos resta saber cules son todos los eventos disponibles para cada objeto. Un beneficio que nos ofrece el Editor de Visual Basic es que provee dos listas desplegables en la parte superior del panel derecho donde podremos elegir el objeto y de inmediato sus procedimientos sern desplegados en la segunda lista. Al seleccionar alguno de los eventos de la segunda lista se insertar el cdigo del procedimiento utilizando el nombre y argumentos adecuados en espera de que introduzcamos el cdigo VBA que ser ejecutado al suceder el evento.

    Ubicacin del cdigo para un evento Ahora que ya sabemos cmo identificar todos los eventos de un objeto es necesario conocer la ubicacin donde debemos colocar el procedimiento asociado a cada uno de ellos. Para los eventos del objeto

  • Pgina 30 de 39

    Worksheet es necesario colocar el cdigo dentro del mdulo asociado a cada hoja. Para el ejemplo mencionado anteriormente, coloqu el cdigo del evento Activate dentro del mdulo de la Hoja1 y el cdigo del evento SheetActivate dentro del mdulo ThisWorkbook, de la siguiente manera:

  • Pgina 31 de 39

    CDIGOS MS UTILIZADOS EN MACROS A continuacin veremos algunas de las instrucciones bsicas para ser utilizadas en macros, puede copiarlas al Editor de VBA y combinarlas segn su necesidad.

    Trabajando con LIBROS 1-Abrir un segundo libro: Workbooks.Open "C:\Mis docu\Libro1.xlsb" o tambin: Application.Workbooks.Open "C:\.....\Libro1.xlsb" Nota: Si el nombre se encuentra en una varible NO lleva comillas Ej. 1: la variable 'libro2' contiene el nombre y la extensin. Workbooks.Open ThisWorkBook.Path & "\" & libro2 Ej. 2: la variable 'libro2' contiene solo el nombre. Workbooks.Open ThisWorkBook.Path & "\" & libro2 & ".xlsm" 2-Activar un segundo libro: Workbooks("LibroOriginal.xlsm").Activate o tambin: Workbooks(1).Activate , en este caso es el 1er libro abierto. IMPORTANTE: Al abrir un libro, ste pasa a ser el libro activo. Por lo tanto no es necesario activarlo nuevamente. 3-Cerrar un libro Ej. 1: sin guardar cambios: Workbooks("Libro1.xls").Close False o tambin: ActiveWorkbook.Close False Ej. 2: guardando los cambios: ActiveWorkbook.Save ActiveWorkbook.Close o en 1 sola lnea: ActiveWorkBook.Close True Nota: Si slo usa ActiveWorkbook.Close, se le preguntar si desea guardar los cambios. 4-Guardar un libro con otro nombre o ruta: Ej. 1: La carpeta y el nombre del libro pueden guardarse en variables, como en este caso: ruta = C:\Datos\ libro = "LibroCopia.xlsm" La instruccin sera: ActiveWorkbook.SaveAs ruta & libro

    IMPORTANTE: tener presente que si en las variables no se incluye barra separadora o extensin del libro, deber agregarse en la instruccin, por ejemplo si las variables fueran:

    ruta = C:\Datos libro = LibroCopia La instruccin sera:

  • Pgina 32 de 39

    ActiveWorkbook.SaveAs ruta & \ & libro & .xlsm Ej. 2: Guardar un libro cuyo nombre ser el valor de una celda: ActiveWorkbook.SaveAs Filename:=Range("A2").Value

    Nota: en este caso como no se ha indicado la ruta o carpeta, el archivo ser guardado en la misma carpeta del libro activo.

    5-No mostrar aviso al salir, al eliminar hoja, o cualquier aviso que queremos omitir: Application.DisplayAlerts= False Importante: Volver a TRUE al finalizar la macro: Application.DisplayAlerts= True 6-No mostrar la ejecucin de la macro (movimiento de pantalla): Application.ScreenUpdating = False Importante: Volver a TRUE al finalizar la macro: Application.ScreenUpdating = True

    Trabajando con Hojas 1-Seleccionar la hoja anterior o siguiente: ActiveSheet.Previous.Select 'hoja anterior a la activa ActiveSheet.Next.Select 'hoja posterior a la activa 2-Obtener datos de la hoja: nbre = ActiveSheet.Name 'nombre de la hoja nroH = ActiveSheet.Index 'nmero de hoja 3-Copiar datos de una hoja a la siguiente: Ej. 1: Se copia un rango previamente seleccionado a la hoja sgte. Selection.Copy o tambin: Range("A5:H10").Copy para pegarlo: ActiveSheet.Paste Destination:=ActiveSheet.Next.Range("B2") Ej. 2 : Mtodo abreviado, donde se copia en otra hoja a partir de B2 Range("A5:H10").Copy Destination:=Sheets("Base").Range("B2") NOTA: las 'copias' tienen muchos detalles a considerar: con/sin formatos, con/sin frmulas, etc. 4- Mover o Copiar la hoja entera:

  • Pgina 33 de 39

    Se realiza una copia de la hoja activa, colocndola al final de todas. Sheets("Hoja1").Copy After:=Sheets(Sheets.Count) Nota: recordar que luego de la copia la hoja activa es la que se acaba de crear. 5- Ocultar filas o columnas: ActiveCell.EntireRow.Hidden=True ' Oculta las filas ActiveCell.EntireColumn.Hidden= True 'Oculta las columnas Nota: para volverlas a mostrar utilizar la instruccin en False. Por ej: 6-Proteger o desproteger una hoja: ActiveSheet.Protect "contrasea" 'proteger con contrasea ActiveSheet.Unprotect "contrasea" 'quitar la proteccin

    Nota: Para obtener el cdigo con ciertos permisos que se pueden seleccionar desde la ventana de Proteccin, realizar los pasos con la grabadora de macros.

    7-Insertar filas o columnas a partir de cierta ubicacin: Insertar columnas: ActiveSheet.Column(i).Select Selection.EntireColumn.Insert

    Nota: Usted debe reemplazar i del ejemplo, por el n de columna y recuerde que la nueva columna se inserta a la izquierda de la columna activa.

    Insertar filas: ActiveSheet.Row(i).Select Selection.EntireRow.Insert

    Nota: Usted debe reemplazar i del ejemplo, por el n de fila y recuerde que la nueva fila se inserta por encima de la fila activa.

    8-Eliminar filas o columnas: Ej. 1: eliminar la fila 7 de hoja activa ActiveSheet.Rows("7:7").Select Selection.EntireRow.Delete Ej. 2: eliminar cierta fila de hoja 'Base' filx = 5 Sheets("BASE").Range("A" & filx).EntireRow.Delete Nota: observe que en este caso no es necesario seleccionar previamente la fila. 9-Insertar una imagen en una hoja: Ej. 1: se indica la ruta de la imagen en el mismo cdigo ActiveSheet.Pictures.Insert ("D:\Mis imgenes\img01.JPG") Ej. 2: se indica la ruta de la imagen en una celda. Adems la imagen queda seleccionada

  • Pgina 34 de 39

    ruta = ActiveSheet.Range("B5") ActiveSheet.Pictures.Insert(ruta).Select Nota: la ruta va entre comillas, por ej: "C:\Mis docu\Foto1.jpg"

    Trabajando con Celdas 1- Formas de seleccionar una celda o un rango de celdas: Range("B7").Select selecciona la celda B7 Range("B:B").Select selecciona toda la columna B Range("A4:A10, D10, B5:B20").Select selecciona rangos discontinuos Range("A:A, D:F").Select selecciona las columnas A, D, E y F Range("2:2, 4:7").Select selecciona las filas 2 y desde 4 hasta la 7 2- Seleccionar celdas a cierta distancia de la celda activa: Sheets(1).Range("A1").Offset(2,3).Select '2 filas hacia abajo y 3 col a derecha de A1 = D3 ActiveCell.Offset(-10,1).Select 'selecciona la celda que se encuentra 10 filas por encima y 1 columna a la derecha de la celda activa. 3- Ampliar un rango seleccionado Selection.Resize(10,4).Select ' (10 filas, 4 columnas) Nota: Si el rango seleccionado fue A1:B5 ahora ser: A1:D10 4- Seleccionar el rango donde se encuenra la celda activa: Range("B2").CurrentRegion.Select 5- Guardar la direccin de una celda en una variable: lugar= ActiveCell.Address 'guarda la referencia absoluta, por ej: $E$2 lugar= ActiveCell.Address(False, False) 'guarda la referencia relativa, por ej: E2 6- Copiar un comentario en otra celda: ActiveCell.Offset(0,1).Value = ActiveCell.Comment.Text 'copia el comentario de la celda activa en la celda que se encuentra en la columna siguiente. 7-Seleccionar celdas y borrarlas: Range(rango). Select 'previamente se asign a la variable rango una ref Selection.ClearContents 'borra contenidos Selection.Clear 'borra todo (contenidos, formatos, etc)

    Nota: La expresin Cells indica el total de celdas de una hoja. Entonces la instruccin: Cells.Clearcontents borrar el contenido del total de celdas de la hoja activa.

  • Pgina 35 de 39

    8- Combinar - descombinar celdas selecccionadas: Range("B1:E1").Select Selection.Merge Nota: Para quitar la combinacin se utilizar: Unmerge 9- Seleccionar hasta la ltima celda no vaca: Range("A2", Range("A2").End(xlDown)).Select 'selecciona desde A2 hacia abajo Range("A2", Range("A2").End(xlToRight)).Select 'selecciona desde A2 hacia la derecha Range("D2", Range("D2").End(xlToLeft)).Select 'selecciona desde D2 hacia la izquierda Range("A20", Range("A20").End(xlUp)).Select 'selecciona desde A20 hacia arriba 10- Obtener la primer celda vaca, en col A: Range("A65536").End(xlup).Row + 1 'o tambin: Range("A2").End(xlDown).Row + 1

    Trabajando con Colecciones Una coleccin es un conjunto de objetos del mismo tipo: hojas, celdas, controles o Shapes, imgenes. Para trabajar con una coleccin se programa un bucle: es decir repetir la misma instruccin para cada elemento de la coleccin. A continuacin algunos ejemplos del bucle: For Each....Next Ejemplo1: introducir un nombre para cada hoja del libro activo. Esta rutina se coloca en un mdulo: Sub nombraHojas()

    Dim MiNombre As String Dim hoja As Worksheet

    'controla posible error al ingresar un nombre de hoja no vlido On Error Resume Next For Each hoja In Worksheets MiNombre = InputBox("Ingrese nombre para esta hoja: ") If MiNombre "" Then hoja.Name = MiNombre Next hoja End Sub Ejemplo2: introducir valores para cada celda de un rango (se coloca en un mdulo) Sub colocaValores() Dim celdita as Range For Each celdita in ActiveSheet.Range("A1:B10") celdita.Value = InputBox("Ingrese valor: ")

  • Pgina 36 de 39

    Next celdita End Sub Ejemplo3: introducir los mismos valores en las mismas celdas de todas las hojas. Sub valoresHoja() Dim hoja as Sheets For Each hoja in Sheets hoja.Range("E3").Value = Date hoja.Range("F3").Value = Time Next hoja End Sub Ejemplo 4: realizar una accin por cada valor que tome una variable i (En este ejemplo se muestra el nombre de cada hoja, desde la nro 1 a la 5) Sub muestraNombre() Dim i as Byte Dim hoja as Worksheet 'se controla posible error de que no existan tantas hojas On Error Resume Next For i=1 to 5 Msgbox WorkSheets(i).Name Next End Sub OTRO TIPO DE BUCLES: Ejemplo2: realizar una accin mientras se cumpla una condicin (se coloca en un mdulo) Sub recorreRango() 'Se recorre la col A a partir de la fila 2 hasta encontrar una celda vaca. 'El valor de cada celda se incrementa en 1 Range("A2").Select 'se controla posible error de que la celda contenga texto On Error resume next While Activecell.Value "" ActiveCell.Value = ActiveCell.Value + 1 'pasa a la fila siguiente ActiveCell.Offset(1,0).Select Wend End Sub Bucles de repeticin:DoLoop

  • Pgina 37 de 39

    Este bucle comprueba que se ejecute una serie de instrucciones hasta que se cumpla una condicin determinada. Por ejemplo en el siguiente cdigo forzamos que se escriban los nmeros desde el 1 hasta el 11, para ello usamos una variable contador que la inicializamos en 0 y a partir de aqu le sumamos 1 hasta que llege al 11. Sub ejemplo() Dim i As Byte i = 0 Do Until i = 11 i = i + 1 Cells(i, 1) = i Loop End Sub Una variante de este bucle sera Do whileloop

    Sub ejemplo2() Dim i As Byte i = 0 Do While i < 20 i = i + 1 Cells(i, 1) = i Loop

    End Sub Otra variante es Do Loop While Esta estructura es similar a la anterior pero la condicin se evala al final. La consecuencia inmediata de esto es que el flujo del programa entra en el bucle directamente la primera ver que se ejecuta. Al final se evala la condicin y se decide si se repite el bucle, pero al menos se ha ejecutado una vez. Bucles de repeticin: Fornext Ejemplo: vamos a realizar un ejercicio que nos muestre los cuadrados de los nmeros 1 al 5. Sub cuadrado()

    On Error Resume Next Dim x, y As Byte For x = 1 To 5 y = x * x MsgBox El cuadrado de & x & es & y Next

    End Sub Como vemos, el bucle ha ido recorriendo los nmeros de 1 en 1 y mostrndonos sus cuadrados. Si deseamos que lo haga por ejemplo de 2 en 2, tenemos que especificarlo con la expresin step. Ahora, supongamos que deseamos hacer el mismo clculo pero con los nmeros pares del 1 al 12:

  • Pgina 38 de 39

    Sub cuadrado_par()

    On Error Resume Next Dim x, y As Byte For x = 2 To 12 Step 2 y = x * x MsgBox El cuadrado de & x & es & y Next End Sub Por cierto se habr percatado de la presencia de una lnea de cdigo al comienzo del bucle On Error Resume Next. Con esta sentencia evitamos que el programa se cuelge ante la presencia de errores ms o menos viene a decir: en presencia de error salta al siguiente paso.

    Enfrentarse a los errores Pueden aparecer los siguientes tipos de errores al escribir y ejecutar procedimientos VBA:

    Sintaxis y errores gramaticales: Estos son los errores ms fciles de corregir, porque el editor ayuda a encontrarlos, si no son corregidos estos provocan un error de compilacin, de ah el mensaje que aparece.

    Errores en tiempo de ejecucin: Estos errores no pueden ser detectados hasta que no se ejecuta el procedimiento en su entorno final.

    Errores lgicos: Estos errores simplemente dan una respuesta equivocada, el procedimiento hace justo lo que le hemos dicho que haga, pero el resultado no es el esperado.

    Administracin de errores Hay errores que pueden hacer que VBA se comporte de forma imprevisible. Para evitar esto, es posible manejar el error con ayuda de la instruccin On Error, que indica una secuencia de instrucciones que se ejecutan en caso de error. Sub GOTOMacro() Dim X, Y On Error GoTo CasoError Y = [A1] / [B1] ' Si diera error, saltara a la lnea 'CasoError' For X = 1 To 50 Cells(X, 1) = X Next X Exit Sub CasoError: MsgBox "Ha surgido un error, intente con otros valores en A1 y B1" End Sub

  • Pgina 39 de 39

    Hay tres sintaxis diferentes: Resumen O: reanuda la ejecucin del cdigo donde se produjo el error. Resumen Next: reanuda a partir de la instruccin siguiente. Resumen Linea: reanuda en una lnea especfica.

    * * * 100 % * * * Gracias por su participacin!! Consultas (y contratos) a:

    Rubby Cortz Vogth

    SAAD Servicios

    7800 6371 700 85 839 [email protected]