Excel Avanzado 2016 v.1.3
Excel Avanzado 2016 v.1.3
Excel Avanzado 2016 v.1.3
2016
v. 1.3
Docente:
Lenin Huayta Flores
UNIVERSIDAD NACIONAL DEL ALTIPLANO
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
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:
Guardar el archivo con el Nombre Sesión 01, activando el Tipo: Libro de Excel habilitado para macros –
Guardar.
Dibuje el botón y seleccione la macro Formato y haga clic en el botón de comando Aceptar:
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.
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
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
Valor máximo: 100
Incremento: 1
Vincular con la celda: A1
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
Haga clic derecho encima del botón de opción Masculino e ir a Formato de control.
Dibujar un Cuadro de grupo y una Etiqueta2 botones de opción en la hoja, cambie los nombres de los botones:
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
PRÁCTICA 01
Abrir el archivo Práctica 01.xlsx, en activamos la hoja Registro y realizamos el siguiente formulario
B18: =BUSCARV(C16,Datos!A15:C19,3,FALSO)
Guardar como archivo macro Práctica 01.xlsm (ARCHIVO – Guardar como – Equipo – Examinar)
HojaRegistro.Range("C23").Value = HojaRegistro.Range("C23").Value + 1
End Sub
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.
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:
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
Jerarquía de objetos
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.
Ejemplos:
Para hacer referencia a un libro de Excel llamado Planilla.xlsx, escribimos la siguiente sentencia:
Application.Workbooks(“planilla.xlsm”)
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:
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).
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)
O bien:
Worksheets(1)
Objeto.Propiedad = valor
Ejemplos:
Range(“A2”).Value = 27
Range(“A2”).Font.Size = 25
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:
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
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.
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.
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:
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 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.
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.
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.
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
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
En Visual Basic no es necesario declarar las variables, por ejemplo, en el programa anterior se
hubiera podido prescindir de las líneas.
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.
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.
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.
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.
Por ejemplo, para poner “Hola Mundo” en la casilla A1 de la hoja activa sería:
ActiveSheet.Cells(1,1).Value="Hola Mundo"
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.
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:
Por Ejemplo
Dim R As Range
Dim Hoja As WorkSheet
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.
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.
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
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
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
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.
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
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.
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.
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.
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:
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"
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
EJEMPLO 18
Sub FuncionesDeComprobación()
Dim Signo As String
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
Sintáxis de MsgBox.
MsgBox( Mensaje, Botones, Título, Archivo de ayuda, contexto)
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.
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.
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.
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)
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
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.
En Visual Basic para Excel la estructura Para se implementa con la instrucción For...Next.
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
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
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.
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.
En Visual Basic
** 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
Ing. Lenin Huayta Flores 56
UNIVERSIDAD NACIONAL DEL ALTIPLANO
Instituto de Informática
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.
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.
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:
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
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:
End Sub
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.
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.
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.
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).
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.
de diálogo se presenta al usuario. Se pueden usar instrucciones VBA para cambiar las propiedades del
control en el tiempo de ejecución.
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.
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
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
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
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:
Con esto se asegura que el usuario ingresa un texto. Si este está vacío aparece un mensaje y la rutina
termina
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:
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.
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.
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.
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:
6) Ejecute.
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
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
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
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.
FORMULARIO 04
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.
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
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.
FORMULARIO 05
Crear las siguientes listas en la Hoja1
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.
- 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:
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.
Hoja2!A1:A20
FORMULARIO 06
Realizar el siguiente formulario:
End
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.
Else
rango = ActiveWorkbook.Worksheets(1).range("A1").End(xlDown).Address
End If
Me.txtDato1.Value = ""
Me.txtDato2.Value = ""
Me.lblId.Caption = siguienteId + 1
Me.txtDato1.SetFocus
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:
Código fuente:
Loop
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:
Ejecutando la Aplicación:
FORMULARIO 10
Crear el encabezado de una tabla en la Hoja1 de un archivo Excel:
txtPago.Text = 35
End If
End Sub
Ejecutando la Aplicación:
FORMULARIO 11
En la hoja1 de un archivo Excel crear el siguiente encabezado de tabla:
Me.txtNombres.Value = ""
Me.txtFecha.Value = ""
Me.txtNombres.SetFocus
End Sub
Ejecutando la aplicación:
FORMULARIO 12
Ingresamos a Visual Basic y creamos los formularios y códigos siguientes:
Nota: Vera que Excel selecciona automáticamente todas las filas seleccionadas y aplica la agrupación correspondiente.
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.3 Funciones
1. Realice la siguiente tabla:
2.4.1 Buscar
1. Realice la siguiente tabla y cambie el nombre la de hoja a Stock:
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:
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:
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?
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.
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.
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:
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.
Convertimos la tabla a Tabla dinámica, seleccionamos la tabla y vamos a INSERTAR / Tabla dinámica / Aceptar
1.
2.
4. Vamos a Campos de tabla dinámica, Fecha pedido / Filtros de fecha / Este año
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í:
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.
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.
Utilizando una tabla dinámica, mostrar la cantidad de cursos que ha realizado cada alumno en los diferentes períodos.
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:
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():
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:
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:
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:
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
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
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
En la hoja siguiente:
Option Explicit
Worksheets("Datos_de_la_Encuesta").Activate
ActiveSheet.Range("A1").Activate
Otra_encuesta = vbYes
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
1
2 3
6 8 4
7
9 5
Option Explicit
' Numero de columnas(campos) de las que consta cada
'registro de la hoja datos
'Num_Columnas Constante
Const Num_Columnas = 6
'boton Copiar_Datos_Click()
Private Sub Copiar_Datos_Click()
Dim i As Integer
Dim x As Integer
' Recoger el elemento seleccionado de la lista
'Lista_Campos (Edad, ciudad,fecha...)
i = Lista_Campos.ListIndex
' Si i < 0 no está seleccionado ningún elemento
If i < 0 Then
MsgBox ("Debe Seleccionar un campo de la lista")
Else
'asigna a x el elemento seleccionado actualmente en el
'ComboBox Lista_Comparacion (igual, mayor,menor...)
x = Lista_Comparacion.ListIndex
'Si x < 0 no está seleccionado ningún elemento
If x < 0 Then
MsgBox ("Debe Seleccionar uno operador de Comparación")
Else
' llamar al procedimiento Proceder
Call Proceder(i)
End If
End If
End Sub
' Procedimineto Proceder
' Inicia la copia de los datos coincidentes
' Parámetros:
' Columna = Elementos seleccionado de la lista que coincidirá
' con la columna sobre la que se debe buscar
Private Sub Proceder(Columna As Integer)
'Columna es una variable de tipo entero del procedimiento
'definicion de variables a utilizar en Proceder
Dim r1 As Range, r2 As Range
'Las variables tipo Boolean se presentan como True o False
Dim encontrado As Boolean
Dim Valor_Comparacion As Boolean
Dim Signo As Integer
Dim Tipo_Datos As String
'*******
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
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
For i = 0 To Num_Columnas - 1
ActiveCell.Offset(0, i).Value = ""
Next i
ActiveCell.Offset(1, 0).Activate
Loop
End Sub
Dim i As Integer
Dim Datos As Variant
Dim Final As Integer
Else
Datos = r1.Offset(0, i).Value
End If
r2.Offset(0, i).Value = Datos
Next i
End Sub
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)
'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
Sub ejemplodowhile()
Dim Nombre As String
Dim Lugar As String
Dim fecha As Date
Dim Telefono As Integer
Dim mas_datos As String
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