Excel Avanzado 2016 v.1.3

Excel Avanzado 2016 v. 1.3 Docente: Lenin Huayta Flores UNIVERSIDAD NACIONAL DEL Instituto de Informática Contenido 1

Views 199 Downloads 91 File size 3MB

Report DMCA / Copyright

DOWNLOAD FILE

Recommend stories

Citation preview

Excel Avanzado 2016 v. 1.3 Docente: Lenin Huayta Flores

UNIVERSIDAD NACIONAL DEL Instituto de Informática

Contenido 1. USO DEL CUADRO DE CONTROLES PARA APLICACIONES..........................................................................3 2. MACROS, EJECUCIÓN DE MACROS.........................................................................................................19 2.1. MACRO...............................................................................................................................................19 2.2. CREAR MACRO CON LA GRABADORA.................................................................................................19 2.3. PROGRAMACIÓN ORIENTADA A OBJETOS...........................................................................................26 2.3.1. ALGORITMO....................................................................................................................................26 2.3.2. REFERENCIA A OBJETOS..................................................................................................................26 2.3.3. VARIABLES.......................................................................................................................................27 2.3.4. PROPIEDADES, MÉTODOS Y EVENTOS............................................................................................27 2.3.5. MÓDULO.........................................................................................................................................28 2.3.6. PROCEDIMIENTO............................................................................................................................28 2.3.7. EJECUCION DE PROCEDIMIENTO....................................................................................................30 2.3.8. TIPOS DE DATOS EN VISUAL BASIC PARA EXCEL..............................................................................34 2.3.9. CONVERSIÓN DE TIPO DE DATOS....................................................................................................34 2.3.10. FUNCIONES DE CONVERSIÓN DE TIPO DE DATOS...........................................................................35 2.3.11. OBJETOS MÁS UTILIZADOS Y SUS PROPIEDADES............................................................................36 2.3.12. VARIABLES DE OBJETOS..................................................................................................................36 2.3.13. ESTRUCTURAS CONDICIONALES.....................................................................................................38 2.3.14. OPERADORES LÓGICOS...................................................................................................................41 2.3.15. ESTRUCTURA SELECT CASE.............................................................................................................44 2.3.16. FUNCIONES DE COMPROBACIÓN....................................................................................................46 2.3.17. LA FUNCION MsgBox......................................................................................................................48 2.3.18. TABLA PARA BOTONES E ÍCONOS DEL CUADRO MsgBox.................................................................48 2.3.19. LA INSTRUCCIÓN With....................................................................................................................50 2.3.20. ESTRUCTURAS REPETITIVAS............................................................................................................51 3. EXCEL CON VISUAL BASIC PARA APLICACIONES.....................................................................................62 4. DISEÑO Y PROGRAMACIÓN DE FORMULARIOS......................................................................................82 5. Diseño de Aplicaciones para su Ejecución en Red..................................................................................98

Ing. Lenin Huayta Flores

2

UNIVERSIDAD NACIONAL DEL Instituto de Informática

1. USO DEL CUADRO DE CONTROLES PARA APLICACIONES Para poder trabajar con controles para aplicaciones habilitamos primeramente la pestaña o ficha llamada DESARROLLADOR: ARCHIVO – Opciones – Personalizar cinta de opciones Habilitamos Desarrollador de la siguiente forma:

Luego pulsamos el botón de comando Aceptar, de tal manera que quede así:

Crear una nueva hoja de cálculo llamado: Sesión 01, ingresar datos desde H1:H20 tal como se muestra a continuación:

Ing. Lenin Huayta Flores

3

UNIVERSIDAD NACIONAL DEL Instituto de Informática

Seleccionamos toda la hoja Botón y vamos a DESARROLLADOR – Código - Grabar Macro. -

Nombre a la macro: Tecla de método abreviado: Guardar macro en: Descripción:

Formato C Este Libro Macro grabada el 16/11/2013 por Lenin Huayta Flores

Pulse el botón de comando Aceptar.

Ing. Lenin Huayta Flores

4

UNIVERSIDAD NACIONAL DEL Instituto de Informática

Cambiamos el formato de fuente en la pestaña INICIO - Fuente: Garamond - Tamaño: 16 - Color: Verde - Negrita, Cursiva y Subrayado.

Detener el grabado de la macro en la pestaña DESARROLLADOR – Código – Detener grabación. Veamos el código generado en DESARROLLADOR – Código – Visual Basic – Módulo 1. Otra manera de acceder es pulsando la combinación de teclas ALT + F11.

Ing. Lenin Huayta Flores

5

UNIVERSIDAD NACIONAL DEL Instituto de Informática

Seleccionamos la hoja Botón e ir a INICIO – Modificar – Borrar – Borrar formatos

Ing. Lenin Huayta Flores

6

UNIVERSIDAD NACIONAL DEL Instituto de Informática

Guardar el archivo con el Nombre Sesión 01, activando el Tipo: Libro de Excel habilitado para macros – Guardar.

Luego escriba su nombre y apellidos en cualquier celda de la hoja Botón, e ir a DESARROLLADOR – Macros - Ver macros

Ing. Lenin Huayta Flores

7

UNIVERSIDAD NACIONAL DEL Instituto de Informática

Seleccionamos la macro Formato y hacemos clic en Ejecutar.

Seleccionar las celdas e ir a INICIO – Modificar – Borrar – Borrar formatos. Inserte un botón: DESARROLLADOR – Insertar – Controles de formulario – Botón

Dibuje el botón y seleccione la macro Formato y haga clic en el botón de comando Aceptar:

Ing. Lenin Huayta Flores

8

UNIVERSIDAD NACIONAL DEL Instituto de Informática

Cambiar el texto del botón haciendo clic derecho sobre el botón y seleccione Modificar texto:

Cambiamos el nombre del botón a Formato, hacer clic fuera del botón. Escriba un texto en la hoja y presione el botón de comando Formato.

Activar la hoja Cuadro combinado e ir a: DESARROLLADOR – Insertar – Cuadro combinado

Ing. Lenin Huayta Flores

9

UNIVERSIDAD NACIONAL DEL Instituto de Informática

Dibujar el cuadro combinado en la hoja, haga clic derecho encima del cuadro combinado y seleccionar Formato de control. Rango de entrada: (Seleccione el rango de entrada en la hoja Datos desde H1:H20) Vincular con la celda: A1

De manera que, quede así:

Ing. Lenin Huayta Flores

10

UNIVERSIDAD NACIONAL DEL Instituto de Informática

Activar la hoja Casilla e ir a: DESARROLLADOR – Insertar – Casilla

Dibujar 3 casillas en la hoja, cambie los nombres de las casillas:

Haga clic derecho encima las casillas e ir a Formato de control.

Vincular con la celda: A1 (Básico), A2 (Intermedio) y A3 (Avanzado) respectivamente. Veamos el comportamiento de las casillas:

Ing. Lenin Huayta Flores

11

UNIVERSIDAD NACIONAL DEL Instituto de Informática

Activar la hoja Control de Número e ir a: DESARROLLADOR – Insertar – Control de número

Dibujar el control de número en la hoja, haga clic derecho encima del control y seleccionar Formato de control.

Valor actual: Valor mínimo:

1 1

Ing. Lenin Huayta Flores

12

UNIVERSIDAD NACIONAL DEL Instituto de Informática

Valor máximo: Incremento: 1 Vincular con la celda: A1

100

Veamos el comportamiento del control de número:

Activar la hoja Cuadro de lista e ir a: DESARROLLADOR – Insertar – Cuadro de lista

Dibujar el cuadro de lista en la hoja, haga clic derecho encima del control y seleccionar Formato de control. Rango de entrada: (Seleccione el rango de entrada en la hoja Datos desde H1:H20) Vincular con la celda: A1

Ing. Lenin Huayta Flores

13

UNIVERSIDAD NACIONAL DEL Instituto de Informática

Presionamos el botón de comando Aceptar. De manera que, quede así:

Activar la hoja Botón de opción e ir a: DESARROLLADOR – Insertar – Botón de opción

Ing. Lenin Huayta Flores

14

UNIVERSIDAD NACIONAL DEL Instituto de Informática

Dibujar 2 botones de opción en la hoja, cambie los nombres de los botones:

Haga clic derecho encima del botón de opción Masculino e ir a Formato de control.

Vincular con la celda: A1 (Masculino) y A1 (Femenino). Veamos el comportamiento de los botones de opción:

Ing. Lenin Huayta Flores

15

UNIVERSIDAD NACIONAL DEL Instituto de Informática

Activar la hoja Cuadro de grupo y Etiqueta e ir a: DESARROLLADOR – Insertar – Cuadro de grupo e insertar Etiqueta

Dibujar un Cuadro de grupo y una Etiqueta2 botones de opción en la hoja, cambie los nombres de los botones:

Estos controles son utilizados para el diseño de nuestros formularios.

Ing. Lenin Huayta Flores

16

UNIVERSIDAD NACIONAL DEL Instituto de Informática

Activar la hoja Barra de desplazamiento e ir a: DESARROLLADOR – Insertar – Barra de desplazamiento

Dibujar la barra de desplazamiento en la hoja, haga clic derecho encima del control y seleccionar Formato de control. Valor actual: 1 Valor mínimo: 0 Valor máximo: 100 Incremento: 5 Cambio de página: 10 Vincular con la celda: A1 Presionamos el botón de comando Aceptar.

Ing. Lenin Huayta Flores

17

UNIVERSIDAD NACIONAL DEL Instituto de Informática

Veamos el comportamiento de la barra de desplazamiento:

PRÁCTICA 01 Abrir el archivo Práctica 01.xlsx, en activamos la hoja Registro y realizamos el siguiente formulario

Ing. Lenin Huayta Flores

18

UNIVERSIDAD NACIONAL DEL Instituto de Informática

Valores de las celdas: D6: =HOY() B14: Clic derecho en el Cuadro combinado – Formato de control

B16: Clic derecho en el Cuadro combinado – Formato de control

Ing. Lenin Huayta Flores

19

UNIVERSIDAD NACIONAL DEL Instituto de Informática

B18: =BUSCARV(C16,Datos!A15:C19,3,FALSO)

Botones de opción: Contratado y Nombrado

Guardar como archivo macro Práctica 01.xlsm (ARCHIVO – Guardar como – Equipo – Examinar)

Presione el botón de comando Aceptar. Ing. Lenin Huayta Flores

20

UNIVERSIDAD NACIONAL DEL Instituto de Informática

Ir a la pestaña o ficha DESARROLLADOR – Visual Basic o puede también realizando la combinación de teclas ALT + F11, creamos un Módulo1 (clic derecho en VBAProject (Práctica 01.xlsm) – Insertar – Módulo).

En Módulo 1 crear el procedimiento Registro() y realizar el código siguiente: Sub Registro() Dim HojaPlanilla As Worksheet Dim HojaRegistro As Worksheet Set HojaPlanilla = Worksheets(3) Set HojaRegistro = Worksheets(2) Dim i As Integer i = HojaRegistro.Range("C23") HojaPlanilla.Cells(i, 1).Value = HojaRegistro.Cells(8, 2).Value HojaPlanilla.Cells(i, 2).Value = HojaRegistro.Cells(10, 2).Value HojaPlanilla.Cells(i, 3).Value = HojaRegistro.Cells(12, 2).Value HojaPlanilla.Cells(i, 4).Value = HojaRegistro.Cells(14, 3).Value HojaPlanilla.Cells(i, 6).Value = HojaRegistro.Cells(16, 3).Value HojaPlanilla.Cells(i, 8).Value = HojaRegistro.Cells(18, 2).Value HojaPlanilla.Cells(i, 9).Value = HojaRegistro.Cells(21, 3).Value HojaPlanilla.Cells(i, 11).Value = HojaRegistro.Cells(6, 4).Value HojaRegistro.Range("C23").Value = HojaRegistro.Range("C23").Value + 1 End Sub Al Botón de comando Registrar se le asigna la macro Registro Ing. Lenin Huayta Flores

21

UNIVERSIDAD NACIONAL DEL Instituto de Informática

Activar la hoja Planilla y realice lo siguiente: Valores de celdas: E6: =SI(D6>0,BUSCARV(Planilla!D6,Datos!$A$2:$B$6,2,FALSO),"") G6: =SI(F6>0,BUSCARV(F6,Datos!$A$15:$C$19,2,FALSO),"") J6: =SI(I6=1,"Contratado",SI(I6=2,"Nombrado","")) Activar la hoja Constancia, realice lo siguiente: Valores de celdas: B11: =BUSCARV(B9,Planilla!A6:K19,2,FALSO) B13: =BUSCARV(B9,Planilla!A6:K19,3,FALSO) B15: =BUSCARV(B9,Planilla!A6:K19,5,FALSO) B17: =BUSCARV(B9,Planilla!A6:K19,7,FALSO)

Ing. Lenin Huayta Flores

22

B19: =BUSCARV(B9,Planilla!A6:K19,8,FALSO) H9: =BUSCARV(B9,Planilla!A6:K19,11,FALSO) H13: =BUSCARV(B9,Planilla!A6:K19,10,FALSO) H26: =AHORA()

Guarde los cambios e ingrese datos. 2. MACROS, EJECUCIÓN DE MACROS 2.1.MACRO Una macro es una secuencia de instrucciones escritas en lenguaje VBA que se almacenan en un módulo. Tenemos dos maneras de crear una macro. Una es empleando la herramienta Grabar macros, y la otra es escribiendo las instrucciones en el Editor de Visual Basic que se encuentra embebido en Excel. La manera más rápida y sencilla de crear una macro es utilizando la grabadora de macros, ya que no necesitamos tener ningún conocimiento previo de programación en VBA. 2.2.CREAR MACRO CON LA GRABADORA Haga clic en la ficha DESARROLLADOR y presione el botón Grabar macro. En Grabar macro, asigne un Nombre a la macro; en este caso, Formato_personal. Establezca una combinación de teclas para la macro ingresando, en el cuadro de edición, una letra; en este caso, la A mayúscula. Finalmente, grabe la macro en el libro activo seleccionando la opción Este libro de la lista Guardar macro en. Por último, presione Aceptar para iniciar la grabación.

Use las opciones Fuente, Tamaño de letra, Color de fuente, Negrita del grupo lógico Fuente de la ficha INICIO, para darle formato a la tipografía. Luego de hacer este cambio, presione el botón Detener grabación. Para probar la macro, sitúese en una celda o celdas, presione el botón Macros de la ficha DESARROLLADOR,

En el cuadro de diálogo Macro, seleccione la macro Formato_Personal. Luego, haga clic en el botón Ejecutar para ver cómo se modifica la letra de la celda o celdas. EJEMPLO 01: Grabe una macro que genere la siguiente tabla:

Terminada la grabación, Ir a DESARROLLADOR – Código – Macros – Modificar

El código de la macro se muestra en la ventana derecha, en éste se pueden modificar borrar o agregar nuevas instrucciones (de Visual Basic). Sub Tabla() ' ' Tabla Macro ' ' Acceso directo: Ctrl+Mayús+T ' Range("A1:D1").Select With Selection .HorizontalAlignment = xlCenter .VerticalAlignment = xlBottom .WrapText = False .Orientation = 0 .AddIndent = False .IndentLevel = 0 .ShrinkToFit = False .ReadingOrder = xlContext .MergeCells = False End With

Selection.Merge ActiveCell.FormulaR1C1 = "Reporte de ventas" Range("A1:D1").Select Selection.Font.Bold = True Range("A4").Select Columns("A:A").ColumnWidth = 22.29 Columns("A:A").ColumnWidth = 26.43 Range("A3:D3").Select With Selection.Interior .Pattern = xlSolid .PatternColorIndex = xlAutomatic .ThemeColor = xlThemeColorLight2 .TintAndShade = 0.799981688894314 .PatternTintAndShade = 0 End With Range("A4:A12").Select With Selection.Interior .Pattern = xlSolid .PatternColorIndex = xlAutomatic .ThemeColor = xlThemeColorLight2 .TintAndShade = 0.799981688894314 .PatternTintAndShade = 0 End With Range("A3").Select ActiveCell.FormulaR1C1 = "Concepto" Range("B3").Select ActiveCell.FormulaR1C1 = "Unidades" Range("C3").Select ActiveCell.FormulaR1C1 = "Precio" Range("D3").Select ActiveCell.FormulaR1C1 = "Subtotal" Range("D4:D13").Select Selection.NumberFormat = _ "_ [$S/.-280A] * #,##0.00_ ;_ [$S/.-280A] * -#,##0.00_ ;_ [$S/.-280A] * ""-""??_ ;_ @_ " Selection.NumberFormat = _ "_ [$S/.-280A] * #,##0.00_ ;_ [$S/.-280A] * -#,##0.00_ ;_ [$S/.-280A] * ""-""??_ ;_ @_ " Range("B4:C12").Select Selection.NumberFormat = "0.00" Range("D4").Select ActiveCell.FormulaR1C1 = "=RC[-2]+RC[-1]" Range("D4").Select Selection.AutoFill Destination:=Range("D4:D12"), Type:=xlFillDefault Range("D4:D12").Select Range("D13").Select ActiveCell.FormulaR1C1 = "=SUM(R[-9]C:R[-1]C)" Range("D13").Select With Selection.Interior .Pattern = xlSolid .PatternColorIndex = xlAutomatic

.ThemeColor = xlThemeColorLight2 .TintAndShade = 0.799981688894314 .PatternTintAndShade = 0 End With Range("C13").Select ActiveCell.FormulaR1C1 = "Total" Range("C13").Select With Selection .HorizontalAlignment = xlRight .VerticalAlignment = xlBottom .WrapText = False .Orientation = 0 .AddIndent = False .IndentLevel = 0 .ShrinkToFit = False .ReadingOrder = xlContext .MergeCells = False End With Range("A3:D3").Select Selection.Font.Bold = True Range("C13").Select Selection.Font.Bold = True Range("A3:D3").Select With Selection .HorizontalAlignment = xlGeneral .VerticalAlignment = xlCenter .WrapText = False .Orientation = 0 .AddIndent = False .IndentLevel = 0 .ShrinkToFit = False .ReadingOrder = xlContext .MergeCells = False End With With Selection .HorizontalAlignment = xlCenter .VerticalAlignment = xlCenter .WrapText = False .Orientation = 0 .AddIndent = False .IndentLevel = 0 .ShrinkToFit = False .ReadingOrder = xlContext .MergeCells = False End With Range("A3:D13").Select Range("A3:D12").Select Selection.Borders(xlDiagonalDown).LineStyle = xlNone Selection.Borders(xlDiagonalUp).LineStyle = xlNone

With Selection.Borders(xlEdgeLeft) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlThin End With With Selection.Borders(xlEdgeTop) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlThin End With With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlThin End With With Selection.Borders(xlEdgeRight) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlThin End With With Selection.Borders(xlInsideVertical) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlThin End With With Selection.Borders(xlInsideHorizontal) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlThin End With Range("D13").Select Selection.Borders(xlDiagonalDown).LineStyle = xlNone Selection.Borders(xlDiagonalUp).LineStyle = xlNone With Selection.Borders(xlEdgeLeft) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlThin End With With Selection.Borders(xlEdgeTop) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0

.Weight = xlThin End With With Selection.Borders(xlEdgeBottom) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlThin End With With Selection.Borders(xlEdgeRight) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlThin End With With Selection.Borders(xlInsideVertical) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlThin End With With Selection.Borders(xlInsideHorizontal) .LineStyle = xlContinuous .ColorIndex = 0 .TintAndShade = 0 .Weight = xlThin End With Range("A1:D1").Select Selection.Font.Size = 12 Selection.Font.Size = 14 Range("D13").Select End Sub Realice cambios en color de Fuente. Y presione la combinación de teclas CTRL + S o de un clic en el botón . Ejecute la macro y observe el cambio.

2.3.PROGRAMACIÓN ORIENTADA A OBJETOS Un objeto es algo tangible que se identifica por sus propiedades y métodos, por ejemplo, una persona, una carpeta, un teléfono celular. Cada elemento de Excel es un objeto: un libro (Workbook), las hojas

de cálculo (Worksheet), los rangos (Range), los gráficos (Charts) o una tabla dinámica (PivotTable) son algunos ejemplos de objetos del modelo de objetos de Excel. Jerarquía de objetos

En este diagrama, vemos las colecciones de objetos más relevantes y su relación jerárquica

2.3.1. ALGORITMO Un algoritmo es un método para resolver un problema a través de una secuencia de pasos que nos llevará a cumplir un objetivo o solución, y esto se puede pasar a un lenguaje de programación. En programación, los algoritmos se implementan en forma de instrucciones. 2.3.2. REFERENCIA A OBJETOS Hacemos referencia a los objetos de Excel según la posición jerárquica que estos ocupan en el modelo de objetos y empleamos el punto para separar el objeto contenedor de uno o varios objetos. Ejemplos: Para hacer referencia a un libro de Excel llamado Planilla.xlsx, escribimos la siguiente sentencia: Application.Workbooks(“planilla.xlsm”) Si quisiéramos hacer referencia a la celda A1 de la hoja Datos del libro Planilla.xlsx Application.Workbooks(“planilla.xlsm”).Worksheets(“datos”).Range(“A1”). Select Simpificado: Workbooks(“planilla.xlsm”).Worksheets(“datos”).Range(“A1”). Select Si el único libro abierto es Planilla.xlsx, podemos hacer referencia a la celda A1 por medio del siguiente código: Worksheets(“datos”).Range(“A1”). Select Algo más simple aún, si sabemos que la hoja activa es Datos, también es posible omitir el objeto Worksheets: Range(“A1”). Select 2.3.3. VARIABLES Una variable es simplemente un trozo de memoria que la función o procedimiento se reserva para guardar datos, se utilizan para guardar un dato en la memoria. Este dato puede ser, por ejemplo,

una cadena de caracteres (letras, números, símbolos), números y fechas, entre otros tipos. 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, booleanos,...). 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 (String). O también asignar variables a objetos: Dim Var_Objeto As Objeto Ejemplo: Si queremos hacer referencia a la primera hoja que se llama datos del libro planilla.xlsm, podemos escribir algunas de las sentencias que presentamos a continuación: Workbooks(“planilla.xlsm”).Worksheets(“datos”) O bien: Workbooks(1).Worksheets(1) Si el libro activo es planilla.xlsm, la referencia anterior la podemos simplificar de la siguiente manera: Worksheets!Datos O bien: Worksheets(1) 2.3.4. PROPIEDADES, MÉTODOS Y EVENTOS Las propiedades son un conjunto de características propias del objeto que hacen que se distinga de otro objeto, tales como su nombre, tamaño, color, localización en pantalla. Objeto.Propiedad = valor Ejemplos: Range(“A2”).Value = 27 Range(“A2”).Font.Size = 25 Un método es un conjunto de comportamientos o acciones que puede realizarse en el objeto. Objeto.Método Ejemplos: Range(“A2”).Select ThisWorkbook.SaveAs Filename:=”Empleados.xlsm”

Además de las propiedades y los métodos, cada objeto tiene sus eventos. Podemos definir evento como la acción que puede ser reconocida por un objeto. Por medio de los eventos, es posible controlar el momento exacto en el que deseamos ejecutar un conjunto de instrucciones (procedimientos). Ejemplos de eventos son abrir un libro, imprimir, cambiar el contenido de una celda, hacer clic. En Visual Basic para Aplicaciones, los diferentes objetos de Microsoft Excel tienen un conjunto de eventos que les pueden ocurrir. Por ejemplo, el evento más típico de un botón es el Click que se produce cuando lo presionamos. Otro ejemplo de un evento frecuente para una hoja de cálculo es Change, que se produce cada vez que cambiamos de celda. Que suceda algo como respuesta a un evento dependerá de que hayamos programado una acción en el procedimiento de dicho evento. Por ejemplo, si queremos que cada vez que cerramos el libro de trabajo se muestre un mensaje de despedida del sistema, tendríamos que escribir, en el evento BeforeClose del objeto Workbook, el código que presentamos a continuación:

Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim Mensaje As String Mensaje = “Muchas gracias por usar el Sistema” MsgBox Mensaje, vbInformation, “Hasta Pronto” End Sub 2.3.5. 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. 2.3.6. PROCEDIMIENTO 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: Sub Nombre_Procedimiento Y termina con la instrucción

End Sub EJEMPLO 02: Sub Hola() Range("A1").Value = "Hola Mundo" End Sub En el ejemplo trabajamos con un objeto Range. Para indicarle que nos referimos a la casilla A1, encerramos entre paréntesis esta referencia. 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. El conjunto Range es un objeto que depende del objeto WorkSheets, así por ejemplo el siguiente código haría lo mismo que el anterior. WorkSheets(1).Range("A1").Value = "Hola Mundo" En la primera opción, el texto "Hola Mundo" se pone dentro de la casilla A1 de la hoja activa, mientras que en el segundo es en la casilla A1 de primera hoja. Si desea hacer referencia a la hoja activa puede utilizar ActiveSheet, así, el primer ejemplo lo dejaremos de la manera siguiente. ActiveSheet.Range("A1").Value = "Hola Mundo" Si desea poner "Hola Mundo" (o cualquier valor) en la casilla activa, puede utilizar la propiedad (objeto) Activecell de WorkSheets. Así para poner "Hola Mundo" en la casilla activa de la hoja activa sería: ActiveSheet.ActiveCell.Value = "Hola Mundo" 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. Application.WorkBooks(1).WorkSheets(1).Range("A1").Value = "Hola Mundo" Application casi nunca es necesario especificarlo, piense que todos los objetos dependen 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. 2.3.7. EJECUCION DE PROCEDIMIENTO Ejecución del procedimiento desde la ventana Microsoft Visual Basic para Aplicaciones. 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.

Ejecución del procedimiento desde la hoja de cálculo. Debe estar en una hoja, no en el editor de Visual Basic 1. Active la pestaña DESARROLLADOR – Código – Macros. Se despliega un cuadro de diálogo 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 03: Sub Formato() 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 (Negrita) 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. Aplicar el último ejemplo al rango de casillas que va de A1:A8. Sub Formato() 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 La Función InputBox. Esta función muestra una ventana de dialogo 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. Sub CuadroDeDiálogo() Dim Texto As String Texto = InputBox("Introduzca el texto", "Entrada de datos") End Sub Si en la ventana que muestra InputBox pulsa sobre el botón Aceptar, los datos ingresados se guardarán en 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 incluir más de una línea adicione Chr(13) para cada nueva línea. - 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. Es un 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. Es un 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. Los comentarios en VBA se realizan anteponiendo una comilla simple en una línea de código y se muestran de color verde. -

EJEMPLO 04: A continuación vamos a repetir el programa Ejemplo 02, pero en lugar de poner "Hola Mundo" en la casilla A1 de la hoja activa, dejaremos que el usuario entre un texto desde teclado y 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. Sub CuadroDeDiálogo() Dim Texto As String 'Chr(13) sirve para que el mensaje se muestre en dos Líneas Texto = InputBox("Introducir un texto " & Chr(13) & "Para la casilla A1", "Entrada de datos") ActiveSheet.Range("A1").Value = Texto End Sub Este ejemplo también se puede hacer sin variables. Sub Cuadro_Diálogo() 'Sin variables ActiveSheet.Range("A1").Value = InputBox("Introducir un texto " & Chr(13) & "para la casilla A1", "Entrada de datos") End Sub EJEMPLO 05 Repetiremos el ejemplo 04, pero en lugar de entrar los valores sobre la casilla A1, haremos que el usuario pueda elegir en que casilla quiere entrar los datos, es decir, se le preguntará al usuario mediante un segundo Inputbox sobre que casilla quiere entrar el valor del primer Inputbox. Serán necesaria dos variables, una para guardar la casilla que escoja el usuario y otra para guardar el valor. Option Explicit Sub CuadrosDeDiálogo() Dim Casilla As String Dim Texto As String Casilla = InputBox("En que casilla quiere entrar el valor", "Entrar Casilla") Texto = InputBox("Introducir un texto " & Chr(13) & "Para la casilla " & Casilla, "Entrada de datos ") ActiveSheet.Range(Casilla).Value = Texto End Sub La sentencia Option Explicit. En Visual Basic no es necesario declarar las variables, por ejemplo, en el programa anterior se hubiera podido prescindir de las líneas. Dim Casilla As String Dim Texto As String A pesar de ello, le recomendamos que siempre declare las variables que va a utilizar, de esta forma sabrá cuales utiliza el procedimiento y que tipo de datos guarda cada una, piense que a medida que vaya aprendiendo, creará procedimientos cada vez más complicados y que requerirán el uso de más variables, si no declara las variables al principio del procedimiento ocurrirán dos cosas.

Primero, las variables no declaradas son asumidas como tipo Variant (este es un tipo de datos que puede almacenar cualquier valor, número, fechas, texto, etc. pero tenga en cuenta que ocupa 20 Bytes y para guardar una referencia a una casilla, la edad de alguien, etc. no son necesarios tantos bytes). Segundo, reducirá considerablemente la legibilidad de sus procedimientos ya que las variables las irá colocando a medida que las necesite, esto, a la larga complicará la corrección o modificación del procedimiento. La sentencia Option Explicit al principio del módulo, fuerza a que se declaren todas las variables. Si al ejecutar el programa, se encuentra alguna variable sin declarar se producirá un error y no se podrá ejecutar el programa hasta que se declare. Si todavía no se ha convencido sobre la conveniencia de declarar las variables y utilizar Option Explicit,n pruebe el procedimiento siguiente. Sub Entrar_Valor() Texto = InputBox("Introducir un texto " & Chr(13) & "Para la casilla A1", "Entrada de datos") ActiveSheet.Range("A1").Value = Testo End Sub Observe que el programa no hace lo que se pretendía que hiciera. Efectivamente, Texto y Testo son dos variables diferentes, como no se ha declarado ninguna, ni se ha utilizado Option Explicit Visual Basic no da ningún tipo de error y ejecuta el programa. Pruebe el siguiente módulo e intente ejecutarlo. Option Explicit Sub Entrar_Valor() Dim Texto As String Texto = InputBox("Introducir un texto " & Chr(13) & "Para la casilla A1", "Entrada de datos") ActiveSheet.Range("A1").Value = Testo End Sub Observe que el programa no se ejecuta, al poner Option Explicit, forzamos a que se declaren todas las variables. Visual Basic detecta que la variable Testo no ha sido declarada y así lo indica mostrando Error, entonces es cuando es más fácil darnos cuenta del error que hemos cometido al teclear y cambiamos Testo por Texto. Ahora imagine que el error se produce en un programa de cientos de líneas que necesita otras tantas variables. 2.3.8. TIPOS DE DATOS EN VISUAL BASIC PARA EXCEL. (Tabla copiada de la ayuda en línea de Visual Basic para Excel).

2.3.9. CONVERSIÓN DE TIPO DE DATOS EJEMPLO 06: Realizaremos un procedimiento para ingresar dos números, sumarlos y luego lo guardaremos en la casilla A1 de la hoja activa. Option Explicit Sub Sumar() Dim Numero1 As Integer Dim Numero2 As Integer Numero1 = InputBox("Entrar el primer valor", "Entrada de datos") Numero2 = InputBox("Entrar el segundo valor", "Entrada de datos") ActiveSheet.Range("A1").Value = Numero1 + Numero2 End Sub Ejecute el procedimiento y ponga respectivamente los valores 25 y 25. Observe que todo ha ido correctamente y en la casilla A1 de la hoja activa aparece un 50. Ahora, vuelva a ejecutar el programa y cuando se le pide el primer valor ingrese "Hola Mundo". Observe que el programa se detiene indicando un error en el tipo de datos. Efectivamente, observe

que la función InputBox devuelve siempre datos tipo String, en el primer ejemplo no ha habido ningún problema, al entrar caracteres numéricos, estos pueden asignarse a variables tipo Integer porque Visual Basic hace automáticamente la conversión, pero al entrar texto e intentarlo asignar a una variable Integer Visual Basic muestra un error indicando que la variable no es adecuada para los datos que se desean guardar. Para solucionar estos problemas se deben utilizar funciones de conversión de tipo. Estas funciones, como su nombre indica, convierten datos de un tipo a otro, de String a Integer, de Integer a String, de Date a String... Así el procedimiento anterior quedaría. Option Explicit Sub Sumar() Dim Numero1 As Integer Dim Numero2 As Integer Numero1 = Val(InputBox("Entrar el primer valor", "Entrada de datos")) Numero2 = Val(InputBox("Entrar el segundo valor", "Entrada de datos")) ActiveSheet.Range("A1").Value = Numero1 + Numero2 End Sub La función Val(Dato String), convierte una cadena de caracteres a valor numérico. Si la cadena a convertir contiene algún carácter no numérico devuelve 0. Así, si al pedir un valor se teclea "Hola", la función Val, devolverá un cero. 2.3.10. FUNCIONES DE CONVERSIÓN DE TIPO DE DATOS Val(Cadena). Convierte la cadena a un valor numérico. Str(Número). Convierte el número a una expresión cadena. Las siguientes funciones tienen la forma Función(Expresión).

2.3.11. OBJETOS MÁS UTILIZADOS Y SUS PROPIEDADES Objeto Cells(fila, columna).

Sirve, como el objeto range, para referenciar una casilla o rango de casillas, pero en lugar de utilizar la referencia de la forma A1, B1, X320,... utiliza la fila y la columna que ocupa la casilla dentro de la hoja (objeto WorkSheet). Por ejemplo, para poner “Hola Mundo” en la casilla A1 de la hoja activa sería: ActiveSheet.Cells(1,1).Value="Hola Mundo" Utilizar Cells para referenciar un rango. Esto es el equivalente a Range("Casilla_Inicial:Casilla_Final"). La forma que se obtiene utilizando Cells es un poco más larga, pero se verá que a veces resulta mucho más funcional que utilizando únicamente range. Para referirnos al rango A1:B8, pondremos, Range(Cells(1, 1), Cells(8, 2)).Value = "Hola Mundo" Otra forma interesante de Cells es la siguiente, Range("A5:B10").Cells(2, 1).Value = "Hola Mundo" Pondrá en la celda A6 el valor "Hola", observe que en este ejemplo Cells comienza a contar filas y columnas a partir del rango especificado en el objeto Range. 2.3.12. VARIABLES DE OBJETOS Una variable objeto sirve para hacer referencia a un objeto, esto significa que podremos acceder a las propiedades de un objeto e invocar a sus métodos a través de la variable en lugar de hacerlo directamente a través del objeto. Posiblemente no se utilice demasiado esta clase de variables (está claro que esto dependerá de las preferencias del programador), pero hay casos en los que no hay más remedio que utilizarlas, por ejemplo en estructuras For Each ... Next como veremos, o cuando sea necesario construir funciones que devuelvan rangos, referencias a hojas, etc. Para declarar una variable objeto se utiliza también la palabra Dim de la forma siguiente: Dim Var_Objeto As Objeto Por Ejemplo Dim R As Range Dim Hoja As WorkSheet Para asignar un objeto a una variable debe utilizar la instrucción Set. Set Variable_Objeto = Objeto Por Ejemplo Set R= ActiveSheet.Range("A1:B10") Set Hoja = ActiveSheet Set Hoja = WorkSheets(1) EJEMPLO 07:

Llenar el rango de A1 a B10 con la palabra "Hola" y después poner negrita, observe como se asigna una variable objeto al objeto y luego como se trabaja con esa variable de la misma forma que trabajaría directamente sobre el objeto. Sub VariableDeObjeto() Dim R As Range 'Abajo se asigna un objeto a una variable Set R = ActiveSheet.Range("A10:B15") R.Value = "Hola Mundo" R.Font.Bold = True End Sub El valor Nothing. Algunas veces puede que sea necesario desasignar una variable del objeto al cual hace referencia, en este caso debe igualar la variable al valor Nothing de la forma siguiente. Set Variable_Objeto = Nothing Habitualmente se utiliza Nothing en una estructura condicional para comprobar si la variable objeto está asignada. Observe que si se utiliza una variable objeto a la cual todavía no se le ha hecho ninguna asignación el programa dará error y detendrá su ejecución. Es buena práctica hacer este tipo de comprobaciones antes de trabajar con variables objeto.

2.3.13. ESTRUCTURAS CONDICIONALES Las estructuras condicionales son instrucciones de programación que permiten controlar la ejecución de un fragmento de código en función de si se cumple o no una condición. ESTRUCTURA IF Estudiaremos en primer lugar la instrucción if Condición then...End if (Si Condición Entonces...Fin Si) y tiene la forma siguiente. Si Condición Entonces Sentencia1 Sentencia2 … SentenciaN Fin Si Cuando el programa llega a la instrucción Si Condición Entonces, se evalúa la condición, si esta se cumple (es cierta), se ejecutan todas las sentencias que están encerradas en el bloque, si no se cumple la condición, se saltan estas sentencias. Esta estructura en Visual Basic tiene la sintaxis siguiente.

If Condición Then Sentencia1 Sentencia2 … SentenciaN End If EJEMPLO 08 Entrar una cantidad que representa el precio de venta de algo por el teclado con la instrucción InputBox y guardarlo en la celda A1 de la hoja activa. Si el valor entrado desde el teclado (y guardado en A1) es superior a 1000, pedir descuento con otro InputBox y guardarlo en la casilla A2 de la hoja activa. Calcular en A3 que es igual al precio de venta A1, menos el descuento A2. Sub Condicional1() ActiveSheet.Range("A1").Value = 0 ' Inicializando valores 0 e los objetos. ActiveSheet.Range("A2").Value = 0 ActiveSheet.Range("A3").Value = 0 ActiveSheet.Range("A1").Value = Val(InputBox("Entrar el precio", "Entrar Precio")) ' Si el valor de la casilla A1 es mayor que 1000, entonces, pedir descuento If ActiveSheet.Range("A1").Value > 1000 Then ActiveSheet.Range("A2").Value = Val(InputBox("Entrar Descuento", "Entrar Descuento")) End If ActiveSheet.Range("A3").Value = ActiveSheet.Range("A1").Value - _ ActiveSheet.Range("A2").Value End Sub El mismo que el anterior pero utilizando variables: Sub Condicional2() Dim Precio As Integer Dim Descuento As Integer Precio = 0 Descuento = 0 Precio = Val(InputBox("Entrar el precio", "Entrar")) 'Si el valor de la variable precio es mayor que 1000, entonces, pedir descuento If Precio > 1000 Then Descuento = Val(InputBox("Entrar Descuento", "Entrar Descuento")) End If ActiveSheet.Range("A1").Value = Precio ActiveSheet.Range("A2").Value = Descuento ActiveSheet.Range("A3").Value = Precio - Descuento End Sub EJEMPLO 09 Macro que compara los valores de las casillas A1 y A2 de la hoja activa. Si son iguales pone el color de la fuente de ambas en azul. Sub Condicional3()

If ActiveSheet.Range("A1").Value = ActiveSheet.Range("A2").Value Then ActiveSheet.Range("A1").Font.Color = RGB(0, 0, 255) ActiveSheet.Range("A2").Font.Color = RGB(0, 0, 255) End If End Sub ESTRUCTURAS IF…ELSE Esta estructura se utiliza cuando se requiere una respuesta alternativa a una condición. Su estructura es la siguiente. Si Condición Entonces Sentencia1 Sentencia2 … SentenciaN Sino Sentencia1 Sentencia2 … SentenciaN Fin Si Observe que, si se cumple la condición, se ejecuta el bloque de sentencias delimitado por Si Condición Entonces y Si no se cumple la condición se ejecuta el bloque delimitado por Sino y Fin Si. En Visual Basic la instrucción Si Condición Entonces...Sino...Fin Si se expresa con las instrucciones siguientes. If Condición Then Sentencia1 Sentencia2 … SentenciaN Else Sentencia1 Sentencia2 … SentenciaN End If EJEMPLO 10 Entrar una cantidad que representa el precio de algo por el teclado con la instrucción InputBox y guardarlo en la celda A1 de la hoja activa. Si el valor entrado desde el teclado (y guardado en A1) es superior a 1000, se aplica un descuento del 10% sino se aplica un descuento del 5%, el descuento se guarda en la casilla A2 de la hoja activa. Colocar en A3, el total descuento y en A4 el total menos el descuento. Sub CondicionalElse() Dim Precio As Single Dim Descuento As Single Precio = 0

Precio = Val(InputBox("Entrar el precio", "Entrar Precio")) 'Si el valor de la variable precio es mayor que 1000, entonces, aplicar descuento del 10% If Precio > 1000 Then Descuento = Precio * (10 / 100) ActiveSheet.Range("A2").Value = 0.1 Else ' Sino Aplicar descuento del 5% Descuento = Precio * (5 / 100) ActiveSheet.Range("A2").Value = 0.05 End If ActiveSheet.Range("A1").Value = Precio ActiveSheet.Range("A3").Value = Descuento ActiveSheet.Range("A4").Value = Precio - Descuento End Sub EJEMPLO 11 Restar los valores de las celdas A1 y A2. Guardar el resultado en A3. Si el resultado es positivo o mayor igual a 0, poner la fuente de A3 en azul, sino ponerla en rojo. Sub CondicionElse2() ActiveSheet.Range("A3").Value = ActiveSheet.Range("A1").Value - _ ActiveSheet.Range("A2").Value If ActiveSheet.Range("A3").Value < 0 Then ActiveSheet.Range("A3").Font.Color = RGB(255, 0, 0) Else ActiveSheet.Range("A3").Font.Color = RGB(0, 0, 255) End If End Sub ESTRUCTURAS IF ANIDADAS Dentro de una estructura if puede ir otra, y dentro de esta otra, y otra...vea el ejemplo siguiente. EJEMPLO 12 Comparar los valores de las celdas A1 y A2 de la hoja activa. Si son iguales, escribir en A3 "Los valores de A1 y A2 son iguales", si el valor de A1 es mayor que A2, escribir "A1 mayor que A2", sino, escribir "A2 mayor que A1". Sub CondicionalAnidada() If ActiveSheet.Range("A1").Value = ActiveSheet.Range("A2").Value Then ActiveSheet.Range("A3").Value = "Los valores de A1 y A2 son iguales" Else If ActiveSheet.Range("A1").Value > ActiveSheet.Range("A2").Value Then ActiveSheet.Range("A3").Value = "A1 mayor que A2" Else ActiveSheet.Range("A3").Value = "A2 mayor que A1" End If End If

End Sub Observe que la segunda estructura If...Else...End If queda dentro del Else de la primera estructura. Esta es una regla general, cuando pone un End If, este cierra siempre el último If ( o Else) abierto. 2.3.14. OPERADORES LÓGICOS Estos operadores se utilizan cuando se necesitan evaluar dos o más condiciones para decidir si se ejecutan o no determinadas acciones. OPERADOR LÓGICO And (Y) Este operador se utiliza cuando sea preciso, que para ejecutar un bloque de instrucciones se cumpla más de una condición. Observe que deberán cumplirse todas las condiciones. Vea el ejemplo siguiente. EJEMPLO 13 Entrar el Nombre, la cantidad y el precio de un producto desde el teclado y guardarlos respectivamente en A1, A2 y A3. Calcular el total y guardarlo en A4. Si el total es superior a 1000 y el nombre del producto es "Arroz", pedir un descuento, calcularlo el total descuento y guardarlo en A5, luego restar el descuento del total y guardarlo en A6. Sub VentasAnd() Dim Producto As String Dim Cantidad As Integer Dim Precio As Single Dim Total As Single Dim Descuento As Single Dim Total_Descuento As Single Precio = 0 Producto = InputBox("Entrar Nombre del Producto", "Entrar") Precio = Val(InputBox("Entrar el precio", "Entrar")) Precio = Val(InputBox("Entrar la cantidad", "Entrar")) Total = Precio * Cantidad ActiveSheet.Range("A1").Value = Producto ActiveSheet.Range("A2").Value = Precio ActiveSheet.Range("A3").Value = Cantidad ActiveSheet.Range("A4").Value = Total 'Si total mayor que 1000 y el producto es Arroz, aplicar descuento. If Total > 1000 And Producto = "Arroz" Then Descuento = Val(InputBox("Entrar Descuento", "Entrar")) Total_Descuento = Total * (Descuento / 100) Total = Total - Total_Descuento ActiveSheet.Range("A5").Value = Total_Descuento ActiveSheet.Range("A6").Value = Total End If End Sub Observe que para que se ejecute el bloque de instrucciones entre If…End If deben cumplirse las dos condiciones que se evalúan, si falla cualquiera de las dos (o las dos a la vez), no se ejecuta dicho bloque.

OPERADOR LÓGICO Or (O) Este operador se utiliza cuando sea preciso, que para ejecutar un bloque de instrucciones se cumpla alguna de una serie de condiciones. Observe que sólo es necesario que se cumpla alguna de las condiciones que se evalúan. Vea el ejemplo siguiente. EJEMPLO 14 Entrar el Nombre, la cantidad y el precio de un producto desde el teclado y guardarlos respectivamente en A1, A2 y A3. Calcular el total y guardarlo en A4. Si el total es superior a 1000 o el nombre del producto el "Arroz", pedir un descuento, calcularlo el total descuento y guardarlo en A5, luego restar el descuento del total y guardarlo en A6. Sub VentasOr() Dim Producto As String Dim Cantidad As Integer Dim Precio As Single Dim Total As Single Dim Descuento As Single Dim Total_Descuento As Single Precio = 0 Producto = InputBox("Entrar Nombre del Producto", "Entrar") Precio = Val(InputBox("Entrar el precio", "Entrar")) Precio = Val(InputBox("Entrar la cantidad", "Entrar")) Total = Precio * Cantidad ActiveSheet.Range("A1").Value = Producto ActiveSheet.Range("A2").Value = Precio ActiveSheet.Range("A3").Value = Cantidad ActiveSheet.Range("A4").Value = Total 'Si total mayor que 1000 o el producto es Patatas, aplicar descuento. If Total > 1000 Or Producto = "Arroz" Then Descuento = Val(InputBox("Entrar Descuento", "Entrar")) Total_Descuento = Total * (Descuento / 100) Total = Total - Total_Descuento ActiveSheet.Range("A5").Value = Total_Descuento ActiveSheet.Range("A6").Value = Total End If End Sub Observe que para que se ejecute el bloque de instrucciones entre If.. End If sólo es necesario que se cumpla alguna de las dos condiciones que se evalúan (o las dos a la vez). Sólo cuando no se cumple ninguna de las dos no se ejecutan las instrucciones del bloque. OPERADOR LÓGICO Not (No) Este operador se utiliza para ver si NO se cumple una condición. El siguiente ejemplo utiliza el operador Not. EJEMPLO 15

Entrar una cantidad que representa el precio de algo por el teclado con la instrucción InputBox y guardarlo en la celda A1 de la hoja activa. Si el valor entrado desde el teclado (y guardado en A1) es superior a 1000, pedir descuento con otro InputBox y guardarlo en la casilla A2 de la hoja activa. Calcular en A3, el precio de A1 menos el descuento de A2. Sub VentasNot() Dim Precio As Integer Dim Descuento As Integer Precio = 0 Descuento = 0 Precio = Val(InputBox("Entrar el precio", "Entrar")) 'Si el valor de la variable precio NO es menor igual 1000, entonces, pedir descuento If Not (Precio 18 ActiveSheet.Range("A5").Value = "Sobresaliente" End Select End Sub 2.3.16. FUNCIONES DE COMPROBACIÓN Imagine que en alguna de las celdas que se deben operar no hubiera ningún valor o bien datos alfanuméricos. Al ejecutar la macro se producirá un error. Aunque con Visual Basic se puede controlar el flujo del programa cuando se produce un error imprevisto, para solucionar este problema utilizaremos una función de comprobación que nos diga si en las casillas A1 y A2 hay valores adecuados (numéricos) para proseguir con la ejecución de la macro, en caso contrario se mostrará un error y no se ejecutará ninguna de las operaciones. La función que utilizaremos es IsNumeric(expresión), esta función devuelve un valor True si la expresión que se evalúa es un valor numérico, en caso contrario devuelve False. También se utiliza la función IsEmpty para comprobar si en B1 hay algo, IsEmpty(Expresión) evalúa si expresión está vacía, devuelve True si es así y False en caso contrario. EJEMPLO 18 Sub FuncionesDeComprobación() Dim Signo As String Dim Valor1 As Integer, Valor2 As Integer, Total As Integer Valor1 = ActiveSheet.Range("A1").Value Valor2 = ActiveSheet.Range("A2").Value Signo = ActiveSheet.Range("B1").Value 'Funciones de Comprobación If Not IsNumeric(ActiveSheet.Range("A1")) Or Not IsNumeric(ActiveSheet.Range("A2")) Or IsEmpty(ActiveSheet.Range("B1")) Then MsgBox Prompt:="Debe entrar números en A1 y A2 y un signo (+,-,*, / ) en B1", Title:="ERROR" Else 'Instrucciones de las operaciones Select Case Signo Case "+" Total = Valor1 + Valor2 Case "-" Total = Valor1 - Valor2 Case "*" Total = Valor1 * Valor2 Case "/" Total = Valor1 / Valor2 Case Else Total = 0 End Select ActiveCell.Range("A3").Value = Total End If

End Sub Lista de Funciones de Comprobación IsNuméric(Expresión). Comprueba si expresión tiene un valor que se puede interpretar como numérico. IsDate(Expresión). Comprueba si expresión tiene un valor que se puede interpretar como tipo fecha. IsEmpty(Expresión). Comprueba que expresión tenga algún valor, que se haya inicializado. IsError(Expresión). Comprueba si expresión devuelve algún valor de error. IsArray(Expresión). Comprueba si expresión (una variable) es un array o no. IsObject(Expresión). Comprueba si expresión (una variable) representa una variable tipo objeto. IsNull(Expresión). Comprueba si expresión contiene un valor nulo debido a datos no válidos. Nothing. No es propiamente una función, sirve para comprobar si una variable objeto está asociada a un objeto antes de hacer cualquier operación con ella. Recuerde que para trabajar con una variable objeto antes debe asignarse a uno (mediante la instrucción Set), en caso contrario se producirá un error en el programa cuando utilice el objeto y se detendrá su ejecución. Sub Objeto() Dim R As Range … 'Si la variable R es Nothing es que no ha sido asignada, no se puede trabajar con ella If R Is Nothing Then MsgBox Prompt := "La variable Objeto no ha sido asignada", Buttons:=vbOk, Title := "Error" Else R.Value = "Hola" EndIf … End Sub 2.3.17. LA FUNCION MsgBox Esta función muestra un mensaje en un cuadro de diálogo hasta que el usuario pulse un botón. La función devuelve un dato tipo Integer en función del botón pulsado por el usuario. A la hora de invocar está función, se permiten diferentes tipos de botones. Sintáxis de MsgBox. MsgBox( Mensaje, Botones, Título, Archivo de ayuda, contexto) Mensaje: Obligatorio, es el mensaje que se muestra dentro del cuadro de diálogo. Botones: Opcional. Es un número o una suma de números o constantes (vea tabla Valores para botones e Iconos), que sirve para mostrar determinados botones e iconos dentro del cuadro de diálogo. Si se omite este argumento asume valor 0 que corresponde a un único Botón OK. Título: Opcional. Es el texto que se mostrará en la barra del título del cuadro de diálogo. Archivo de Ayuda: Opcional. Si ha asignado un texto de ayuda al cuadro de diálogo, aquí debe especificar el nombre del archivo de ayuda donde está el texto.

Context: Opcional. Es el número que sirve para identificar el texto al tema de ayuda correspondiente que estará contenido en el archivo especificado en el parámetro Archivo de Ayuda. 2.3.18. TABLA PARA BOTONES E ÍCONOS DEL CUADRO MsgBox

El primer grupo de valores (0 a 5) describe el número y el tipo de los botones mostrados en el cuadro de diálogo; el segundo grupo (16, 32, 48, 64) describe el estilo del icono, el tercer grupo (0, 256, 512) determina el botón predeterminado y el cuarto grupo (0, 4096) determina la modalidad del cuadro de mensajes. Cuando se suman números para obtener el valor final del argumento buttons, se utiliza solamente un número de cada grupo. Nota: Estas constantes las especifica Visual Basic for Applications. Por tanto, el nombre de las mismas puede utilizarse en cualquier lugar del código en vez de sus valores reales. Los valores que puede devolver la función MsgBox en función del botón que pulse el usuario se muestran en la tabla siguiente.

Ejemplos de MsgBox. Sub Tal() … 'El cuadro Muestra los botones Si y No y un icono en forma de interrogante. Cuando se pulsa 'un botón, el valor lo recoge la variable X. En este caso los valores devueltos pueden ser 6 o 7

'que corresponden respectivamente a las constantes VbYes y VbNo, observe la instrucción If de 'después. X = MsgBox("Desea Continuar", vbYesNo + vbQuestion, "Opción",,) 'Si se ha pulsado sobre botón Si If X = vbYes Then ... Else ' Si se ha pulsado sobre botón No ... EndIf … End Sub Algunas veces puede que le interese simplemente desplegar un cuadro MsgBox para mostrar un mensaje al usuario sin que se requiera recoger ningún valor. En este caso puede optar por la forma siguiente. MsgBoxPrompt:="Hola usuaria, Ha acabado el proceso", Buttons:=VbOkOnly, Title:="Mensaje" Lo que no puede hacer porque Visual Basic daría error es poner la primera forma sin igualarla a ninguna variable. Por ejemplo, la expresión siguiente es incorrecta. MsgBox ("Hola usuario, Ha acabado el proceso", VbOkOnly, "Mensaje") Lo más correcto sería: X= MsgBox ("Hola usuario, Ha acabado el proceso", VbOkOnly, "Mensaje") En este caso, aunque X reciba un valor, luego no se utiliza para nada, es decir simplemente se pone para que Visual Basic dé error. 2.3.19. LA INSTRUCCIÓN With Suponemos que llegado a este punto le parecerá engorroso tener que referirse a los objetos siguiendo toda o casi toda la jerarquía. Ya hemos indicado que es mejor hacerlo de esta manera porque el programa gana en claridad y elegancia y, consecuentemente, el programador gana tiempo a la hora de hacer modificaciones o actualizaciones. La sentencia With le ayudará a tener que escribir menos código sin que por esto el programa pierda en claridad. Concretamente esta función sirve para ejecutar una serie de acciones sobre un mismo Objeto. Su sintaxis es la siguiente. With Objeto Instrucciones End With Repetiremos el ejemplo 14 utilizando esta sentencia. Observe como con With se hace referencia al objeto ActiveSheet. EJEMPLO 19 Entrar el Nombre, la cantidad y el precio de un producto desde el teclado y guardarlos respectivamente en A1, A2 y A3. Calcular el total y guardarlo en A4. Si el total es superior a 1000 o el nombre del producto el "Arroz", pedir un descuento, calcularlo el total descuento y guardarlo en A5, luego restar el descuento del total y guardarlo en A6.

Sub VentasWith() Dim Producto As String Dim Cantidad As Integer Dim Precio As Single Dim Total As Single Dim Descuento As Single Dim Total_Descuento As Single Precio = 0 Producto = InputBox("Entrar Nombre del Producto", "Entrar") Precio = Val(InputBox("Entrar el precio", "Entrar")) Cantidad = Val(InputBox("Entrar la cantidad", "Entrar")) Total = Precio * Cantidad With ActiveSheet .Range("A1").Value = Producto .Range("A2").Value = Precio .Range("A3").Value = Cantidad .Range("A4").Value = Total End With 'Si total mayor que 1000 o el producto es Patatas, aplicar descuento. If Total > 1000 Or Producto = "Arroz" Then Descuento = Val(InputBox("Entrar Descuento", "Entrar")) Total_Descuento = Total * (Descuento / 100) Total = Total - Total_Descuento With ActiveSheet .Range("A5").Value = Total_Descuento .Range("A6").Value = Total End With End If End Sub 2.3.20. ESTRUCTURAS REPETITIVAS Este tipo de estructuras permiten ejecutar más de una vez un mismo bloque de sentencias. EJEMPLO 20 Supongamos que tenemos que hacer un programa para entrar las notas de una clase de 5 alumnos que se guardaran respectivamente en las celdas de A1 a A5 de la hoja activa. Después hacer la media que se guardará en A6. Con las estructuras vistas hasta ahora, podríamos hacer: Sub PromedioFinal() Dim Nota As Integer Dim Media As Single Media = 0 Nota = Val(InputBox("Entrar la 1ra. Nota: ", "Entrar Nota")) ActiveSheet.Range("A1").Value = Nota Media = Media + Nota Nota = Val(InputBox("Entrar la 2da. Nota: ", "Entrar Nota")) ActiveSheet.Range("A2").Value = Nota Media = Media + Nota

Nota = Val(InputBox("Entrar la 3ra Nota: ", "Entrar Nota")) ActiveSheet.Range("A3").Value = Nota Media = Media + Nota Nota = Val(InputBox("Entrar la 4ta. Nota: ", "Entrar Nota")) ActiveSheet.Range("A4").Value = Nota Media = Media + Nota Nota = Val(InputBox("Entrar la 5ta. Nota: ", "Entrar Nota")) ActiveSheet.Range("A5").Value = Nota Media = Media + Nota Media = Media / 5 ActiveSheet.Range("A6").Value = Media End Sub Observe que este programa repite el siguiente bloque de sentencias, 5 veces. Nota = Val(InputBox("Entrar la 1 Nota : ","Entrar Nota")) ActiveSheet.Range("A5").Value = Nota Media = Media + Nota Para evitar esta tipo de repeticiones de código, los lenguajes de programación incorporan instrucciones que permiten la repetición de bloques de código. ESTRUCTURA REPETITIVA For (Para) Esta estructura sirve para repetir la ejecución de una sentencia o bloque de sentencias, un número definido de veces. La estructura es la siguiente: Para var =Valor_Inicial Hasta Valor_Final Paso Incremento Hacer Inicio Sentencia 1 Sentencia 2 … Sentencia N Fin Var es una variable que la primera vez que se entra en el bucle se iguala a Valor_Inicial, las sentencias del bucle se ejecutan hasta que Var llega al Valor_Final, cada vez que se ejecutan el bloque de instrucciones Var se incrementa según el valor de Incremento. En Visual Basic para Excel la estructura Para se implementa con la instrucción For...Next. For Varible = Valor_Inicial To Valor_Final Step Incremento Sentencia 1 Sentencia 2 . . Sentencia N Next Variable Si el incremento es 1, no hace falta poner Step 1.

EJEMPLO 21 Entrar 10 valores utilizando la función InputBox, sumarlos y guardar el resultado en la casilla A1 de la hoja activa. Sub DiezValores() Dim i As Integer Dim Total As Integer Dim Valor As Integer For i = 1 To 10 Valor = Val(InputBox("Entrar un valor", "Entrada")) Total = Total + Valor Next i ActiveCell.Range("A1").Value = Total End Sub RECORRER CASILLAS DE UNA HOJA DE CÁLCULO. Una operación bastante habitual cuando se trabaja con Excel es el recorrido de rangos de casillas para llenarlas con valores, mirar su contenido, etc. Las estructuras repetitivas son imprescindibles para recorrer grupos de celdas o rangos. Vea los siguientes ejemplos para ver ejemplos de utilización de estructuras repetitivas para recorrer rangos de casillas, observe la utilización de las propiedades Cells y Offset. Propiedad Cells. Ya conoce esta propiedad, sirve para referenciar una celda o un rango de celdas s egún coordenadas de fila y columna. EJEMPLO 22 Llenar el rango de las casillas A1…A5 con valores pares consecutivos empezando por el 2. Sub ParesConsecutivos() Dim Fila As Integer Dim i As Integer Fila = 1 For i = 2 To 10 Step 2 ActiveSheet.Cells(Fila, 1).Value = i Fila = Fila + 1 Next i End Sub EJEMPLO 23 Llenar un rango de filas, empezando por una celda, que se debe especificar desde teclado, con una serie de 10 valores correlativos (comenzando por el 1). Sub Serie() Dim Casilla_Inicial As String Dim i As Integer Dim Fila As Integer, Columna As Integer Casilla_Inicial = InputBox("Introducir la casilla Inicial : ", "Casilla Inicial")

ActiveSheet.Range(Casilla_Inicial).Activate 'Coger el valor de fila de la celda activa sobre la variable Fila Fila = ActiveCell.Row 'Coger el valor de columna de la celda activa sobre la variable Fila Columna = ActiveCell.Column For i = 1 To 10 ActiveSheet.Cells(Fila, Columna).Value = i Fila = Fila + 1 Next i End Sub PROPIEDADES ROW Y COLUMN. Como habrá deducido del ejemplo anterior devuelven la fila y la columna de un objeto range. En el ejemplo anterior se utilizaban concretamente para obtener la fila y la columna de la casilla activa. EJEMPLO 24 El mismo con el que introducíamos el tema (ejemplo 20), pero utilizando el for y propiedad Cells. Sub PropiedadCells() Dim Nota As Integer Dim Media As Single Dim Fila As Integer Media = 0 For Fila = 1 To 5 Nota = Val(InputBox("Entrar la " & Fila & " Nota : ", "Entrar Nota")) ActiveSheet.Cells(Fila, 1) = Nota Media = Media + Nota Next Fila Media = Media / 5 ActiveSheet.Cells(6, 1).Value = Media End Sub Recuerde que cuando utilizamos Cells como propiedad de un rango (Objeto Range), Cells empieza a contar a partir de la casilla referenciada por Range. PROPIEDAD OFFSET. Esta propiedad es también muy útil a la hora de recorrer rango. Offset, que significa desplazamiento, es una propiedad del objeto Range y se utiliza para referenciar una casilla situada a n Filas y n Columnas de una casilla dada. Vea los ejemplos siguientes. ActiveSheet.Range("A1").Offset(2, 2).Value = "Hola" ‘Casilla C3 = Hola, 2 filas y 2 columnas desde A1. ActiveCell.Offset(5,1).Value = "Hola" ‘5 Filas por debajo de la casilla Activa = Hola ActiveCell.Offset(2,2).Activate ‘Activar la casilla que está 2 filas y 2 columnas de la activa EJEMPLO 25 El mismo con el que introducíamos el tema (ejemplo 20), pero utilizando el For y propiedad Offset Sub Desplazamiento() Dim Nota As Integer

Dim Media As Single Dim Fila As Integer Media = 0 ActiveSheet.Range("A1").Activate For Fila = 0 To 4 Nota = Val(InputBox("Entrar la " & Fila + 1 & " Nota : ", "Entrar Nota")) ActiveCell.Offset(Fila, 0).Value = Nota Media = Media + Nota Next Fila Media = Media / 5 ActiveCell.Offset(6, 1).Value = Media End Sub EJEMPLO 26 El mismo con el que introducíamos el tema (ejemplo 20), pero utilizando el For y propiedad Offset. Observe que ahora vamos cambiando de celda activa. Sub Desplazamiento2() Dim Nota As Integer Dim Media As Single Dim i As Integer Media = 0 ActiveSheet.Range("A1").Activate For i = 1 To 5 Nota = Val(InputBox("Entrar la " & i & " Nota : ", "Entrar Nota")) ActiveCell.Value = Nota Media = Media + Nota 'Hacer activa la casilla situada una fila por debajo de la actual ActiveCell.Offset(1, 0).Activate Next Fila Media = Media / 5 ActiveCell.Value = Media End Sub Observe la diferencia entre los ejemplos 25 y 26, ambos utilizan la propiedad Offset de diferente forma, en el ejemplo 25 la casilla activa siempre es la misma A1, Offset se utiliza para referenciar una casilla a partir de esta. En A26 se va cambiando de casilla activa cada vez de forma que, cuando termina la ejecución del programa la casilla activa es A6. Cuando utilizar cada método, como casi siempre depende de lo que se pretenda hacer. Aquí es bastante claro, si le interesa que no cambie la casilla utilice Offset como en el ejemplo 25, en caso que interese que vaya cambiando, haga como en el Ejemplo 6. Por supuesto hay muchas variantes sobre el estilo de recorrer Celdas, tanto con Cells como con Offset, solo tiene que ir probando y, como casi siempre, el que más le guste. ESTRUCTURA REPETITIVA DO WHILE...LOOP (HACER MIENTRAS). La estructura repetitiva for se adapta perfectamente a aquellas situaciones en que se sabe previamente el número de veces que se ha de repetir un proceso, entrar veinte valores, recorrer cincuenta celdas, etc. Pero hay ocasiones o casos en los que no se sabe previamente el número de veces que se debe repetir un proceso. Por ejemplo, suponga que ha de recorrer un rango de filas en

los que no se sabe cuantos valores habrá (esto es, cuantas filas llenas habrá), en ocasiones puede que hayan veinte, en ocasiones treinta, en ocasiones ninguna, etc. Para estos casos la estructura for no es adecuada y deberemos recurrir a la sentencia Do While...Loop en alguna de sus formas. Esta estructura repetitiva está controlada por una o varias condiciones, la repetición del bloque de sentencias dependerá de si se va cumpliendo la condición o condiciones. Hacer Mientras (se cumpla la condición) Sentencia1 Sentencia2 … Sentencia N Fin Hacer Mientras En Visual Basic Do While (se cumpla la condición) Sentencia1 Sentencia2 … Sentencia N Loop ** Los ejemplos que veremos a continuación sobre la instrucción Do While…Loop se harán sobre una base de datos. Una base de datos en Excel es simplemente un rango de celdas en que cada fila representa un registro y cada columna un campo de registro, la primera fila es la que da nombre a los campos. Para nuestra base de datos utilizaremos los campos siguientes, Nombre, Ciudad, Edad, Fecha. Ponga estos títulos en el rango A1:D1 de la Hoja1 (En A1 ponga Nombre, en B1 ponga Ciudad, en C1 ponga Edad y en D1 Fecha), observe que los datos se empezarán a entrar a partir de A2. EJEMPLO 27 Programa para entrar registros en la base de datos. Cada campo se entra con InputBox. El programa va pidiendo datos mientras se entre un valor en el InputBox correspondiente al nombre, es decir cuando al preguntar el nombre no se entre ningún valor, terminará la ejecución del bloque encerrado entre Do While...Loop. Observe la utilización de la propiedad Offset para colocar los datos en las celdas correspondientes. Sub HacerMientras() Dim Nombre As String Dim Ciudad As String Dim Edad As Integer Dim fecha As Date 'Activar hoja1 Worksheets("Hoja1").Activate 'Activar casilla A2 ActiveSheet.Range("A2").Activate Nombre = InputBox("Entre el Nombre (Return para Terminar) : ", "Nombre") 'Mientras la variable Nombre sea diferente a cadena vacía Do While Nombre "" Ciudad = InputBox("Entre la Ciudad : ", "Ciudad")

Edad = Val(InputBox("Entre la Edad : ", "Edad")) fecha = CDate(InputBox("Entra la Fecha : ", "Fecha")) 'Copiar los datos en las casillas correspondientes With ActiveCell .Value = Nombre .Offset(0, 1).Value = Ciudad .Offset(0, 2).Value = Edad .Offset(0, 3).Value = fecha End With 'Hacer activa la celda de la fila siguiente a la actual ActiveCell.Offset(1, 0).Activate Nombre = InputBox("Entre el Nombre (Return para Terminar) : ", "Nombre") Loop End Sub EJEMPLO 28 Preste especial atención a este ejemplo ya que seguro que el código que viene a continuación lo utilizará en muchas ocasiones. Antes que nada observe el ejemplo anterior, fíjese en que siempre empezamos a llenar el rango de la hoja a partir de la celda A2, esto tiene una nefasta consecuencia, la segunda vez que ejecute la macro machacará los datos de A2:D2 y si continua ejecutando machacará los datos de los rangos siguientes. Una solución seria observar cual es la casilla vacía siguiente y cambiar en la instrucción ActiveSheet.Range("A2").Activate , la referencia A2 por la que corresponde a la primera casilla vacía de la columna A. El código que le mostramos a continuación hará esto por nosotros, es decir recorrerá una fila de celdas a partir de A1 hasta encontrar una vacía y dejará a esta como celda activa para que la entrada de datos comience a partir de ella. Sub HacerMientras2() '... 'Activar hoja1 Worksheets("Hoja1").Activate 'Activar casilla A2 ActiveSheet.Range("A1").Activate 'Mientras la celda activa no esté vacía Do While Not IsEmpty(ActiveCell) 'Hacer activa la celda situada una fila por debajo de la actual ActiveCell.Offset(1, 0).Activate Loop '... End Sub La unión de los dos programas anteriores. Es decir habrá un bucle Do While que buscará la primera casilla vacía de la base da datos y otro para pedir los valores de los campos hasta que se pulse Enter en Nombre. Sub HacerMientras2() Dim Nombre As String Dim Ciudad As String Dim Edad As Integer Dim fecha As Date

Worksheets("Hoja1").Activate ActiveSheet.Range("A1").Activate 'Buscar la primera celda vacía de la columna A y convertirla en activa Do While Not IsEmpty(ActiveCell) ActiveCell.Offset(1, 0).Activate Loop Nombre = InputBox("Entre el Nombre (Return para Terminar) : ", "Nombre") 'Mientras la variable Nombre sea diferente a cadena vacía Do While Nombre "" Ciudad = InputBox("Entre la Ciudad : ", "Ciudad") Edad = Val(InputBox("Entre la Edad : ", "Edad")) fecha = CDate(InputBox("Entra la Fecha : ", "Fecha")) With ActiveCell .Value = Nombre .Offset(0, 1).Value = Ciudad .Offset(0, 2).Value = Edad .Offset(0, 3).Value = fecha End With ActiveCell.Offset(1, 0).Activate Nombre = InputBox("Entre el Nombre (Return para Terminar) : ", "Nombre") Loop End Sub Cuando se tienen que entrar desde el teclado conjuntos de valores, algunos programadores y usuarios prefieren la fórmula de que el programa pregunte si se desean entrar más datos, la típica pregunta ¿Desea Introducir más datos?, si el usuario contesta Sí, el programa vuelve a ejecutar las instrucciones correspondientes a la entrada de datos, si contesta que no se finaliza el proceso, observe como quedaría nuestro bucle de entrada de datos con este sistema. Mas_datos = vbYes Do While Mas_Datos = vbYes Nombre = InputBox("Entre el Nombre (Return para Terminar) : ", "Nombre") Ciudad = InputBox("Entre la Ciudad : ", "Ciudad") Edad = Val(InputBox("Entre la Edad : ", "Edad")) Fecha=Cdate(InputBox("Entra la Fecha : ", "Fecha")) With ActiveCell .Value = Nombre .Offset(0,1).Value = Ciudad .Offset(0,2).Value = Edad .Offset(0,3).value = fecha End With ActiveCell.Offset(1,0).Activate ‘ Preguntar al usuario si desea entrar otro registro. Mas_datos = MsgBox("Otro registro ?", vbYesNo+vbQuestion,"Entrada de datos") Loop ** Observe que es necesaria la línea anterior al bucle Mas_datos = vbYes, para que cuando se evalúe la condición por vez primera esta se cumpla y se ejecuten las sentencias de dentro del bucle,

Mas_datos es una variable de tipo Integer. Vea la sección siguiente donde se estudia una variante de la estructura Do While que es más adecuada para este tipo de situaciones. ESTRUCTURA DO…LOOP WHILE. El funcionamiento de esta estructura repetitiva es similar a la anterior salvo que la condición se evalúa al final, la inmediata consecuencia de esto es que las instrucciones del cuerpo del bucle se ejecutaran al menos una vez. Observe que para nuestra estructura de entrada de datos vista en el último apartado de la sección anterior esta estructura es más conveniente, al menos más elegante, si vamos a entrar datos, al menos uno entraremos, por tanto las instrucciones del cuerpo del bucle se deben ejecutar al menos una vez, luego ya decidiremos si se repiten o no. Do Nombre = InputBox("Entre el Nombre (Return para Terminar) : ", "Nombre") Ciudad = InputBox("Entre la Ciudad : ", "Ciudad") Edad = Val(InputBox("Entre la Edad : ", "Edad")) Fecha=Cdate(InputBox("Entra la Fecha : ", "Fecha")) With ActiveCell .Value = Nombre .Offset(0,1).Value = Ciudad .Offset(0,2).Value = Edad .Offset(0,3).value = fecha End With ActiveCell.Offset(1,0).Activate Mas_datos = MsgBox("Otro registro ?", vbYesNo+vbQuestion,"Entrada de datos") ‘Mientras Mas_Datos = vbYes LoopWhile Mas_Datos = vbYes Observe que en este caso no es necesario la línea Mas_Datos = vbYes antes de Do para forzar la entrada en el bucle ya que la condición va al final. ESTRUCTURA DO…LOOP UNTIL (HACER…HASTA QUE SE CUMPLA LA CONDICIÓN). Es otra estructura que evalúa la condición al final observe que la interpretación es distinta ya que el bucle se va repitiendo HASTA que se cumple la condición, no MIENTRAS se cumple la condición. Cual de los dos utilizar, pues, no se sorprenda, la que entienda mejor o le guste más. La entrada de datos con este bucle quedaría Do Nombre = InputBox("Entre el Nombre (Return para Terminar) : ", "Nombre") Ciudad = InputBox("Entre la Ciudad : ", "Ciudad") Edad = Val(InputBox("Ent re la Edad : ", "Edad") Fecha=Cdate("InputBox("Entra la Fecha : ", "Fecha") With ActiveCell .Value = Nombre .Offset(0,1).Value = Ciudad .Offset(0,2).Value = Edad .Offset(0,3).value = fecha End With ActiveCell.Offset(1,0).Activate Mas_datos = MsgBox("Otro registro ?", vbYesNo+vbQuestion,"Entrada de datos") ‘Hasta que Mas_Datos sea igual a vbNo

LoopUntil Mas_Datos=vbNo Estructura For Each. Este bucle se utiliza básicamente para ejecutar un grupo de sentencias con los elementos de una colección o una matriz (pronto veremos los que es). Recuerde que una colección es un conjunto de objetos, hojas, rangos, etc. Vea el ejemplo siguiente que se utiliza para cambiar los nombres de las hojas de un libro de trabajo. EJEMPLO 29 Programa que pregunta el nombre para cada hoja de un libro de trabajo, si no se pone nombre a la hoja, queda el que tiene. Sub ForEach() Dim Hoja As Worksheet 'Para cada hoja del conjunto WorkSheets For Each Hoja In Worksheets Nuevo_nombre = InputBox("Nombre de la Hoja : " & Hoja.Name, "Nombrar Hojas") If Nueva_Nombre "" Then Hoja.Name = Nuevo_nombre End If Next End Sub EJEMPLO 30 Entrar valores para las celdas del rango A1:B10 de la hoja Activa. Sub ForEach2() Dim R As Range 'Para cada celda del rango A1:B10 de la hoja activa For Each R In ActiveSheet.Range("A1:B10") R.Value = InputBox("Entrar valor para la celda " & R.Address, "Entrada de valores") Next End Sub ** Observe que se ha declarado una variable tipo Range, este tipo de datos, como puede imaginar y ha visto en el ejemplo sirve para guardar Rangos de una o más casillas, estas variables pueden luego utilizar todas las propiedades y métodos propios de los Objetos Range. Tenga en cuenta que la asignación de las varaibles que sirven para guardar o referenciar objetos (Range, WorkSheet, etc.) deben inicializarse muchas veces a través de la instrucción SET. Ejemplo Mensajes En una Nueva Hoja de Cálculo, Insertar un botón desde los controles Active X llamado Mensaje YesNo:

Realizar doble clic en el botón e ingrese el siguiente código: Private Sub cmdvbYesNo_Click() X = MsgBox("Desea Continuar", vbYesNo + vbQuestion, "Opción") 'Si se ha pulsado sobre botón Si, vbYes es equivalente 6 If X = vbYes Then ActiveSheet.Range("A1").Value = "Si" Else ' Si se ha pulsado sobre botón No ActiveSheet.Range("A1").Value = "Si" End If End Sub 'vbOkOnly, vbOkCancel, vbAbortRetryIgnore, vbYesNoCancel, vbYesNo, vbRetryCancel 'vbCritical, vbQuestion, vbExclamation, vbInformation Puedes especificar el número y tipo de botones de los Cuadros de Mensaje (el valor por defecto de los botones es 0 – OK Button only). Return Values 1 OK vbOk

2 3 4 5 6 7

Cancel Abort Retry Ignore Yes No

Type of Buttons 0 vbOKOnly 1 vbOKCancel 2 vbAbortRetryIgnore 3 vbYesNoCancel 4 vbYesNo 5 vbRetryCancel

vbCancel vbAbort vbRetry vbIgnore vbYes vbNo

OK button only OK and Cancel buttons Abort, Retry, and Ignore buttons Yes, No, and Cancel buttons Yes and No buttons Retry and Cancel buttons

Completar los Ejemplos 31 a 39 del manual Macros de Excel CCI.

3. EXCEL CON VISUAL BASIC PARA APLICACIONES UserForms INSERTAR UN NUEVO UserForm Activar la ficha PROGRAMADOR y seleccionar el Libro de trabajo correspondiente y elegir el comando Insertar, UserForm.

O hacer clic derecho en el mouse encima de VBAProject, tal como se muestra abajo:

Un libro de trabajo puede tener cualquier número de UserForms, y cada uno de ellos contiene un solo UserForms. Los UserForms tienen nombres como UserForm1, UserForm2, y así sucesivamente. Se puede cambiar el nombre del UserForm para que su identificación sea más fácil. Para ello se selecciona el UserForm y se usa la ventana propiedades, desde donde se puede cambiar la propiedad Name (presionar F4 si la ventana de propiedades no está desplegada).

DESPLEGAR UN UserForm Se usa el método Show del objeto UserForm. El siguiente procedimiento, que se encuentra dentro de un módulo de VBA normal, despliega UserForm1: Private Sub UserForm1.Clik() End Sub Cuando se despliega el UserForm, permanece visible en la pantalla hasta que se oculta. El procedimiento puede tanto cargar el UserForm (con una instrucción Unload) como ocultarlo (con el método Hide del objeto UserForm). AÑADIR CONTROLES A UN UserForm Se usa el Cuadro de herramientas (el Editor de VB no tiene comandos de menú para añadir controles). Este cuadro se puede desplegar con Ver, Cuadro de Herramientas.

Se hace clic sobre el botón del Cuadro de Herramientas que corresponde al control que se quiere añadir, y después se hace clic dentro del formulario (cuadro de diálogo). Cuando se añade un control nuevo, se le asigna un nombre que combina el tipo de control con la secuencia numérica para ese tipo de control. Por ejemplo si se añade el primer botón de comando se le asignará el nombre ComandButton1, y al segundo que se añada CommandButton2. Siempre conviene cambiarle el nombre a los controles para que sean más representativos. Los nombres de lo controles se cambian desde la ventana de Propiedades. CONTROLES DISPONIBLES PARA EL USUARIO Casilla de verificación (CheckBox). Es útil para ofrecer al usuario una opción binaria: sí o no, verdadero o falso, activar o desactivar, y demás. Cuando se selecciona una Casilla de verificación posee un valor Verdadero; en caso contrario es Falso. Cuadro combinado (ComboBox). Es similar al cuadro de lista. Sin embargo, un Cuadro Combinado es un cuadro de lista desplegable que presenta un solo elemento por vez. Otra diferencia con respecto al cuadro de lista es que el usuario puede introducir un valor que no aparece en la lista dada de elementos. Botón de comando (CommandButton). Todo cuadro de diálogo que se genere probablemente tenga, al menos, un Botón de comando. Normalmente se tendrá un Botón de comando etiquetado como Aceptar y otro etiquetado como Cancelar. Botón Marco (Frame). Se usa para agrupar otros controles. Se puede hacer bien por motivos estéticos o por agrupar lógicamente un conjunto de controles. Un Marco es particularmente útil cuando el cuadro de diálogo contiene más de un grupo de controles de Botón de opción. Imagen (Image). Se usa para desplegar una imagen gráfica, que pude provenir de un archivo o se pude pegar desde el Portapapeles. La imagen gráfica se guarda en el libro de trabajo. De esta forma, se puede distribuir el libro a cualquier persona y no es necesario incluir una copia del archivo gráfico. Etiqueta (Label). Simplemente presenta texto en el cuadro de diálogo. Cuadro de lista (Listbox). Presenta una lista de elementos donde el usuario puede seleccionar uno (o múltiples elementos). Estos controles son muy flexibles. Por ejemplo, se puede especificar un rango de hoja de cálculo que contenga elementos de un Cuadro de lista, y este rango puede constar de múltiples columnas Página múltiple (Multipage). Permite crear cuadros de diálogo con fichas, como el que aparece cuando se selecciona el comando herramientas, opciones. De forma predeterminada una página múltiple

consta de dos páginas. Para añadir páginas, se hace clic con el botón derecho del ratón sobre una ficha y se selecciona Nueva página desde el menú contextual. Botón de opción (OptionButtons). Son muy útiles cuando el usuario necesita seleccionar entre un pequeño número de elementos. Estos botones se usan siempre en grupos de al menos dos elementos. Cuando se selecciona uno de los botones, los otros botones del grupo no están seleccionados. Si el cuadro de diálogo contiene más de un grupo de Botones de opción, cada grupo de éstos debe tener el mismo valor de la propiedad group name. De lo contrario, todos los Botones de opción formarán parte del mismo grupo. De forma alternativa, se pueden agrupar los Botones de opción en un control Marco, que agrupa automáticamente los Botones de opción contenidos dentro del marco. RefEdit. Se usa cuando es necesario permitir que el usuario seleccione un rango de una hoja de cálculo. Barra de desplazamiento (ScrollBar). Es similar a un control Botón de número. La diferencia estriba en que el usuario puede desplazarse con el botón Barra de desplazamiento para cambiar el valor del contrl en incrementos más amplios. Dicho control es más útil para seleccionar un valor que se extiende a través de un rango muy amplio de posibles valores. Botón de número (SpinButton). Permite al usuario seleccionar un valor haciendo clic sobre una de las dos flechas que contiene. Este control se usa a menudo en conjunción con el control Cuadro de texto o el control Etiqueta, que presentan el valor actual de un Control de número. Barra de tabulaciones (TabStrip). Es similar a un control Página múltiple, pero no es tan fácil de usar. Botón de alternar (ToggleButton). Posee dos estados: activado y desactivado. Al hacer clic sobre el mencionado botón, se alternan estos dos estados y el botón cambia de apariencia. Su valor puede ser o bien Verdadero (presionado) p bien Falso (no presionado). AJUSTAR LOS CONTROLES DEL CUADRO DE DIÁLOGO Después de situar un control en un cuadro de diálogo, se puede mover y modificar su tamaño usando las técnicas del ratón estándar. Un UserForm puede contener líneas de división horizontales y verticales que ayudan a alinear los controles que se añaden. Cuando se añade o se mueve un control, se ajusta a la cuadrícula. Si no se quieren ver estas líneas se pueden desactivar seleccionando Herramientas Opciones en el Editor de VB. En el cuadro de diálogo Opciones se selecciona la ficha general y se establecen las opciones deseadas en la sección Opciones de la cuadricula. El menú Formato de la ventana del Editor de VB proporciona varios comandos para ayudar a precisar la alineación y el espacio de los controles en un cuadro de diálogo. Antes de usar estos comandos hay que seleccionar los controles con los que se quiere trabajar. AJUSTAR LAS PROPIEDADES DEL CONTROL Se pueden cambiar las propiedades del control en el tiempo de diseño con la ventana de Propiedades, mientras se está configurando el cuadro de diálogo, o durante el tiempo de ejecución, cuando el cuadro de diálogo se presenta al usuario. Se pueden usar instrucciones VBA para cambiar las propiedades del control en el tiempo de ejecución.

USAR LA VENTANA DE PROPIEDADES La ventana propiedades tiene dos fichas:  Alfabética presenta las propiedades del objeto seleccionado en orden alfabético  Por categorías las presenta agrupadas en categorías lógicas Si se seleccionan dos o más controles a la vez, la ventana Propiedades despliega sólo las propiedades comunes a los controles seleccionados. CAMBIAR EL ORDEN DE TABULACION El orden de tabulación determina la secuencia en la que los controles se activan cuando el usuario presiona Tab o Mayús-tab.Para establecer el orden de tabulación de los controles se selecciona Ver Orden de tabulación en el Editor de VB.

De forma alternativa, se puede establecer una posición de control individual en el orden de tabulación, usando la ventana Propiedades. El primer control en el orden de tabulación tiene una Propiedad TabIndex de 0. Cambiar esta propiedad puede afectar a otros controles. Si se quiere eliminar un control del orden de tabulación, se establece su propiedad TabStop como False. ESTABLECER TECLAS DE ACCESO DIRECTO Se puede asignar una tecla de aceleración o tecla de acceso directo a la mayoría de los controles de un cuadro de diálogo. Esto permite al usuario acceder al control presionando Alt-tecla de acceso directo. Para ello se usa la propiedad Accelerator de la ventana propiedades. PROBAR UN UserForm Existen tres maneras de probar un UserForm sin tener que llamarlo desde un procedimiento de VBA.  Elegir el comando Ejecutar, Ejecutar Sub/UserForm  Presionar F5  Hacer clic sobre el botón Ejecutar Sub/UserForm en la barra de herramientas Estándar DESPLEGAR UN UserForm Sub MostrarFormulario () UserForm1().show End Sub Este procedimiento debe estar en un módulo de VBA, no en el módulo del código del UserForm. CERRAR UN UserForm Unload UserForm1

PROCEDIMINETOS DE CONTROLADOR DE EVENTO Cuando el usuario interactúa con el cuadro de diálogo, mediante la selección de un elemento de un cuadro de lista, haciendo clic sobre un botón de comando y demás, se produce un evento a ocurrir. Por ejemplo, hacer clic sobre el Botón de comando promueve el evento Click para dicho botón. La aplicación necesita procedimientos que se ejecuten cuando estos eventos ocurran. Estos rocedimiento se llaman controlador de evento. Los procedimientos de controlador de evento deben estar localizados en la ventana de código del UserForm. Sin embargo, el procedimiento de controlador de evento puede llamar a cualquier procedimiento que esté localizado en un módulo VBA estándar. FORMULARIO 01 Crear un UserForm para obtener dos tipos de información: el nombre y el sexo de una persona.  Usa el control Cuadro de texto (TextBox) para obtener el nombre.  Usa dos botones de opción (OptionsButtons) para obtener el sexo (masculino, femenino).  La información se recoge en el cuadro de diálogo y luego se envía a la siguiente fila en blanco de la hoja de cálculo.

Donde: Control Nombre (Name) Etiqueta1 lblNombres Cuadro de Texto txtNombres Marco mrcSexo Botón de opcion1 Masculino Botón de opcion2 Femenino Botón de comando1 cmdAceptar Botón de comando2 cmdCancelar ESCRIBIR UN CÓDIGO PARA DESPLEGAR EL FORMULARIO Ahora se debe añadir un Botón de Comando a la hoja de cálculo (Controles Active X). Este botón ejecuta un procedimiento que despliega el UserForm.

1) Activar Excel 2) activar la barra Cuadro de Controles 3) Añadir un Botón de comando 4) Hacer doble clic sobre el botón, esto activa el Editor de VB (específicamente, el módulo de código para la hoja de calculo se despliega, con un procedimiento controlador de evento vacío para el Botón de Comando (CommandButton) de la hoja de Cálculo) 5) Añadir la instrucción UserForm1.Show al procedimiento

Private Sub cmdFormulario_Click() UserForm1.Show End Sub AÑADIR PROCEDIMIENTOS DE CONTROLADOR DE EVENTO En esta sección se explica cómo escribir procedimientos que controlan los eventos que ocurren cuando el cuadro de diálogo se ha desplegado. 1) Activar el Editor de VB 2) Hacer doble clic sobre el botón Cancelar. El Editor de VB activa la ventana de Código del UserForm y proporciona un procedimiento vacío llamado cmdCancelar_Click 3) Modificar el procedimiento como sigue: Private Sub cmdCancelar_Click() Unload UserForm1 ‘Unload Me End Sub 4) Presionar Shift-F7 para volver a desplegar el UserForm1 5) Hacer doble click sobre el botón Aceptar e introducir el siguiente procedimiento (éste es el controlador de evento para el evento Click del Botón Aceptar). Private Sub cmdAceptar_Click() Sheets("Hoja1").Activate NextRow = Application.WorksheetFunction.CountA(Range("A:A")) + 1 Cells(NextRow, 1) = txtNombres.Text If rbMasculino Then Cells(NextRow, 2) = "Masculino" End If If rbFemenino Then Cells(NextRow, 2) = "Femenino" End If txtNombres.Text = "" txtNombres.SetFocus End Sub

VALIDAR LOS DATOS

Este ejemplo no asegura que el usuario realmente introduce el nombre en el Cuadro de texto. El siguiente código se inserta en el procedimiento cmdAceptar_Click() antes de que el texto se transfiera a la hoja de cálculo. ´Asegurar que se ha introducido un nombre If txtNombres.Text = “” Then MsgBox “Se debe introducir un nombre” Exit Sub End If Con esto se asegura que el usuario ingresa un texto. Si este está vacío aparece un mensaje y la rutina termina El código del botón de comando Aceptar quedaría de la siguiente manera: Private Sub cmdAceptar_Click() Sheets("Hoja1").Activate 'Asegurar que se ha introducido un nombre If txtNombres.Text = "" Then MsgBox "Se debe introducir un nombre" Exit Sub End If NextRow = Application.WorksheetFunction.CountA(Range("A:A")) + 1 Cells(NextRow, 1) = txtNombres.Text If rbMasculino Then Cells(NextRow, 2) = "Masculino" End If If rbFemenino Then Cells(NextRow, 2) = "Femenino" End If txtNombres.Text = "" txtNombres.SetFocus End Sub PROPIEDADES COMUNES A TODOS LOS CONTROLES CATEGORÍA APARIENCIA Backcolor y Forecolor: Color del fondo del control y color del texto. Caption: Informa el texto que aparece en el control. Picture: Indica el nombre de un fichero gráfico que se mostrará como fondo del control. CATEGORÍA COMPORTAMIENTO Enabled: Propiedad del tipo True/False que especifica si el control está activo o no en tiempo de ejecución; un control no activo es visible pero el usuario no puede interactuar con él, y se visualiza con un color distinto. Visible: Otra propiedad True/False, que indica si el control está visible u oculto en tiempo de ejecución. TabIndex: El orden por el cual nos movemos con la tecla TAB, entre los controles, se establece con esta propiedad. Es un valor numérico, 0, 1,... TabStop: Es del tipo True/False y establece si un control puede ser accesible con la tecla TAB. CATEGORÍA FUENTE

Font: Permite elegir el tipo, estilo, tamaño, etc... de letra del texto mostrado por el control. CATEGORÍA POSICIÓN Left y Top: La primera contiene la coordenada columna y la segunda la coordenada línea de pantalla donde se sitúa el control. Width y Height: Cuando un control es redimensionable, esto es, que sus dimensiones son variables, tendrá estas dos propiedades que nos informan del ancho y la altura del control. FORMULARIO 02 1) Inserte un formulario en el proyecto 2) Inserte un botón de comando y cambie de nombre a cmdPosición 3) Haga doble click sobre el botón para acceder a la ventana de código 4) En el procedimiento de evento click añada las siguientes líneas de código: Private Sub cmdPosición_Click() cmdPosición.Height = UserForm1.Height / 2 cmdPosición.Width = UserForm1.Width / 2 cmdPosición.Left = UserForm1.Width / 4 cmdPosición.Top = UserForm1.Height / 4 cmdPosición.Caption = "Redimensionado" End Sub 5) Ejecute el procedimiento presionando la tecla F5 y observe como cambia el título del control CommandButton y su tamaño y posición al hacer clic sobre él. EVENTOS COMUNES A TODOS LOS CONTROLES Para nombrar un evento correspondiente a un control, la nomenclatura es siempre la misma: nombre_del_control_nombre_del_evento Command Button_Click Click: Se activa al hacer clic sobre el control, pero también al pulsar la barra de espacios o la tecla Enter si se trata de un botón CommandButton. MouseMove: Se activa al mover el puntero del ratón por encima del control. MouseDown y MouseUp: El primer evento se activa al presionar uno de los botones del ratón y el segundo al liberarlo. KyePress, KeyDown y KeyUp: Son eventos que relacionan un control que acepta entrada de texto por parte del usuario (por ejemplo TextBox) con el teclado del ordenador. Cuando el usuario presiona una tecla de tipo carácter se activa el evento KeyPress. Si presiona una tecla especial, como puede ser la tecla “Inicio” o “Enter”, se activa solo el evento KeyDown. Al soltar la tecla se activa KeyUp. Notemos que el evento KeyDown se activa para cualquier tecla, mientras KeyPress sólo lo hace si la tecla es de tipo carácter. DblClick: Se activa al hacer doble clic sobre el control. En el Ejemplo anterior FORMULARIO 02 1) Acceda a la ventana de código del control command Button del ejemplo anterior. 2) Observe que en la parte superior de la ventana de código hay dos listas desplegables. La de la izquierda muestra el nombre del control cmdPosición y es una lista de los controles del UserForm.

3) La de la derecha muestra el nombre del evento Click y es una lista de todos los eventos del control que tenemos seleccionado.

En la ventana de elección de eventos, desplegándola, elija el evento MouseMove. Private Sub cmdPosición_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) cmdPosición.Caption = "Ahora pasas por encima" End Sub 4) Despliegue ahora la lista de controles y elija el objeto UserForm. En la lista de eventos del UserForm elija de nuevo MouseMove y escriba el código siguiente: Private Sub UserForm_MouseMove(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) cmdPosición.Caption = "Desactivado" End Sub

Hacemos docle clic en el botón Eventos de Formulario

Private Sub cmdEventos_Click() UserForm1.Show End Sub 6) Ejecute. EJEMPLO DEL BOTÓN CHECKBOX FORMULARIO 03 Diseñar un UserForm de entrada de datos de los clientes de un hotel. Ha de contener DNI, nombre día de llegada, habitación doble (sí/no), habitación con baño completo (sí/no), pensión completa (sí/no), suplemento cama niño (sí/no). El programa calculará el precio diario de la habitación en base a una suma de conceptos. La habitación tiene un precio de 50 NS/día, y los precios de los suplementos son: Habitación doble: 30 NS/día, Con baño completo: 20 NS/día, Pensión completa (por persona): 45 NS/día, Cama suplementaria para niño: 15 NS/día). Los pasos a seguir son: 1) Diseñe un formulario que se muestra a continuación:

Ponga la propiedad Visible del TextBox que muestra el resultado del cálculo a False. Haga lo mismo con el correspondiente control Label (NS/Día). 2) Acceda a la ventana del código del botón “Finalizar”, evento Click, y escriba la instrucción End Private Sub cmdFinalizar_Click() End End Sub 3) Acceda a la ventana de código del botón “Nuevo” y déjelo como sigue: Private Sub cmdNuevo_Click() txtDNI.Text = "" txtLlegada.Text = "" txtNombre.Text = "" cbHabitación.Value = False cbPensión.Value = False

cbCama.Value = False cbBaño.Value = False txtNS.Visible = False lblNS.Visible = False txtDNI.SetFocus End Sub 4) Acceda a la ventana de código del botón Calcular y déjelo como sigue: Private Sub cmdCalcular_Click() Dim Precio As Integer Precio = 50 If cbHabitación.Value = True Then Precio = Precio + 30 End If If cbBaño.Value = True Then Precio = Precio + 20 End If If cbPensión.Value = True Then Precio = Precio + 45 End If If cbCama.Value = True Then Precio = Precio + 15 End If txtNS = Precio txtNS.Visible = True lblNS.Visible = True End Sub Agregar el código siguiente para guardar los datos en la hoja de Excel: Sheets("Hoja1").Activate NextRow = Application.WorksheetFunction.CountA(Range("A:A")) + 1 Cells(NextRow, 1) = txtDNI.Text Cells(NextRow, 2) = txtLlegada.Text Cells(NextRow, 3) = txtNombre.Text Cells(NextRow, 4) = txtNS.Text 5) En un módulo de VBA escriba el siguiente código y ejecute: Sub Clientes() UserForm1.Show End Sub 6) Agregar un botón de comando y vincular con el procedimiento anterior. EL CONTROL LISTBOX

    

Los elementos de un Cuadro de Lista se pueden recuperar desde un rango de celdas (especificadas por la propiedad RowSource) o pueden ser añadido usando un código de VBA (y usando el método AddItem). Un Cuadro de lista se puede configurar para permitir una selección de una celda o una selección múltiple. Esto está determinado por la propiedad MultiSelect. No es posible desplegar un Cuadro de lista sin elementos seleccionados (la propiedad ListIndex es -1). Sin embargo, una vez se ha seleccionado un elemento, no es posible no seleccionar ningún elemento. Un Cuadro de lista puede contener columnas múltiples (controladas por la propiedad ColumnCount) e incluso un encabezado descriptivo (controlado por la propiedad ColumnHeads). Los elementos de un Cuadro de lista se pueden presentar como Casillas de verificación si se permite una selección múltiple, o como Botones de opción si se permite una selección de una sola celda. Esta operación está controlada por la propiedad ListStyle.

Añadir elementos al control Cuadro de lista Antes de desplegar un Userform que use un control Cuadro de lista, probablemente se necesite rellenar el mismo con elementos. Esto se debe realizar en tiempo de diseño, usando elementos guardados en un rango de hoja de cálculo, o en tiempo de ejecución, usando VBA para añadir los elementos. Los ejemplos que veremos a continuación suponen que: Se ha generado un formulario en un UserForm llamado UserForm1.  Este formulario contiene un control de Cuadro de lista llamado ListBox1.  El libro de trabajo contiene una hoja llamada Hoja1 y un rango A1:A12 que contiene los elementos a desplegar en el Cuadro de lista. Añadir elementos a un Cuadro de lista en tiempo de diseño Para añadir elementos en tiempo de diseño los elementos deben estar guardados en en un rango de hoja de cálculo. Se usa la propiedad RowSource para especificar el rango que contiene dichos elementos (Hoja1!A1:A12). FORMULARIO 04 AÑADIR ELEMENTOS A UN CUADRO DE LISTA EN TIEMPO DE EJECUCIÓN Para añadir elementos a un Cuadro de lista en tiempo de ejecución existen dos formas:  Configurar la propiedad RowSource para una dirección de rango usando un código.  Escribir un código que usa el método AddItem para añadir los elementos al Cuadro de lista. Private Sub UserForm_Initialize() UserForm1.ListBox1.RowSource = "Hoja1!A1:A12" End Sub Si los elementos no están contenidos en un rango de hoja de cálculo, se puede escribir un código VBA para rellenar el cuadro de lista antes de que aparezca el formulario (con el método AddItem). Sub ShowUserForm1() With UserForm1.ListBox1 .RowSource = ""

.AddItem "Enero" .AddItem "Febrero" .AddItem "Marzo" .AddItem "Abril" .AddItem "Mayo" .AddItem "Junio" .AddItem "Julio" .AddItem "Agosto" .AddItem "Septiembre" .AddItem "Octubre" .AddItem "Noviembre" .AddItem "Diciembre" End With UserForm1.Show End Sub También se pude usar el método AddItem para recuperar elementos de un Cuadro de Lista a partir de un rango. Sub ShowUserForm() For Row = 1 To 12 UserForm1.ListBox1.AddItem Sheets("Hoja1").Cells(Row, 1) Next Row UserForm1.Show End Sub Selección de las opciones en el ListBox La propiedad MultiSelect que en el momento de crear el control tiene el valor 0-Single, que permite seleccionar sólo una opción, puede tomar los siguientes valores: • 1-Simple: permite seleccionar más de un elemento simplemente pulsando el botón del ratón sobre cada uno • 2-Extended: permite además seleccionar un rango de la lista combinando la tecla de mayúsculas con el botón del ratón. En este caso para seleccionar elementos aislados combinaremos la tecla Control con el ratón. Acceso a la opción en el caso de selección simple Para determinar el elemento que se ha seleccionado, hay que acceder a la propiedad Value del Cuadro de lista. MsgBox ListBox1.Value Si se necesita saber la posición del elemento seleccionado se puede acceder a la propiedad ListIndex del Cuadro de lista. MsgBox “Se ha seleccionado el elemento” & ListBox1.ListIndex Acceso a las opciones en multiselección Cuando tengamos la multiselección activada (la propiedad MultiSelect es 1 ó 2) podrá haber más de un elemento seleccionado, y las propiedades anteriores no serán adecuadas. Utilizaremos la propiedad Selected que es una matriz unidimensional de elementos tipo Boolean. El número de elementos es el mismo que el de la propiedad List.

Si el tercer elemento está seleccionado, entonces el tercer elemento de Selected tendrá el valor True, en caso contrario valdrá False. También nos puede ser útil la propiedad ListCount, que devuelve el número total de elementos de la lista. Crear un cuadro de lista con contenido variable Este ejemplo demuestra cómo crear un Cuadro de lista cuyo contenido cambia, dependiendo de la selección del usuario de un grupo de botones de opción. El cuadro de lista obtiene los elementos de un rango de hoja de cálculo. El procedimiento que controla el evento Click de los controles de Botón de opción simplemente establece la propiedad RowSource del Cuadro de lista en un rango diferente AÑADIR ELEMENTOS A UN CUADRO DE LISTA EN TIEMPO DE DISEÑO

FORMULARIO 05 Crear las siguientes listas en la Hoja1

Private Sub cmdAgregar_Click() If ListBox1.ListIndex = -1 Then Exit Sub ListBox2.AddItem ListBox1.Value End Sub Private Sub cmdQuitar_Click() If ListBox2.ListIndex = -1 Then Exit Sub ListBox2.RemoveItem ListBox2.ListIndex End Sub Private Sub rbCoches_Click() ListBox1.RowSource = "Hoja1!C1:C6" End Sub Private Sub rbColores_Click() ListBox1.RowSource = "Hoja1!B1:B10" End Sub Private Sub rbMeses_Click() ListBox1.RowSource = "Hoja1!A1:A12" End Sub CONTROL MULTIPAGE

El control Página Múltiple es muy útil para cuadros de diálogo personalizados que deben presentar muchos controles. El mencionado control permite agrupar las opciones y colocar cada grupo en una ficha aparte. Hay que tener en cuenta lo siguiente cuando se use este control: -

-

-

La ficha (o página) que se despliega al frente está determinada por la función Value el control. El valor 0 despliega la primera ficha, el 1 la segunda y así sucesivamente. De forma predeterminada, un control de Página Múltiple tiene dos páginas. Para añadir una nueva, se hace clic con el botón derecho del ratón sobre una ficha y se selecciona Nueva Página desde el menú contextual. Cuando se está trabajando con un control de Página Múltiple, basta con hacer clic sobre una ficha para establecer las propiedades de esa página en concreto. La ventana Propiedades pesenta las propiedades que se pueden ajustar. Puede ser difícil seleccionar el control de Página múltiple, porque al hacer clic sobre el mismo, se selecciona toda la página. Para seleccionar el control propiamente dicho se puede usar la tecla Tab para realizar un recorrido en círculo por todos los controles. También se puede seleccionar el control Página múltiple desde la lista desplegable de la ventana Propiedades.

Si el control página Múltiple consta de muchas fichas, se puede establecer su propiedad multiRow en True para desplegar las fichas en más de una fila. - Si se prefiere se pueden desplegar botones en lugar de fichas. Para ello se cambia la propiedad Style a 1. - La propiedad TabOrientation determina la localización de las fichas en el control Página Múltiple

EL CONTROL RefEdit El control REfEdit devuelve una cadena de texto que representa una dirección de rango. Se puede convertir esta cadena en un objeto Range mediante el uso de una instrucción como la siguiente: Set UserRange = Range(RefEdit1.Text) Desplegar la selección de rango actual es una buena práctica para inicializar el control RefEdit. Esto se puede hacer con la ayuda del procedimiento UserForm_Initialize usando una instrucción como la siguiente. RefEdit1.Text = ActiveWindow.RangeSelection.Address -

No hay que dar por supuesto que el control RefEdit siempre va a devolver siempre la dirección de rango válido, por lo tanto debemos verificar que sea realmente válido.

On Error Resume Next Set UserRange = Range(RefEdit1.Text)

If Err 0 Then MsgBox “El rango seleccionado no es válido” RefEdit1.SetFocus On error GoTo 0 Exit Sub End If Si el rango seleccionado correponde aun hoja diferente de la activa deberá indicarlo de la siguiente forma: Hoja2!A1:A20 FORMULARIO 06 Realizar el siguiente formulario:

El código para cada componente es el siguiente: Private Sub cmdBorrar_Click() reRango.Text = "" txtResultado = "" End Sub Private Sub cmdSalir_Click() End End Sub

Private Sub rbProducto_Click() Set UserRange = Range(reRango.Text) producto = 1 For Each cell In UserRange producto = producto * cell.Value Next cell txtResultado = producto End Sub Private Sub rbSuma_Click() Set UserRange = Range(reRango.Text) Suma = 0 For Each cell In UserRange Suma = Suma + cell.Value Next cell txtResultado = Suma End Sub RANGOS TRABAJAR CON RANGOS Copiar un rango (macro) Sub Copiar_Rango() Range("A4:A8").Select Selection.Copy Range("C4").Select ActiveSheet.Paste End Sub Se puede simplificar de la siguiente manera: Sub Copiar_Rango() Range("A4:A8").Copy Range("C4") End Sub Ambas macros suponen que está activa una hoja de cálculo y que la operación tiene lugar en la hoja de cálculo activa.

4. DISEÑO Y PROGRAMACIÓN DE FORMULARIOS FORMULARIO 07 Realice la siguiente tabla en la Hoja1 de un archivo Excel

En el editor de Visual Basic realizar el siguiente formulario:

Label 1 Label 2 Label 3 Label 4 TextBox1 TextBox2 CommandButton1

lbldAutonumérico lblId lblDato1 lblDato2 txtDato1 txtDato2 cmdInsertar

Id Autonumérico Dato 1 Dato 2 Insertar Siguiente

Código para los componentes: Private Sub cmdInsertar_Click() Dim rango As String Dim siguienteId As Integer If Me.txtDato1.Value = "" Then MsgBox "Escribe algo": Exit Sub If Me.txtDato2.Value = "" Then MsgBox "Escribe algo": Exit Sub If Trim(ActiveWorkbook.Worksheets(1).range("A2").Value) = "" Then rango = ActiveWorkbook.Worksheets(1).range("A2").Address Else rango = ActiveWorkbook.Worksheets(1).range("A1").End(xlDown).Address End If

If Trim(Worksheets(1).range(rango).Value) = "" Then siguienteId = 1 ActiveWorkbook.Worksheets(1).range(rango).Value = siguienteId ActiveWorkbook.Worksheets(1).range(rango).Next.Value = Me.txtDato1.Value ActiveWorkbook.Worksheets(1).range(rango).Next.Next.Value = Me.txtDato2.Value Else siguienteId = Val(ActiveWorkbook.Worksheets(1).range(rango).Value) + 1 ActiveWorkbook.Worksheets(1).range(rango)(xlDropDown).Value = siguienteId ActiveWorkbook.Worksheets(1).range(rango)(xlDropDown).Next.Value = Me.txtDato1.Value ActiveWorkbook.Worksheets(1).range(rango)(xlDropDown).Next.Next.Value = Me.txtDato2.Value End If Me.txtDato1.Value = "" Me.txtDato2.Value = "" Me.lblId.Caption = siguienteId + 1 Me.txtDato1.SetFocus End Sub Private Sub buscarId() ActiveWorkbook.Worksheets(1).Activate If Trim(ActiveSheet.range("A2").Value) = "" Then Me.lblId.Caption = "1" Else Me.lblId.Caption = Val(Worksheets(1).range("A1").End(xlDown).Value) + 1 End If End Sub Private Sub UserForm_Initialize() buscarId End Sub

FORMULARIO 08 Realice la siguiente tabla en la Hoja1 de un archivo Excel:

Presiones ALT + F11, crear una nueva Aplicación UserForm1 y diseñe tal como se muestra abajo:

Label1 ComboBox1 Image1 Label2 CommandButton1

lblTorres cmbTorres imgTorres lblNombres cmbCerrar

Torres famosas

Código fuente: Private Sub cmbTorres_Enter() On Error Resume Next cmbTorres.Clear Hoja1.Select Range("A2").Select Do While Not IsEmpty(ActiveCell) cmbTorres.AddItem ActiveCell.Value ActiveCell.Offset(1, 0).Select Loop End Sub

Private Sub cmbTorres_Change() ruta = ActiveWorkbook.Path imagen = cmbTorres.List(cmbTorres.ListIndex) & ".jpg" ruta_e_imagen = ruta & "\" & imagen imgTorres.Picture = LoadPicture(ruta_e_imagen) Cells.Find(What:=Replace(imagen, ".jpg", "")).Select lblTorre = ActiveCell.Offset(0, 1) & " (" & ActiveCell.Offset(0, 2) & ")" End Sub Private Sub cmbCerrar_Click() 'descargamos el formulario de memoria Unload Me End Sub Ejecutando la Aplicación:

FORMULARIO 09 Crear dos hojas en un archivo Excel. Hoja1: Catálogo Hoja2: Pedidos

Y además crear una tabla en la hoja Pedidos tal como se muestra a continuación:

Crear el siguiente formulario:

Código para cada componente: Private Sub cmdAceptar_Click() 'Verificamos que los txt no estén vacíos If Me.txtNoNota.text = "" Then MsgBox ("Numero de nota no puede estar vacio"): Exit Sub

If Me.txtProducto.text = "" Then MsgBox ("Producto no puede estar vacio"): Exit Sub If Me.txtPrecio.text = "" Then MsgBox ("Precio no puede estar vacio"): Exit Sub 'Insertamos los datos en la hoja If Sheets("Pedidos").Range("A2").Value = "" Then ' Si no hay ningun registro todavia Sheets("Pedidos").Range("A2").Value = Me.txtNoNota.text Sheets("Pedidos").Range("B2").Value = Me.txtProducto.text Sheets("Pedidos").Range("C2").Value = Me.txtPrecio.text Sheets("Pedidos").Range("D2").Value = Me.txtFecha.text Else 'A partir del segundo registro Sheets("Pedidos").Range("A1").End(xlDown)(xlDropDown).Value = Me.txtNoNota.text Sheets("Pedidos").Range("A1").End(xlDown).Next.Value = Me.txtProducto.text Sheets("Pedidos").Range("A1").End(xlDown).Next.Next.Value = Me.txtPrecio.text Sheets("Pedidos").Range("A1").End(xlDown).Next.Next.Next.Value = Me.txtFecha.text End If ' Limpiamos el formulario para el siguiente registro Me.txtNoNota.text = "" Me.txtProducto.text = "" Me.txtPrecio.text = "" Me.txtFecha.text = "" ' Ponemos el cursor en el primer campo Me.txtNoNota.SetFocus End Sub Private Sub cmdCancel_Click() Me.txtNoNota.text = "" Me.txtProducto.text = "" Me.txtPrecio.text = "" Me.txtFecha.text = "" Me.txtNoNota.SetFocus End Sub

Ejecutando la Aplicación:

FORMULARIO 10 Crear el encabezado de una tabla en la Hoja1 de un archivo Excel:

Crear el siguiente formulario:

Label1 Label2 Label3

lblNombre lblCategoría lblDías

Nombre Categoría Días trabajados

Label4 Label5 Label6 TextBox1 ComboBox1 TextBox2 TextBox3 TextBox4 TextBox5 CommandButton1 CommandButton2 CommandButton3

lblpago lblBonos lblSueldo txtNombre cmbCategoría txtDías txtPago txtBonos txtSueldo cmdGuardar cmdBuscar cmdEliminar

Pago por Día Bonos Sueldo

Guardar Buscar Eliminar

Código para cada componente: Private Sub cmdGuardar_Click() Range("A3").Select Selection.EntireRow.Insert txtNombre.Text = Empty cmbCategoria.Text = Empty txtDías.Text = Empty txtPago.Text = Empty txtBonos.Text = Empty txtSueldo.Text = Empty txtNombre.SetFocus End Sub Private Sub txtBonos_Change() Range("E3").Select ActiveCell.FormulaR1C1 = txtBonos.Text txtSueldo.Text = Val(txtDías.Text) * Val(txtPago.Text) + Val(txtBonos.Text) End Sub Private Sub txtNombre_Change() Range("A3").FormulaR1C1 = txtNombre.Text End Sub Private Sub txtDías_Change() Range("C3").FormulaR1C1 = txtDías.Text If cmbCategoria.Text = "Funcionario" Then txtPago.Text = 60 End If If cmbCategoria.Text = "Empleado" Then txtPago.Text = 45 End If If cmbCategoria.Text = "Obrero" Then txtPago.Text = 35 End If End Sub

Private Sub txtPago_Change() Range("D3").FormulaR1C1 = txtPago.Text End Sub Private Sub txtSueldo_Change() Range("F3").FormulaR1C1 = txtSueldo.Text End Sub Private Sub UserForm_Initialize() With UserForm1.cmbCategoria .RowSource = "" .AddItem "Funcionario" .AddItem "Empleado" .AddItem "Obrero" End With End Sub Ejecutando la Aplicación:

FORMULARIO 11 En la hoja1 de un archivo Excel crear el siguiente encabezado de tabla:

En la ventana de VBA, crear el siguiente UserForm:

Label1 Label2 Label3 TextBox1 TextBox2 CommandButton1 CommandButton2

lblNombres lblFecha lblYYYY txtNombres txtFecha cmbAgregar cmbSalir

Nombres Fecha de Nac. YYYY/MM/DD Agregar Salir

Código para cada comopnente: Private Sub cmdAgregar_Click() Dim fila As Long Dim hoja As Worksheet Set hoja = Worksheets(1) fila = hoja.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Row If Trim(Me.txtNombres.Value) = "" Then Me.txtNombres.SetFocus MsgBox "Debe ingresar nombres" Exit Sub End If hoja.Cells(fila, 1).Value = Me.txtNombres.Value hoja.Cells(fila, 2).Value = Me.txtFecha.Value Dim cumpleaños As Date Dim años As Double Dim meses As Double

cumpleaños = Me.txtFecha.Value meses = DateDiff("m", cumpleaños, Now) 'diferencia entre f.actual y cumple años = Int(meses / 12) hoja.Cells(fila, 3).Value = Str(años) Me.txtNombres.Value = "" Me.txtFecha.Value = "" Me.txtNombres.SetFocus End Sub Private Sub cmdSalir_Click() Unload Me 'Salir del Sistema End Sub Ejecutando la aplicación:

FORMULARIO 12 Ingresamos a Visual Basic y creamos los formularios y códigos siguientes:

Private Sub cmdFecha_Click() MsgBox "La fecha es: " & Date End Sub Private Sub cmdFecha5_Click() Dim nuevafecha As Date nuevafecha = Date + 5 MsgBox "Fecha actual + 5 dias: " & nuevafecha End Sub Private Sub cmdHora_Click() MsgBox "La hora actual es: " & Time() End Sub Private Sub cmdAño_Click() MsgBox "El año actual es: " & Year(Now) End Sub Private Sub cmdFechaHA_Click() MsgBox "La fecha y hora actual es: " & Now() End Sub Private Sub cmdMes Click() MsgBox "El mes actual es: " & Month(Now) End Sub

Private Sub cmdDateserial_Click() Dim myc As Date myc = DateSerial(1985, 1, 8) MsgBox "Mi cumpleaños es: " & myc End Sub Private Sub cmdDatediff_Click() Dim f As Date Dim M As String f = InputBox("Ingrese una fecha: a/m/d ") M = "dias desde hoy: " & DateDiff("d", Now, f) MsgBox M End Sub

Private Sub ccmdMinusaMayus_Click() MsgBox (Format("hola amigos", ">")) End Sub Private Sub cmd7Dic_Click() MsgBox (Format(Now, "d-mmm")) End Sub Private Sub cmddmhm_Click() ' Retorna "jueves, MyStr = Format(Now, "dddd, mmm d yyyy") MsgBox (MyStr) End Sub Private Sub cmdFechaLarga_Click() ' Retorna la fecha actual del sistema en un formato largo definido por el sistema MyStr = Format(Date, "Long Date") MsgBox (MyStr) End Sub Private Sub cmdhmsampm_Click()

' Retorna en el formato "05:04:23 PM". MyTime = Time() 'hora del sistema MyStr = Format(MyTime, "hh:mm:ss AMPM") MsgBox (MyStr) End Sub Private Sub cmdHorasMinSeg_Click() Dim MyTime, MyDate, MyStr 'MyTime = #5:04:23 PM# MyTime = Time() 'hora del sistema ' Retorna en el formato "17:4:23". MyStr = Format(MyTime, "h:m:s") 'formato MsgBox (MyStr) End Sub Private Sub cmdMayusAMinus_Click() MsgBox (Format("HOLA AMIGOS", " 10 Then Select Case promedio

Case 11 To 15 MsgBox ("Usted Aprobó con " & promedio & Chr(13) & "Bueno") Case 16 To 18 MsgBox ("Usted Aprobó con " & promedio & Chr(13) & "Muy Bueno") Case 19 To 20 MsgBox ("Usted Aprobó con " & promedio & Chr(13) & "Excelente") End Select Range("A1").Value = promedio Range("A1").Font.Color = RGB(0, 0, 255) Else Range("A1").Value = promedio Range("A1").Font.Color = RGB(255, 0, 0) MsgBox ("Usted Desaprobó con " & promedio) End If End Sub Ejecutamos la macro con la combinación de teclas Alt + F8 Seleccionamos promedio y pulsamos Ejecutar. Inserte un botón llamado Promedio que me permita ejecutar la macro.

5.11 Macros Estructuras Repetitivas Crear una nueva hoja llamada Excel Avanzado 5.11 e ir a Visual Basic pulsando la combinación de teclas Alt + F11, crear la función siguiente: Ejemplo_1: Sub Ejemplo_1()

Dim nota As Integer Dim Media As Single Media = 0 nota = val(InputBox("Entrar la 1 Nota : ", "Entrar Nota")) ActiveSheet.Range("A1").Value = nota Media = Media + nota nota = val(InputBox("Entrar la 1 Nota : ", "Entrar Nota")) ActiveSheet.Range("A2").Value = nota Media = Media + nota nota = val(InputBox("Entrar la 1 Nota : ", "Entrar Nota")) ActiveSheet.Range("A3").Value = nota Media = Media + nota nota = val(InputBox("Entrar la 1 Nota : ", "Entrar Nota")) ActiveSheet.Range("A4").Value = nota Media = Media + nota nota = val(InputBox("Entrar la 1 Nota : ", "Entrar Nota")) ActiveSheet.Range("A5").Value = nota Media = Media + nota Media = Media / 5 ActiveSheet.Range("A6").Value = Media End Sub

Ejemplo_2: Sub Ejemplo_2() Dim i As Integer Dim Total As Integer Dim valor As Integer For i = 1 To 10 valor = val(InputBox("Entrar un valor", "Entrada")) Range("A" & i).Value = valor Next i End Sub

Ejemplo_3: Sub Ejemplo_3() Dim i As Integer Dim Total As Integer Dim valor As Integer For i = 1 To 5 valor = val(InputBox("Entrar un valor", "Entrada")) Total = Total + valor Next i ActiveCell.Range("A1").Value = Total End Sub

Ejemplo_4: Sub Ejemplo_4() Dim Casilla_Inicial As String Dim i As Integer Dim Fila As Integer, Columna As Integer Casilla_Inicial = InputBox("Introducir la casilla Inicial : ", "Casilla Inicial") ActiveSheet.Range(Casilla_Inicial).Activate Fila = ActiveCell.Row Columna = ActiveCell.Column For i = 1 To 50 ActiveSheet.Cells(Fila, Columna).Value = i Fila = Fila + 1 Next i End Sub

Ejemplo_5: Sub Ejemplo_5() Dim Casilla_Inicial As String Dim i As Integer Dim Fila As Integer, Columna As Integer Casilla_Inicial = InputBox("Introducir la casilla Inicial : ", "Casilla Inicial") ActiveSheet.Range(Casilla_Inicial).Activate Fila = ActiveCell.Row Columna = ActiveCell.Column For i = 0 To 50 Step 2 ActiveSheet.Cells(Fila, Columna).Value = i Fila = Fila + 1 Next i End Sub

Bucle 1: Sub bucle1() Dim i As Integer For i = 1 To 5 Range("A" & i).Value = i Next i End Sub

Bucle 2: Sub bucle2() Dim i As Integer Dim Total As Integer Dim valor As Integer For i = 1 To 8 Step 2 valor = val(InputBox("Entrar un valor", "Entrada")) Range("A" & i).Value = valor Next i End Sub

Bucle 3: Sub bucle3() Dim i As Integer Dim Total As Integer Dim valor As Integer Dim suma As Integer For i = 1 To 5 valor = val(InputBox("Entrar un valor", "Entrada")) Range("A" & i).Value = valor suma = suma + valor Next i Range("A6").Value = suma End Sub

Asignar valor: Sub asignar() Cells(1, 3) = "hola" End Sub

Notas: Sub notas() Dim i As Integer Dim numero_notas As Integer Dim valor As Integer Dim acum_valor As Integer Dim promedio As Integer acum_valor = 0 numero_notas = val(InputBox("Ingrese la cantidad de notas")) For i = 1 To numero_notas valor = val(InputBox("Ingrese la nota " & i)) Cells(i, 1) = valor acum_valor = acum_valor + valor Next i promedio = acum_valor / numero_notas Cells(1, 2) = "Promedio = " Cells(1, 3) = promedio End Sub

5.12 Macros Operaciones Aritméticas (Select Case) Creamos un Botón llamado cmdOperaciones y hacemos doble clic el botón estando en Modo diseño Private Sub cmdOperaciones_Click() Dim Valor1 As Variant Dim Valor2 As Variant Dim Operacion As String Dim Resultado As Variant Valor1 = Val(InputBox("Ingresar Primer Valor", "Valor1")) Range("b1").Value = Valor1 Valor2 = Val(InputBox("Ingresar Segundo Valor", "Valor2")) Range("b2").Value = Valor2 Operacion = InputBox("Ingresar Tipo de Operación (+,-,*,/)", "Operación") Range("a2").Value = Operacion

Select Case Operacion Case "+" Resultado = Valor1 + Valor2 Case "-" Resultado = Valor1 - Valor2 Case "*" Resultado = Valor1 * Valor2 Case "/" Resultado = Valor1 / Valor2 End Select Range("b3").Value = Resultado End Sub

5.13 Formularios (Manejo de Formatos Fecha) Ingresamos a Visual Basic y creamos los formularios y códigos siguientes:

Private Sub CommandButton1_Click() MsgBox "La fecha es: " & Date End Sub Private Sub CommandButton2_Click() Dim nuevafecha As Date nuevafecha = Date + 5 MsgBox "Fecha actual + 5 dias: " & nuevafecha End Sub

Private Sub CommandButton3_Click() MsgBox "La hora actual es: " & Time() End Sub Private Sub CommandButton4_Click() MsgBox "El año actual es: " & Year(Now) End Sub Private Sub CommandButton5_Click() MsgBox "La fecha y hora actual es: " & Now() End Sub Private Sub CommandButton6_Click() MsgBox "El mes actual es: " & Month(Now) End Sub

Private Sub CommandButton1_Click() Dim myc As Date myc = DateSerial(1985, 1, 8) MsgBox "Mi cumpleaños es: " & myc End Sub Private Sub CommandButton2_Click() Dim f As Date Dim M As String f = InputBox("Ingrese una fecha: a/m/d ") M = "dias desde hoy: " & DateDiff("d", Now, f) MsgBox M End Sub

Private Sub CommandButton1_Click() ' Retorna la hora actual del sistema en un formato largo definido por el sistema MyStr = Format(Time, "Long Time") MsgBox (MyStr) End Sub Private Sub CommandButton10_Click() ' si no se provee el formato retorna un string MyStr = Format(23) ' Returns "23". MsgBox (MyStr) End Sub Private Sub CommandButton11_Click() MsgBox (Format("HOLA AMIGOS", "")) End Sub Private Sub CommandButton2_Click() MsgBox (Format(Now, "m/d/yy"))

End Sub Private Sub CommandButton3_Click() ' Retorna la fecha actual del sistema en un formato largo definido por el sistema MyStr = Format(Date, "Long Date") MsgBox (MyStr) End Sub Private Sub CommandButton4_Click() Dim MyTime, MyDate, MyStr 'MyTime = #5:04:23 PM# MyTime = Time() 'hora del sistema ' Retorna en el formato "17:4:23". MyStr = Format(MyTime, "h:m:s") 'formato MsgBox (MyStr) End Sub Private Sub CommandButton5_Click() MsgBox (Format(Now, "dddd,mmmm dd,yyyy")) End Sub Private Sub CommandButton6_Click() MsgBox (Format(Now, "d-mmm")) End Sub Private Sub CommandButton7_Click() ' Retorna en el formato "05:04:23 PM". MyTime = Time() 'hora del sistema MyStr = Format(MyTime, "hh:mm:ss AMPM") MsgBox (MyStr) End Sub Private Sub CommandButton8_Click() ' Retorna "jueves, MyStr = Format(Now, "dddd, mmm d yyyy") MsgBox (MyStr) End Sub Private Sub CommandButton9_Click() ' Retorna "jueves, MyStr = Format(Now, "dddd, mmm d yyyy") MsgBox (MyStr) End Sub

Private Sub CommandButton1_Click() Dim cumple As Date Dim an As Double Dim mes As Double cumple = DateSerial(TextBox1.Text, TextBox2.Text, TextBox3.Text) mes = DateDiff("m", cumple, Now) 'diferencia entre f.actual y cumple an = Int(mes / 12) 'int da la parte entera mes = mes - 12 * an 'meses sobrantes Label4.Caption = Str(an) + " Años" + Str(mes) + " Meses" End Sub Enlace entre los botones a los formularios

En la hoja siguiente:

Doble clic en el botón Calcular Edad, pero en el Modo diseño

5.14 Macro Mensajes 5.15 Ingresar encuesta En la primera hoja ingrese el botón siguiente, y en Propiedades Name: IngresarEncuesta.

Realizamos doble clic en el botón y nos envía a Visual Basic: Option Explicit Private Sub IngresarEncuesta_Click() Dim Numencuesta As Integer Dim Encuestador As String Dim Fecha As Date

Dim cuando_cliente As Integer Dim numero_prestamos As Integer Dim ultimo_prestamo As Integer Dim monto As Integer Dim negocio As String Dim edad As Integer Dim genero As String Dim ciudad As String Dim ingresos As Integer Dim estadocivil As Integer Dim hijos As Integer Dim instituciones_a As Integer Dim instituciones_b As String Dim atencion As Integer Dim mas_satisfaccion As Integer Dim cambio As Integer Dim tiempo As Integer Dim comentarios As String Dim Otra_encuesta As Variant 'Activar la hoja de datos Worksheets("Datos_de_la_Encuesta").Activate ActiveSheet.Range("A1").Activate 'Buscar la primera celda vacia de la columna A y convertirla en activa Do While Not IsEmpty(ActiveCell) ActiveCell.Offset(1, 0).Activate Loop Otra_encuesta = vbYes Do While Otra_encuesta = vbYes Numencuesta = InputBox("Número de Encuesta", "Datos de la Encuesta") Encuestador = InputBox("Código del Encuestador", "Datos de la Encuesta") Fecha = CDate(InputBox("Fecha de la Encuesta dd/mm/aaaa", "Datos de la Encuesta")) cuando_cliente = Val(InputBox("Desde cuándo es cliente: Ingrese 1 ó 2 " & Chr(13) & "1: Hace 1 año o menos" & Chr(13) & "2: Hace más de 1 año", "Datos del Cliente")) instituciones_a = Val(InputBox("Ha obtenido préstamos de otras instituciones: Ingrese 1 ó 2: " & Chr(13) & "1: SI" & Chr(13) & "2: NO", "Datos de la Competencia")) Select Case instituciones_a Case "1" instituciones_b = Val(InputBox("De qué tipo de institución ha recibido préstamos: Ingrese un código de la siguiente manera: " & Chr(13) & "1: Bancos" & Chr(13) & "2: Cooperativas" & Chr(13) & "3: ONGs" & Chr(13) & "4: De familiares" & Chr(13) & "5: Usureros (Chulqueros)" & Chr(13) & "6: Otros", "Datos de la Competencia"))

Case Else instituciones_b = "N/A" End Select atencion = Val(InputBox("Qué tal le pareció la atención brindada por el personal de la institución: Ingrese 1 ó 2 " & Chr(13) & "1: Buena" & Chr(13) & "2: Mala", "Satisfacción del Cliente")) 'así seguir ingresando datos para las otras preguntas With ActiveCell .Value = Numencuesta .Offset(0, 1).Value = Encuestador .Offset(0, 2).Value = Fecha .Offset(0, 3).Value = cuando_cliente .Offset(0, 4).Value = instituciones_a .Offset(0, 5).Value = instituciones_b .Offset(0, 6).Value = atencion End With ActiveCell.Offset(1, 0).Activate Otra_encuesta = MsgBox("Desea ingresar otra encuesta", vbYesNo + vbQuestion, "Tabulación de Encuestas") Loop End Sub En una segunda hoja realice la siguiente tabla:

5.16 Buscar y Copiar con Macros Sea la tabla en la hoja 1 (Datos):

En la hoja 2 (formulario) construya el siguiente formulario en modo diseño:

1 2

3 8

6 9

Nombres de cada control de formulario: 1. Label1 2. Lista_Campos 3. Todo 4. Solo_nombre 5. Copiar_Datos 6. Lista_Comparacion 7. Datos_Buscar 8. Numero 9. Mayusculas Código para cada control de formulario:

7

4 5

Option Explicit ' Numero de columnas(campos) de las que consta cada 'registro de la hoja datos 'Num_Columnas Constante Const Num_Columnas = 6 'boton Copiar_Datos_Click() Private Sub Copiar_Datos_Click() Dim i As Integer Dim x As Integer ' Recoger el elemento seleccionado de la lista 'Lista_Campos (Edad, ciudad,fecha...) i = Lista_Campos.ListIndex ' Si i < 0 no está seleccionado ningún elemento If i < 0 Then MsgBox ("Debe Seleccionar un campo de la lista") Else 'asigna a x el elemento seleccionado actualmente en el 'ComboBox Lista_Comparacion (igual, mayor,menor...) x = Lista_Comparacion.ListIndex 'Si x < 0 no está seleccionado ningún elemento If x < 0 Then MsgBox ("Debe Seleccionar uno operador de Comparación") Else ' llamar al procedimiento Proceder Call Proceder(i) End If End If End Sub ' Procedimineto Proceder ' Inicia la copia de los datos coincidentes ' Parámetros: ' Columna = Elementos seleccionado de la lista que coincidirá ' con la columna sobre la que se debe buscar Private Sub Proceder(Columna As Integer) 'Columna es una variable de tipo entero del procedimiento 'definicion de variables a utilizar en Proceder Dim r1 As Range, r2 As Range 'Las variables tipo Boolean se presentan como True o False Dim encontrado As Boolean Dim Valor_Comparacion As Boolean Dim Signo As Integer Dim Tipo_Datos As String ' Si el cuadro de texto está vacío, no se busca nada 'Len es una funcion referente al número de caracteres en una cadena If Len(Datos_Buscar.Value) = 0 Then MsgBox ("No hay datos que buscar")

Else ' Llama a la funcion borrar_datos 'Borrar los datos actuales Call borrar_datos ' Activar la celda A12 de la Hoja2(datos) y referenciarla con r2 Worksheets(2).Range("A12").Activate Set r2 = ActiveCell ' A12 es la celda donde se copiaran los datos en caso que ' se encuentren '******* 'Activar la celda A2 de Hoja1(formulario) 'y referenciarla con r1 Worksheets(1).Activate Worksheets(1).Range("A2").Activate ' Recorrer todo el rango de datos a Hoja1(formulario) encontrado = False 'IsEmpty: Devuelve un valor de tipo Boolean que 'indica si una variable ha sido inicializada. Do While Not IsEmpty(ActiveCell) ' Recoger el Signo de comparación Signo = Lista_Comparacion.ListIndex ' recoger el tipo de datos ' Columna = Elementos seleccionado de la lista que coincidirá 'con la columna sobre la que se debe buscar Tipo_Datos = Lista_Campos.Column(1, Columna) 'Valor_Comparacion variblae booleana 'funcion Comparar Valor_Comparacion = Comparar(ActiveCell.Offset(0, Columna).Value, _ Datos_Buscar.Value, Signo, Tipo_Datos)

If Valor_Comparacion = True Then encontrado = True ' Referenciar con r1 la celda donde estam os datos Set r1 = ActiveCell ' Copiar los datos Call Copiar_Datos_Hojas(r1, r2) ' Referenciar con r2 la casilla donde se copiaran los próximos datos Set r2 = r2.Offset(1, 0)

End If ActiveCell.Offset(1, 0).Activate Loop Worksheets(2).Activate If encontrado Then MsgBox ("Datos Copiados") Else MsgBox ("Ninguna coincidéncia") End If End If End Sub ' Función que compara dos valores con un operador relacional =, >,