Вы находитесь на странице: 1из 156

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: Formato


- Tecla de método abreviado: C
- Guardar macro en: Este Libro
- Descripción: 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: 1
Valor mínimo: 1

Ing. Lenin Huayta Flores 12


UNIVERSIDAD NACIONAL DEL
Instituto de Informática
Valor máximo: 100
Incremento: 1
Vincular con la celda: A1

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) B19: =BUSCARV(B9,Planilla!A6:K19,8,FALSO)
B13: =BUSCARV(B9,Planilla!A6:K19,3,FALSO) H9: =BUSCARV(B9,Planilla!A6:K19,11,FALSO)
B15: =BUSCARV(B9,Planilla!A6:K19,5,FALSO) H13: =BUSCARV(B9,Planilla!A6:K19,10,FALSO)
B17: =BUSCARV(B9,Planilla!A6:K19,7,FALSO) H26: =AHORA()

Ing. Lenin Huayta Flores 22


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 <= 1000) Then
Descuento = Val(InputBox("Entrar Descuento", "Entrar"))
End If

ActiveSheet.Range("A1").Value = Precio
ActiveSheet.Range("A2").Value = Descuento
ActiveSheet.Range("A3").Value = Precio - Descuento
End Sub

TABLAS DE VERDAD
Vea las tablas siguientes para ver los resultados de evaluar dos condiciones con el operador And y
con el operador Or.

AND
Condición 1 Condición 2 Resultado
Falso Falso Falso
Falso Verdadero Falso
Verdadero Falso Falso
Verdadero Verdadero Verdadero

OR
Condición 1 Condición 2 Resultado
Falso Falso Falso
Falso Verdadero Verdadero
Verdadero Falso Verdadero
Verdadero Verdadero Verdadero

Observe que con el operador AND deben de cumplirse todas las condiciones para que el resultado
sea Verdadero. Con el operador OR sólo es necesario que se cumpla una para que el resultado sea
Verdadero.

2.3.15. ESTRUCTURA SELECT CASE


En ocasiones se dará el caso que en función del valor o rango de valores que pueda tener una
variable, una casilla, una expresión, etc. deberán llevarse a cabo diferentes acciones o grupos de
acciones.
EJEMPLO 16
Construiremos un procedimiento que sume, reste, multiplique o divida los valores de las casillas A1
y A2 dependiendo de si B1 contiene el signo +, -, x, /. El resultado lo deja en A3. Si en B1 no hay
ninguno de los signos anteriores en A3 debe dejarse un 0.

Sub Operadores()
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
Total = 0
If Signo = "+" Then
Total = Valor1 + Valor2
End If
If Signo = "-" Then
Total = Valor1 - Valor2
End If
If Signo = "*" Then
Total = Valor1 * Valor2
End If
If Signo = "/" Then
Total = Valor1 / Valor2
End If
ActiveCell.Range("A3").Value = Total
End Sub

En el ejemplo anterior todas las instrucciones if evalúan la misma variable. El programa funciona
correctamente pero para estos casos es mejor utilizar la instrucción Select Case, el motivo principal
es por legibilidad y elegancia. Select Case tiene la sintaxis siguiente:

Select Case Expresión


Case valores:
Instrucciones.
Case valores:
Instrucciones.

Case valores:
Instrucciones.
Case Else
Instrucciones en caso que no sean ninguno de los valores anteriores.
End Select

Vea el ejemplo anterior solucionado con esta estructura.

Sub OperadoresSelectCase()
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
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 Sub

EJEMPLO 17
Programa que pide tres notas de un alumno mediante la función InputBox. Las notas van a parar
respectivamente a las casillas A1, A2 y A3 de la hoja activa. El programa calcula el promedio y la
deja en A4.
Si el promedio está entre 0 y 5 deja en A5 el mensaje "Muy deficiente".
Si el promedio 5 deja en A5 el mensaje "Deficiente".
Si el promedio está entre 6 y 10 deja en A5 el mensaje "Insuficiente".
Si el promedio está entre 11 y 13 deja en A5 el mensaje "Suficiente"
Si el promedio está entre 14 y 17 deja en A5 el mensaje "Bien"
Si el promedio es 18 deja en A5 el mensaje "Notable"
Si el promedio es mayor que 18 deja en A5 el mensaje "Sobresaliente".

Sub Promedio3Notas()
Dim Nota1 As Integer, Nota2 As Integer, Nota3 As Integer
Dim Promedio As Single
Nota1 = Val(InputBox("Entrar Nota primera evaluación", "Nota"))
Nota2 = Val(InputBox("Entrar Nota Segunda evaluación", "Nota"))
Nota3 = Val(InputBox("Entrar Nota Tercera evaluación", "Nota"))
Promedio = (Nota1 + Nota2 + Nota3) / 3
ActiveSheet.Range("A1").Value = Nota1
ActiveSheet.Range("A2").Value = Nota2
ActiveSheet.Range("A3").Value = Nota3
ActiveSheet.Range("A4").Value = Promedio
Select Case Promedio
Case 0 To 4
ActiveSheet.Range("A5").Value = "Muy deficiente"
Case 5
ActiveSheet.Range("A5").Value = "Deficiente"
Case 6 To 10
ActiveSheet.Range("A5").Value = "Insuficiente"
Case 11 To 13
ActiveSheet.Range("A5").Value = "Suficiente"
Case 14 To 17
ActiveSheet.Range("A5").Value = "Bien"
Case 18
ActiveSheet.Range("A5").Value = "Notable"
Case Is > 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 Cancel vbCancel
3 Abort vbAbort
4 Retry vbRetry
5 Ignore vbIgnore
6 Yes vbYes
7 No vbNo
Type of Buttons
0 vbOKOnly OK button only
1 vbOKCancel OK and Cancel buttons
2 vbAbortRetryIgnore Abort, Retry, and Ignore buttons
3 vbYesNoCancel Yes, No, and Cancel buttons
4 vbYesNo Yes and No buttons
5 vbRetryCancel 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 lbldAutonumérico Id Autonumérico


Label 2 lblId
Label 3 lblDato1 Dato 1
Label 4 lblDato2 Dato 2
TextBox1 txtDato1
TextBox2 txtDato2
CommandButton1 cmdInsertar 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 lblTorres Torres famosas


ComboBox1 cmbTorres
Image1 imgTorres
Label2 lblNombres
CommandButton1 cmbCerrar

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 lblNombre Nombre


Label2 lblCategoría Categoría
Label3 lblDías Días trabajados
Label4 lblpago Pago por Día
Label5 lblBonos Bonos
Label6 lblSueldo Sueldo
TextBox1 txtNombre
ComboBox1 cmbCategoría
TextBox2 txtDías
TextBox3 txtPago
TextBox4 txtBonos
TextBox5 txtSueldo
CommandButton1 cmdGuardar Guardar
CommandButton2 cmdBuscar Buscar
CommandButton3 cmdEliminar 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 lblNombres Nombres


Label2 lblFecha Fecha de Nac.
Label3 lblYYYY YYYY/MM/DD
TextBox1 txtNombres
TextBox2 txtFecha
CommandButton1 cmbAgregar Agregar
CommandButton2 cmbSalir 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", "<"))
End Sub

Private Sub cmdmesdiaaño_Click()


MsgBox (Format(Now, "m/d/yy"))
End Sub

Private Sub cmdSabado_Click()


' Retorna "jueves,
MyStr = Format(Now, "dddd, mmm d yyyy")
MsgBox (MyStr)
End Sub

Private Sub cmdSabadoDiciembre_Click()


MsgBox (Format(Now, "dddd,mmmm dd,yyyy"))
End Sub

Private Sub cmdSinFormato_Click()


' si no se provee el formato retorna un string
MyStr = Format(23) ' Returns "23".
MsgBox (MyStr)
End Sub

Private Sub cmdTiempoLargo_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 cmdCalcular_Click()


Dim cumple As Date
Dim an As Double
Dim mes As Double
cumple = DateSerial(txtAño.Text, txtMes.Text, txtDía.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
lblEdad.Caption = Str(an) + " Años" + Str(mes) + " Meses"
End Sub

Enlace entre los botones a los formularios

5. Diseño de Aplicaciones para su Ejecución en Red


2.1.1 Esquemas Automáticos
1. Creamos la tabla siguiente:
2. Seleccione todo el rango de la tabla, incluyendo las columnas y filas de totales.
3. Vaya a la pestaña DATOS, ubique el icono Agrupar, de un clic en la flecha hacia abajo y seleccione
Autoesquema.

Nota: Vera que Excel selecciona automáticamente todas las filas seleccionadas y aplica la agrupación correspondiente.

2.1.2 Esquemas manuales


1. Realice la siguiente tabla en Excel:

2. Seleccione un rango de filas como por ejemplo Melgar - Puno.


3. Vaya a la pestaña de DATOS, y busque el icono Agrupar. De un clic en Filas y el botón Aceptar.

Nota: Agrupar manualmente significa que usted deberá seleccionar que filas son las que desea esquematizar. Sin
embargo si desea agrupar mediante un dato, estas filas deben estar contiguas; si acaso tiene filas dispersadas por toda
la tabla, es recomendable hacer una Ordenación primero por la columna que vaya a agrupar para poder realizar el
esquema.

2.2 Subtotales
1. Realice la siguiente tabla en Excel:
2. A continuación, seleccione todo el rango de la tabla

3. Ordenar de A a Z , se realiza un ordenado ascendente mediante la columna Curso


4. Vaya a la pestaña DATOS, ubique el icono de SUBTOTAL. Haga clic ahí.
5. Aparecerá una caja de dialogo que le pregunta por algunas opciones:
a. PARA CADA CAMBIO EN. Esto le indica la agrupación según el cambio de dato en una fila. Si
seleccionamos Curso, agrupara por planteles.
b. USAR FUNCION. Aquí le indicamos a Excel que tipo de subtotal queremos: CUENTA, SUMA,
PROMEDIO, MAXIMO, MINIMO, PRODUCTO, seleccionamos Cuenta
c. AGREGAR SUBTOTAL A. Aquí indicamos en que columna queremos que aparezca el subtotal. Marque
Alumno.
d. Clic en ACEPTAR.
6. Ahora Excel aplicará los cambios y mostrará la tabla con subtotales insertando filas según los cursos, y
agrupándolos como esquema.

2.3 Funciones
1. Realice la siguiente tabla:
2. Casi todas las funciones se construyen así: CONTAR(B2:B11)
3. Realice las funciones indicadas siguiendo el mismo ejemplo.

Algunas funciones estadísticas


1. =CONTAR(Rango de casillas). Cuenta la cantidad de casillas numéricas que hay en el rango.
2. =CONTARA(Rango de casillas). Cuenta la cantidad de casillas alfanuméricas del rango indicado.
3. =MODA(Rango de casillas). Devuelve el valor más común del rango.
4. =PROMEDIO(Rango de casillas). Devuelve la media de los valores del rango de casillas indicado.

Algunas Funciones de bases de datos.


1. =BDCONTAR(Rango o nombre de la tabla;Número de columna;Criterio). Cuenta el número de casillas de la
columna Número de columna de tabla que cumplen la condición de criterio.
Rango o Nombre de la tabla= Rango de casillas o nombre de la tabla.
Número columna= Columna donde se encuentran los datos sobre los que se realiza la operación.
Criterio= Rango donde se encuentra el criterio,(previamente indicado en forma de tabla).
2. =BDSUMAR(Rango o nombre de tabla;Número de columna;Criterio). Suma las casillas numéricas de la
columna Número de Columna de tabla, que cumplan la condición del criterio.
3. =BDPROMEDIO(Rango o nombre de tabla;Número Columna;Criterio). Calcula la media de los valores de la
columna Número columna de tabla, que cumplan el criterio.
4. =BDMAX(Rango o nombre de tabla;Número Columna;Criterio). Devuelve el valor máximo de la columna
Número columna indicada de tabla, que cumpla la condición del criterio.
5. =BDMIN(Rango o nombre de tabla;Número Columna;Criterio). Devuelve el valor mínimo de la columna
Número columna de tabla, que cumpla la condición del criterio.
Criterio, son siempre como mínimo dos casillas, una que es el nombre de la columna y otra que es la
condición que se ha de cumplir.
Número Columna es la posición que ocupa una determinada columna dentro de la tabla. Por ejemplo en
ejercicio que se verá posteriormente, Curso ocupa la columna cuatro.

2.4.1 Buscar
1. Realice la siguiente tabla y cambie el nombre la de hoja a Stock:

2. A continuación inserte una nueva hoja y realice la siguiente tabla:


3. Ubíquese en la posición B5, y vaya a la Barra de fórmulas e ingrese:
,
para la Unidad de Medida, Ingrese en C5:
,
haga lo mismo para el Precio Unitario en E5:

4. Realice la multiplicación condicional en Total S/. posición F5:

5. Para el Descuento en F13 realice:


6. Realice las demás operaciones de tal manera que el resultado me muestre de esta forma:

2.4.2 BuscarV
Aprenderá a usar las funciones de búsqueda con que cuenta Excel.
1. Realice la siguiente tabla y renombre la hoja de Excel como Libros:

2. En una segunda hoja de Excel, realice la siguiente tabla:


3. Lo que vamos a buscar es el precio de los libros que aparecen en esta segunda hoja, por lo que la formula
deberá ir en la celda PRECIO de cada fila.
4. La función a usar es BUSCARV (en inglés VLOOKUP), la formula queda así.
, donde A2, es el valor buscado –en este caso, la Clave del libro-,
Libros!$A$2:$D$11, es el rango de toda la tabla que está en la Libros, que se renombro como Libros; y 4, es la
columna –Precio- que tiene el valor que quiero que me regrese.
5. Lo mismo tenemos que hacer con el resto de la tabla.

2.5 Escenarios
Aprenderá a crear escenarios para responder la pregunta ¿Qué pasa Si? Los escenarios muestran diferentes
situaciones sobre una misma base de información.

1. Estamos planeando nuestras vacaciones y tenemos un presupuesto de 9500 soles. Vamos a seleccionar 3
distintos destinos para saber cual nos conviene mejor.
2. Comenzamos con el primer destino. Realice la siguiente tabla:

3. Ahora, nos vamos a la pestaña DATOS, y ubicamos el icono ANALISIS DE HIPOTESIS


4. Seleccionamos la opción ADMINISTRACION DE ESCENARIOS y aparecerá una caja de dialogo con un cuadro
de lista que contendrá los distintos escenarios. (Al principio aparecerá vacía). Damos un clic en AGREGAR
5. Aparece otro cuadro de dialogo AGREGAR ESCENARIO, escribimos el nombre de escenario como DESTINO1.
6. Después, aparece una caja indicando las celdas cambiantes, seleccionaremos únicamente las celdas de la
columna C, incluyendo su título (para identificarlo). Ejemplo: C1:C7
7. Y damos ACEPTAR. Nuestro primer escenario ha sido creado.
8. Ahora modificaremos la columna C, cambiando los valores:
9. Una vez terminado, repetimos los pasos 3 al 7. Poniendo como nombre de escenario DESTINO2.
10. Por último, volvamos a cambiar los valores de la columna C, con esta información:

11. Y volvemos a repetir los pasos del 3 al 7 poniendo como nombre de escenario DESTINO3.
12. Ahora, en nuestra caja de dialogo de ADMINISTRACION DE ESCENARIO, tenemos 3 destinos. En la parte
inferior de esta ventana, tenemos un botón que dice MOSTRAR. Si seleccionamos DESTINO1 y luego
pulsamos MOSTRAR, veremos los valores que introducimos al inicio.
13. De esta manera, podemos interpretar la pregunta: ¿Qué pasa si voy de vacaciones al DESTINO1? ¿Qué
pasa si voy de vacaciones al DESTINO2?

3.1 Calculando el IGV


1. Sea la tabla siguiente:

2. El problema es que sabemos que el valor Total de la mercancía es de 118 nuevos soles CON IGV INCLUIDO.
Dicho de otra manera, sabemos que el total es de 118 y que el IGV es el 18%. Nos hace saber cuál es el Precio
de la mercancía.
3. Y que sucede si tengo solamente el Precio de la mercancía, como hago para sacar el Total.

3.2 Tabla de Datos


1. Elaboramos una tabla y utilizando la función Pago() en Cuota Mensual B5, capturamos la siguiente
información:
2. Establecer las filas y columnas de nuestra tabla.

La idea es que la fórmula que estamos usando, tome diversos valores y no del resultado.
¿Cuánto debemos pagar modificando la tasa de interés y la cantidad de meses a pagar, por ejemplo a 6, 12 y
24 meses?
3. Seleccionar el rango de la tabla e ir a la pestaña DATOS. Seleccionar la flechita del icono ANALISIS DE
HIPOTESIS, para desplegar el menú y seleccionar TABLA DE DATOS.
Introduce la celda de entrada para la fila. En este caso es el número de meses para pagar y está en B2
Introduce la celda de entrada para la columna. Que es la tasa de interés anual está en B1.

4. Aplica y ve los resultados.

3.3 Función Si
Tenemos la siguiente relación de alumnos con su respectiva calificación final. La condición es: Si la calificación es
mayor a 10.5 debe decir APROBADO, si no, debe decir DESAPROBADO.
La fórmula es:

¿Cómo modificas para que el primer alumno no salga desaprobado?

3.4.1 Función Si anidada


Tenemos un listado de alumnos y sus calificaciones finales, las condiciones para obtener una beca son :
1. Si la calificación final está entre 19.5 y 10, obtiene un 80% de beca
2. Si la calificación final está entre 18.5 y 19.4, obtiene un 40% de beca
3. Si la calificación final está entre 18.0 y 18.4, obtiene un 25% de beca
4. Si la calificación final es menor a 17.9, no se otorga beca.

La sintaxis es la siguiente:

3.4.1 Sumar Si
Otra función de condición es la función SUMAR.SI() que permite hacer una suma condicional.
La función es: = SUMAR.SI( rango, criterio, rango_suma)
Ejemplo:

3.5 Tablas Dinámicas


Los informes de tabla dinámica permiten presentar desde distintos puntos de vista una misma información, usando
para ello funciones como la suma o el promedio.

Tenemos la siguiente tabla de datos:

1. ¿Cuál es el total que ha vendido cada vendedor?


2. ¿Cuál es el total de la venta por país?
3. ¿Quiénes son los 2 mejores vendedores?
4. ¿Cuáles son las ventas por año?

Convertimos la tabla a Tabla dinámica, seleccionamos la tabla y vamos a INSERTAR / Tabla dinámica / Aceptar
1.

2.
3. Vamos a Campos de tabla dinámica, Vendedor / Filtros de valor / 10 mejores

4. Vamos a Campos de tabla dinámica, Fecha pedido / Filtros de fecha / Este año

3.6 Gráficos Dinámicos

Es la misma idea de las tablas dinámicas pero con un gráfico. Se recomienda que para que los gráficos sean fáciles de
entender, la tabla dinámica no debe tener más de dos campos de filas y dos de columnas.
Realiza una gráfica dinámica del listado de alumnos de la práctica anterior. Debe quedar así:
1. Ilumina el rango de datos
2. Ve a la pestaña INSERTAR, ubica el icono de TABLA DINAMICA, aplicas las opciones según la ventana de
dialogo Campos de Gráfico Dinámico.
3. Das un clic en INSERTAR / GRAFICO DINAMICO.

4. Cambie seleccionando el botón Lugar de Nacimiento.

3.7 Añadir Imágenes a una Gráfica


Usaremos la opción efectos de Relleno dentro de las gráficas. El procedimiento es el mismo de crear una gráfica, la
diferencia se encuentra en la pestaña TRAMAS en el botón efectos de relleno.
Insertamos un gráfico estadístico y vayamos a Formato de serie de datos / Opciones de Serie / Relleno / Relleno de
trama y seleccionamos una trama.

4.1 Tablas Dinámicas 2 Personal de la Empresa


Realizamos la siguiente tabla

Realizar consultas para:


1. Los IDEmpleados de los trabajadores estén entre 1600 y 1800
2. Los empleados que pertenezcan al Departamento de ingeniería y tenga salario mayor a 30000
3. Liste los empleados con salario menor a 25000
4. Empleados auxiliares que no han tenido vacaciones
5. Empleados que tuvieron permisos por enfermedad
6. Trabajadores con días de vacaciones mayor igual a 15 días
7. El empleado más nuevo en haberse incorporado a la empresa
8. Empleados de la Gerencia Comercial con salario comprendido entre 25000 y 32000
9. Los apellidos de los empleados que inicien con C
10. Quiénes son los 3 mejores empleados pagados

4.2 Tablas Dinámicas 3 Clientes del Banco


Abrir la hoja 4.2 del archivo Excel avanzado 3.

Realice una consulta para cada columna.

4.3 Filtros Avanzados


Abrir el Archivo Excel Avanzado 3 Hoja 4.3

Y Realice Filtros para:


1. Realice un filtro avanzado para mostrar los pacientes del SIS que sean del C.S. Vallecito.
2. Liste los pacientes de sexo Femenino del C.S. Laraqueri mayor igual a 18 años de edad.
3. Obtenga los pacientes del C.S. Chejoña, con fecha de afiliación del año 2013.
4. Liste los pacientes cuyo número de identificación N° AFILIACV sea mayor o igual a 76484044 y cuyo nombre empiece
con L o M.
5. Liste los pacientes que no tienen fecha de baja.
6. Liste los pacientes que sean mayores a 90 años de edad y sean del C.S. Simón Bolívar.
7. Liste los pacientes que no tengan registrados su DNI y sean del C.S. Puno y sean mayores de 65 años de edad
ordenados por Apellidos.

4.4 Tablas Dinámicas 4 Cursos CCI


Sea la tabla:

Utilizando una tabla dinámica, mostrar la cantidad de cursos que ha realizado cada alumno en los diferentes períodos.

5.1 Macros: Formato de Fuente


Nos ubicamos en la primera celda de la hoja 5.1 y vamos a Vista / Macros / Grabar Macro…, Dar el Nombre a la macro
como FormatoFuente, crear un atajo de teclas C. Y hacemos clic en Aceptar.
Ahora cambiamos el formato de fuente en la pestaña INICIO / Fuente:
- Fuente : Bookman Old Style
- Tamaño : 16
- Color : Verde
- Negrita, Cursiva y Subrayado.
Ahora detengamos el grabado de macro. Vamos a VISTA / Macros / Detener grabación
Escribimos en la hoja 5.1 el Nombre y Apellidos.
Seleccionamos las celdas que contienen el nombre y apellidos.
Vamos a VISTA / Macros / Ver macros y seleccionamos la macro FormatoFuente y hacemos clic en Ejecutar.
Guardar el archivo con el Nombre Excel Avanzado 4, activando el Tipo: Libro de Excel habilitado para macros

5.2 Crear una Función NumLetras(), que convierta Números a Letras, con Visual Basic.
Activamos la pestaña Desarrollador
Archivo / Opciones / Personalizar cinta de opciones, activamos Desarrollador

Y Aceptar.
Ejemplo: 20 → Veinte
Nos ubicamos en la Hoja 5.2 y vamos a Microsoft Visual Basic para Aplicaciones pulsando la combinación de teclas
ALT + F11.
Luego creamos un Módulo, haciendo clic derecho en VBAProject (Excel Avanzado 4 …) y vamos a Insertar / Módulo,
tal como se muestra en la figura siguiente:

En Módulo ingrese el código siguiente:

Function NumLetras(tyCantidad As Currency) As String


Dim lyCantidad As Currency, lyCentavos As Currency, lnDigito As Byte, lnPrimerDigito As Byte, lnSegundoDigito As
Byte, lnTercerDigito As Byte, lcBloque As String, lnNumeroBloques As Byte, lnBloqueCero
Dim laUnidades As Variant, laDecenas As Variant, laCentenas As Variant, I As Variant 'Si esta como Option Explicit
tyCantidad = Round(tyCantidad, 2)
lyCantidad = Int(tyCantidad)
lyCentavos = (tyCantidad - lyCantidad) * 100
laUnidades = Array("UNO", "DOS", "TRES", "CUATRO", "CINCO", "SEIS", "SIETE", "OCHO", "NUEVE", "DIEZ",
"ONCE", "DOCE", "TRECE", "CATORCE", "QUINCE", "DIECISEIS", "DIECISIETE", "DIECIOCHO", "DIECINUEVE", "VEINTE",
"VEINTIUNO", "VEINTIDOS", "VEINTITRES", "VEINTICUATRO", "VEINTICINCO", "VEINTISEIS", "VEINTISIETE",
"VEINTIOCHO", "VEINTINUEVE")
laDecenas = Array("DIEZ", "VEINTE", "TREINTA", "CUARENTA", "CINCUENTA", "SESENTA", "SETENTA", "OCHENTA",
"NOVENTA")
laCentenas = Array("CIENTO", "DOSCIENTOS", "TRESCIENTOS", "CUATROCIENTOS", "QUINIENTOS", "SEISCIENTOS",
"SETECIENTOS", "OCHOCIENTOS", "NOVECIENTOS")
lnNumeroBloques = 1
Do
lnPrimerDigito = 0
lnSegundoDigito = 0
lnTercerDigito = 0
lcBloque = ""
lnBloqueCero = 0
For I = 1 To 3
lnDigito = lyCantidad Mod 10
If lnDigito <> 0 Then
Select Case I
Case 1
lcBloque = " " & laUnidades(lnDigito - 1)
lnPrimerDigito = lnDigito
Case 2
If lnDigito <= 2 Then
lcBloque = " " & laUnidades((lnDigito * 10) + lnPrimerDigito - 1)
Else
lcBloque = " " & laDecenas(lnDigito - 1) & IIf(lnPrimerDigito <> 0, " Y", Null) & lcBloque
End If
lnSegundoDigito = lnDigito
Case 3
lcBloque = " " & IIf(lnDigito = 1 And lnPrimerDigito = 0 And lnSegundoDigito = 0, "CIEN", laCentenas(lnDigito - 1))
& lcBloque
lnTercerDigito = lnDigito
End Select
Else
lnBloqueCero = lnBloqueCero + 1
End If
lyCantidad = Int(lyCantidad / 10)
If lyCantidad = 0 Then
Exit For
End If
Next I
Select Case lnNumeroBloques
Case 1
NumLetras = lcBloque
Case 2
NumLetras = lcBloque & IIf(lnBloqueCero = 3, Null, " MIL" & NumLetras)
Case 3
NumLetras = lcBloque & IIf(lnPrimerDigito = 1 And lnSegundoDigito = 0 And lnTercerDigito = 0, " MILLON", "
MILLONES" & NumLetras)
End Select
lnNumeroBloques = lnNumeroBloques + 1
Loop Until lyCantidad = 0
NumLetras = "" & NumLetras & IIf(tyCantidad > 1, "", "")
'NumLetras = NumLetras & " CON " & Format(Str(lyCentavos), "00") & "/100 " & IIf(ValorEntero = 1, MonedaSingular,
MonedaPlural)
End Function

Guardamos la Hoja de Cálculo como macro e ingresamos datos con la función creada NumLetras():

5.3 Asociar una Macro creada a un botón (Registro de Datos).


Realizamos la siguiente tabla:

Vamos a la pestaña DESARROLLADOR / Visual Basic o pulsamos ALT + F11


Creamos el formulario siguiente:
Realizamos doble clic en el botón Agregar e ingresamos el código siguiente:

Realizamos doble clic en el botón Salir e ingresamos el código siguiente:


Ahora agreguemos el botón en la Hoja 5.3, para ello vamos a DESARROLLADOR / Insertar / botón se muestra el
cuadro de diálogo Asignar macro y como el Nombre de la macro: formulario, y pulsamos Aceptar.
Nos muestra la parte del código del botón insertado en la cual ingresaremos lo siguiente:

Guardamos como macros.

5.4 Ingreso de Empleados

5.5 Controles de Formulario


Abra el archivo Excel Avanzado 5.5 y crea una nueva hoja llamada: Formulario y creamos lo siguiente:
Valores de celdas y controles del formulario:

Hagamos clic derecho y seleccionamos Formato de Control:

D9:
E9:
F9:
Casilla (Control de Formulario) clic derecho y Formato de Control

F17:
Valores de Celdas:
D20:
D21:
G21:
D22:
D23:
D24:
D26:
D29:

5.6 Manejo de Cadenas


Abra el archivo Excel Avanzado 5.6 ingrese las funciones siguientes y explique qué es lo que realiza cada una de las
funciones:

IZQUIERDA:
Código Turno:
Nombre:
Nombre (Extraer):

DERECHA:
Código Sección:
Apellidos:
Apellidos Extraer:

EXTRAE
DNI:

HALLAR
POSICION:

LARGO:
Tamaño:

CONCATENAR:
Nombre Completo:
E_mail:

5.7 Macros con Operadores


Crear una Hoja de Cálculo con el nombre de Excel Avanzado 5.7 y en Visual Basic crear el Módulo1 y realizar el
siguiente código:

Sub NombresyApellidos()
ActiveSheet.Range("A4").Value = "Lenin Huayta Flores"
ActiveSheet.Range("A4").Font.Bold = True
ActiveSheet.Range("A4").Font.Color = RGB(255, 0, 0)
End Sub
Sub EntrarValor()
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
Sub Sumar()
Dim Numero1 As Integer
Dim Numero2 As Integer
Numero1 = InputBox("Entrar el primer valor", "Entrada de datos")
Numero2 = InputBox("Entrar el primer valor", "Entrada de datos")
ActiveSheet.Range("f2").Value = Numero1 + Numero2
End Sub
Sub Sumar2()
Dim A As Integer
Dim B As Integer
A = Range("A1").Value
B = Range("A2").Value
ActiveSheet.Range("A3").Value = A + B
End Sub
Sub Resta2()
Dim A As Integer
Dim B As Integer
A = Range("A1")
B = Range("A2")
ActiveSheet.Range("A3").Value = A - B
End Sub
Sub Multiplicar2()
Dim A As Integer
Dim B As Integer
A = Range("A1")
B = Range("A2")
ActiveSheet.Range("A3").Value = A * B
End Sub
Sub Dividir2()
Dim A As Integer
Dim B As Integer
A = Range("A1")
B = Range("A2")
ActiveSheet.Range("A3").Value = A / B
End Sub

Cambiar de nombre a la Hoja1 como Operadores y realizar el siguiente formulario:

En los Botones enlazar las funciones correspondientes de las Macros creadas:


+: Sumar2
-: Resta2
*: Multiplicar2
/: Dividir2
Entrar Valor: EntrarValor
Suma: Sumar
Nombres: NombresyApellidos

Guardar la hoja de cálculo como una macro.

5.8 Tabla Dinámica con Columnas


Realice la siguiente tabla:
Convierta a tabla dinámica.
Y seleccione Cliente, Precio y Meses.
Luego arrastre Meses a Columnas tal como se muestra a continuación.
5.10 Macros Select Case
Crear una nueva hoja llamada Excel Avanzado 5.10 e ir a Visual Basic pulsando la combinación de teclas Alt + F11, crear
la función siguiente:

Sub promedio()
Dim nota1 As Integer
Dim nota2 As Integer
Dim nota3 As Integer
Dim promedio As Integer
nota1 = Val(InputBox("Ingrese la primera nota:", "Nota 1"))
nota2 = Val(InputBox("Ingrese la segunda nota:", "Nota 2"))
nota3 = Val(InputBox("Ingrese la tercera nota:", "Nota 3"))
promedio = (nota1 + nota2 + nota3) / 3
If promedio > 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 CommandButton12_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

6 8 4
7
9 5

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:


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 =, >, <, etc.
' La función devuelve True o False en función de la comparación.
' Parámetros.
' Valor1 y Valor2 = Valores que se comparan
' Signo = variable que sirve para escoger el operador relacional
' en función de su valor, ver estructura Select Case

Private Function Comparar(Valor1 As Variant, Valor2 As Variant, Operador As Integer, Tipo As String) As Boolean

Dim q As Boolean

Select Case Tipo


Case "N": ' Convertir a número
Valor2 = Val(Valor2)
Case "F": ' Convertir a Fecha
Valor2 = CDate(Valor2)
End Select

Select Case Operador


Case 0:
q = Valor1 = Valor2
Case 1:
q = Valor1 > Valor2
Case 2:
q = Valor1 < Valor2
Case 3:
q = Valor1 >= Valor2
Case 4:
q = Valor1 <= Valor2
End Select
Comparar = q

End Function
' Procedimiento para borrar los datos de Hoja2 se llama antes
' de proceder a la nueva copia
Private Sub borrar_datos()

Dim i As Integer

Worksheets(2).Range("A12").Activate

Do While Not IsEmpty(ActiveCell)

For i = 0 To Num_Columnas - 1
ActiveCell.Offset(0, i).Value = ""
Next i
ActiveCell.Offset(1, 0).Activate
Loop

End Sub

' Procedimiento para copiar los datos de Hoja1 a Hoja3


' Parámetros.
' r1 = Celda Origen
' r2 = Celda Destino
Private Sub Copiar_Datos_Hojas(r1 As Range, r2 As Range)

Dim i As Integer
Dim Datos As Variant
Dim Final As Integer

' Si Botón Todo Activado, se copian todas las columnas


If Todo.Value = True Then
Final = Num_Columnas - 1
Else ' Sólo se copian las dos primera columnas
Final = 1
End If
' recorrer las columnas del registro y copiar celda a celda
For i = 0 To Final

' Si la casilla Mayusculas está activada y el tipo de datos es String


If Mayusculas.Value = True And TypeName(r1.Offset(0, i).Value) = "String" Then
Datos = UCase(r1.Offset(0, i).Value)
Else
Datos = r1.Offset(0, i).Value
End If
r2.Offset(0, i).Value = Datos
Next i

End Sub

Private Sub Datos_Buscar_Change()


' Si el numero de control está activado
If Numero.Enabled Then
' No permite coger valores superiores a la propiedad Max
If Val(Datos_Buscar.Value) > Numero.Max Then
MsgBox ("Valor demasiado grande")
Datos_Buscar.Value = Numero.Max
Else
' No permite coger valores inferiores a la propiedad Min
If Val(Datos_Buscar.Value) < Numero.Min Then
MsgBox ("Valor demasiado pequeño")
Datos_Buscar.Value = Numero.Min
Else
Numero.Value = Val(Datos_Buscar.Value)
End If
End If
End If
End Sub
'combobox lista de: edad,ciudad, cantidad, fecha...
Private Sub Lista_Campos_Change()
Dim i As Integer
'Tipo_Datos variable
Dim Tipo_Datos As String

'ListIndex item seleccionado en el combo


i = Lista_Campos.ListIndex

If i >= 0 Then
'Column(1, i)uno o más elementos en un ComboBox (coloumna 1 fila i)
Tipo_Datos = Lista_Campos.Column(1, i)

'Tipo_Datos = "N" (numero)


If Tipo_Datos = "N" Then
'activar control de numero
Numero.Enabled = True

'.Value contenido de un control determinado.


If Lista_Campos.Value = "Edad" Then
Numero.Min = 0
Numero.Max = 99
Numero.SmallChange = 1
Datos_Buscar = 0 'Name del Textbox
Numero.Value = 0
End If
If Lista_Campos.Value = "Cantidad" Then
Numero.Min = 0
Numero.Max = 500000
Numero.SmallChange = 1000
Datos_Buscar = 0
Numero.Value = 0
End If
Else
Numero.Enabled = False
End If
End If
End Sub

'control de número
Private Sub Numero_Change()
'textbox=valor que selecciona el control de nùmero
Datos_Buscar.Value = Numero.Value
End Sub

5.17 Series
En la primera hoja creamos una forma y le asignamos la macro ejemplofor

En la segunda hoja creamos una forma y le asignamos la macro ejemplofor


Sub ejemplodowhile()
Dim Nombre As String
Dim Lugar As String
Dim fecha As Date
Dim Telefono As Integer
Dim mas_datos As String

Call formato 'llama a la función formato


GoTo etiqueta 'salta a la etiqueta en este caso a etiqueta

etiqueta_error: ' se ejecuta cuando se produzca el error


MsgBox ("se ha producido un error")
Resume etiqueta_fecha 'se dirige a la etiqueta_fecha para solicitar
'nuevamente el ingreso de la fecha
etiqueta: 'marca para saber a donde va la ejecuciòn de un programa
On Error GoTo etiqueta_error: 'Activa la rutina de control de errores que comienza
'en la línea especificada
Worksheets("DoWhileLoop").Activate 'activa la hoja2
ActiveSheet.Range("a2").Activate ' activa la celda a2
mas_datos = MsgBox("Desea ingresar datos", vbYesNo + vbQuestion, "Ingreso de datos")

Do While mas_datos = vbYes

Call Saltar_Celdas_Llenas 'llama a la función Saltar_Celdas_Llenas()

Nombre = InputBox("Ingrese el Nombre:", "Nombre")


Lugar = InputBox("Ingrese el Lugar:", "Lugar")

etiqueta_fecha: 'si existe el error vuelve a solicitar que ingrese la fecha en el formato indicado
fecha = CDate(InputBox("Ingrese la fecha:dia/mes/año", "Fecha"))
Telefono = Val(InputBox("Ingrese numero telefonico:", "Telefono"))
With ActiveCell
.Value = Nombre
.Offset(0, 1).Value = Lugar
.Offset(0, 2).Value = fecha
.Offset(0, 3).Value = Telefono
End With
ActiveCell.Offset(1, 0).Activate
mas_datos = MsgBox("Desea ingresar màs datos", vbYesNo + vbQuestion, "Ingreso de datos")
Loop
End Sub

5.18 Formulario 2

Código para cada componente del formulario

Private Sub CommandButton1_Click()


On Error GoTo noencontro
Cells.Find(What:=TextBox1, After:=ActiveCell, LookIn:=xlFormulas, LookAt _
:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
False).Activate
ActiveCell.Offset(0, 1).Select
TextBox2 = ActiveCell
ActiveCell.Offset(0, 1).Select
TextBox3 = ActiveCell
noencontro:
End Sub

Private Sub CommandButton2_Click()


Selection.EntireRow.Delete
Range("A9").Select
TextBox1 = Empty
TextBox2 = Empty
TextBox3 = Empty
TextBox1.SetFocus
End Sub

Private Sub CommandButton3_Click()


Range("A9").Select
Selection.EntireRow.Insert
TextBox1 = Empty
TextBox2 = Empty
TextBox3 = Empty
TextBox1.SetFocus
End Sub

Private Sub TextBox1_Change()


Range("A9").FormulaR1C1 = TextBox1
End Sub

Private Sub TextBox2_Change()


Range("B9").FormulaR1C1 = TextBox2
End Sub

Private Sub TextBox3_Change()


Range("C9").FormulaR1C1 = TextBox3
End Sub

Вам также может понравиться