Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Curso Macros Excel Programacion VBA - Daniel Zegarra Zavaleta PDF
Curso Macros Excel Programacion VBA - Daniel Zegarra Zavaleta PDF
5. Sentencias de Control
a. If...thenelse
b. Select Case
c. Do While/Until
d. For Next
e. For Each Next
f. With End With
iii. Arreglos
b. Sentencias de asignacin
i. De datos
ii. De objetos (Set)
c. Tipos de objetos
i. Aplicaciones, libros, hojas, rangos, celdas, grficos, formas, etc.
ii. Colecciones de objetos
2. Control del flujo de un programa
a. Sentencias de bifurcacin
b. Sentencias de repeticin o bucle
c. Sentencia de ejecucin mltiple con un objeto
d. Las Sentencias: Goto, Call, Exit
3. Manejo de Rangos
a. Mover y copiar rangos
b. Nombrar rangos
c. Obteniendo la interseccin de rangos
d. Proteger y desproteger rangos
4. Manejo de hojas
a. Insertar hojas
b. Nombrar hojas
c. Eliminar hojas
d. Ocultar y mostrar hojas
e. Proteger y desproteger hojas
5. Manejo de archivos
a. Abrir un archivo
b. Abrir un archivo de texto como hoja de calculo
c. Abrir un archivo elegido por el usuario
d. Cerrar archivos
e. Eliminar archivos
f. Verificar si un archivo existe
g. Verificar si un libro est abierto
6. Uso de arreglos
a. Declarar un arreglo
b. Arreglos multidimensionales
c. Convertir una lista en un arreglo
d. Redimensionar un arreglo
7. Formularios avanzados
a. Inicializar formularios
b. Formularios de fichas mltiples
c. Formulario para ingreso de fechas con calendario
d. Formularios para ingreso de usuarios con contrasea
8. Crear Funciones personalizadas
9. Uso de botones de control ActiveX
a. Propiedades de los controles
b. Cdigo VBA de los controles
10. Manejo de grficos
a. Redefinir los rangos a graficar
b. Mostrar grficos en una ventana de formulario
11. Manejo de formas e imgenes
a. Mover, copiar, cambiar tamao
b. Escribir formulas en las formas
La Programacin en Excel
g. Uso de la grabadora de macros
A pesar que la programacin se realiza internamente utilizando el lenguaje de
Visual Basic, no es necesario que los usuarios de Excel sepan necesariamente el
uso de este lenguaje. Y esto es as, gracias a que existe la posibilidad de que se
puedan grabar las acciones que necesitamos utilizando para ello una grabadora
de macros, la cual almacena en memoria todas las acciones a grabar, e
internamente convierte a estas en un programa en Visual Basic.
Para crear una macro haciendo uso de la grabadora de macros se siguen los
siguientes pasos:
1.- Llamar al men Herramientas/
Macro/Grabar nueva macro
2.- Escribir un nombre para la
macro a grabar. Este nombre
no deber contener espacios en
blanco.
3.- Al aparecer el mensaje
Grabando en la barra de
estado, hay que realizar
cuidadosamente y en forma
secuencial, todas las acciones
que se desean grabar.
Una vez creada, veamos a continuacin como se hace para que la macro
funcione:
Clic derecho
----------------
----------------
----------------
Asignar macro...
----------------
----------------
1.- Sealar con el mouse el borde del botn y hacer un clic derecho para llamar
al men contextual
2.- En el men elegir la opcin Asignar macro.
3.- Seleccionar el nombre de la macro de la lista y luego clic en Aceptar.
Ejemplo
Se va ha crear una macro que alinee
verticalmente al centro, el contenido
de una celda:
1.- Para esto primero escribir en
una celda un dato.
1.- Llame al men
Herramientas/Macro/Grabar
nueva macro y escriba como
nombre de la macro:
CentradoVertical (sin dejar
espacio en blanco entre las 2
palabras), y luego Aceptar.
2.- Al aparecer el mensaje
Grabando en la barra de
estado, realizar la accin de centrado, esto es: llamar al men
Sub CentradoVertical()
'
' Macro creada por Daniel Zegarra - UNI
'
With Selection
.HorizontalAlignment = xlGeneral
.VerticalAlignment = xlCenter
.WrapText = False
.Orientation = 0
.AddIndent = False
.ShrinkToFit = False
.MergeCells = False
End With
End Sub
Este programa se encontrara escrito en una hoja de Modulo insertada dentro del
libro actual de Excel, y para ver esta hoja de mdulo habra que ingresar a la
ventana del Editor de Visual Basic.
Nota.- Si al crear una macro con la grabadora de macros, se le da como nombre el de una
macro ya existente, aparecer una ventana consultndonos si se desea sobrescribir esa
macro. Si se le contesta que Si, entonces se borrar la macro existente y se grabar
una nueva en su lugar.
Aclaracin previa:
Si para usted es la primera vez que va a escribir un programa para computadora,
entonces al principio esto le parecer que es algo complicado, y lo que
inicialmente vemos escrito dentro de un programa es como leer chino, pero no se
desanime; lo que ocurre es que a pesar de que el computador es una mquina
inteligente, sta sin embargo, no razona como lo hara cualquier persona; as que
cuando hay que darle ordenes al computador hay que establecer ciertas reglas
estrictas con el fin de que entienda claramente que es lo que deseamos que haga.
Por ejemplo
Si en su casa se ha puesto la tetera para hervir agua en una cocina a gas, y
comienza a hervir el agua; entonces usted podra ordenarle a su hijo menor que
por favor apague la cocina.
Si su hijo aun es pequeo, cmo cree que hara para apagar la cocina?:
- Comienza a soplar la hornilla hasta que se apaga?
- Hecha agua a la hornilla para apagarla?
- Gira la perilla de encendido para apagar la hornilla?
Usted tendra que ser ms preciso en darle las instrucciones al pequeo para que
pueda apagar la cocina como es debido sin que ocurra ninguna desgracia, pues l
quizs aun no se percata exactamente del peligro que esta accin conlleva.
Pues veamos ahora, el computador tampoco se da cuenta de lo que en realidad
est haciendo, el solo cumple las ordenes que le damos, de all que estas rdenes
deben ser muy precisas, sin ambigedades para que no lleven a errneas
suposiciones por parte del computador. Es as que primeramente cada orden
dada al computador tiene una forma exacta de escribirse; a esta forma exacta de
escribir las rdenes se conoce como la sintaxis de las instrucciones.
Sub Mensaje()
Dim Cliente As String
Cliente = "Jos Samuel"
MsgBox Prompt:="Hola " & Cliente, Title:="Cuadro de saludo", _
Buttons:=vbExclamation
End Sub
b. Aadir comentarios
Los comentarios pueden explicar un procedimiento o una instruccin en
particular a cualquier persona que tenga que leer el cdigo. Visual Basic ignora
los comentarios cuando ejecuta los procedimientos. Las lneas de comentario
comienzan por un apstrofe (') o con la palabra clave Rem seguida por un
espacio y puede colocarse en cualquier lugar del procedimiento. Para aadir un
comentario a la misma lnea que ocupa una instruccin, debe insertarse un
Dim SUELDO
Dim EDAD As Variant
EMPRESA = "Editora Macro"
Sub Ubicacion()
Dim Lugar As String
Lugar = ActiveCell.Address
MsgBox "La celda actual es " & Lugar
End Sub
Este otro ejemplo utiliza InputBox para preguntar el nombre a una persona y
luego asignar la respuesta a la variable Nombre. Luego MsgBox muestra el
nombre de la persona en una ventana.
Sub Pregunta()
La instruccin Set se utiliza para asignar un objeto a una variable que ha sido
declarada como objeto. La palabra clave Set es necesaria. En el siguiente
ejemplo, la instruccin Set asigna la celda A1 de la Hoja3 a la variable de objeto
Celda. Luego le asigna la propiedad Bold e Italica al objeto Font y finalmente
asigna a Celda el valor 2013.
Sub DarFormato()
Dim Celda As Range
Set Celda = Worksheets("Hoja3").Range("A1")
With Celda.Font
.Bold = True
.Italic = True
End With
Celda= 2013
End Sub
ActiveCell.Font.Bold = True
Es una tarea comn en Visual Basic especificar una celda o un rango de celdas,
y a continuacin realizar alguna accin en ellas, como ingresar un dato, escribir
una frmula o cambiar el formato. Normalmente esto se realiza en una
instruccin que primero identifica el rango y luego adems cambia una
propiedad o aplica un mtodo sobre ese rango.
Un objeto Range en Visual Basic puede ser una celda individual o un rango de
celdas. Los siguientes temas muestran las maneras ms usuales de identificar y
trabajar con objetos Range.
Referencia Significado
Range("A:A") Toda la columna A
Range("3:3") Toda la fila 3
Range("A:C") Columnas de la A a la C
Range("1:5") Filas de la 1 a la 5
Range("1:1,3:3,8:8") Mltiples filas 1, 3 y 8
Range("A:A,C:C,F:F") Mltiples columnas A, C y F
Range("A1:B4","E3:F9") Equivalente a todo el rango
A1:F9
Utilice la propiedad Rows o Columns para trabajar con filas o columnas enteras.
Estas propiedades devuelven un objeto Range que representa un rango de celdas.
La siguiente tabla muestra algunas referencias de fila y columna, utilizando las
propiedades Rows y Columns.
Referencia Significado
Rows(1) Fila uno
Rows Todas las filas de la hoja de clculo
Columns(1) Columna uno
Columns("A") Columna uno
Columns Todas las columnas de la hoja de
clculo
Sintaxis: Range(referencia).Select
Selecciona el rango B5
Range("B5").Select
Sintaxis: [referencia].Select
Donde: referencia puede ser un rango de celdas o un nombre de rango,
escritos entre comillas
Sintaxis: ActiveCell.Range(referencia).Select
Donde: referencia Es un rango de celdas que considera a la celda
actual como si fuera la primera celda superior izquierda de la hoja
de calculo
ActiveCell.CurrentRegion.Select
Selecciona una fila de 4 celdas y a partir de ellas hacia abajo todas las
celdas ocupadas + 5 filas adicionales
Range(ActiveCell.Range("A1:D1"), ActiveCell.End(xlDown). _
Offset(5, 0)).Select
ActiveCell.EntireColumn.Cells(ActiveCell.CurrentRegion.Rows. _
Count + ActiveCell.CurrentRegion.Row - 1, 1)).Select
Sintaxis: Referencia.Clear
Referencia.ClearContents
Referencia.ClearFormats
Donde: Referencia Es un rango de celdas
Sintaxis: Referencia.Delete
Donde: Referencia Es un rango de filas o columnas
Sintaxis: Referencia.Insert
Donde: Referencia Es un rango de filas o columnas
Vamos a suponer que usted no sabe nada de programacin, asi que vamos a
crear una serie de macros simples para que realicen varias de las acciones a las
cuales estamos acostumbrados a realizar nosotros mismos en la hoja de calculo
con el mouse y el teclado.
1.- En una hoja en blanco escriba los cuadros que se muestran en la imagen
anterior y luego guarde el archivo con el nombre Muebles.
2.- Dle nombre a los siguientes rangos de celda:
A3:C7 Tabla E3:F7 Precios B10:D12 Resumen
3.- Ingrese al Editor de Visual Basic con las teclas Alt+F11 y luego inserte una
nueva hoja de mdulo (Men Insertar/Mdulo).
4.- En la hoja de mdulo escriba el siguiente procedimiento Sub:
6.- Para ejecutar ahora la macro presione las teclas Alt+F8, luego en la
ventana que aparece elegir la macro Prueba con un clic y a continuacin
Clic en Ejecutar.
1) Seleccionar la celda B4
Range("B4").Select
Nota.- Para seleccionar un rango de celdas, use el mtodo Select. Para activar slo una
celda, puede utilizar el mtodo Activate. Si se activa una celda que se encuentra dentro
del rango seleccionado entonces no se pierde la seleccin, pero si la celda que se
activa est fuera del rango seleccionado la seleccin se perder y solo quedar
seleccionada la celda activa.
7) Seleccionar los rangos desde Tabla hasta Resumen (el resultado es un rango
mayor que incluye Tabla y Resumen, y todas las celdas que se encuentran
entre estos dos rangos separados)
Range("Tabla", "Resumen").Select
10) Seleccionar el rango A3:C7 y luego "activar la celda" 2 filas hacia abajo y
una columna hacia la derecha dentro del rango seleccionado
Range("A3:C7").Select
Selection.Offset(2,1).Activate
Range("A3:C7").Select
ActiveCell.Offset(2,1).Select
ActiveCell.CurrentRegion.Select
ActiveCell.Offset(Selection.Rows.Count, 0).Select
ActiveCell.CurrentRegion.Rows(2).Select
Range(Selection, ActiveCell.Offset(ActiveCell.CurrentRegion. _
Rows.Count - 2, 0)).Select
La Propiedad End
Desplaza el puntero a la celda situada al final de la regin que contiene el rango fuente.
Equivale a presionar las teclas FIN+FLECHA ARRIBA, FIN+FLECHA ABAJO,
FIN+FLECHA IZQUIERDA o FIN+FLECHA DERECHA.
Sintaxis:
Expresin.End(Direccin)
Donde:
1.- En una hoja en blanco escriba el siguiente cuadro y luego guarde el archivo
con el nombre Destinos.
2.- Ingrese al Editor de Visual Basic con las teclas Alt+F11 y luego de insertar
una nueva hoja de modulo (Men Insertar/Mdulo) al igual que en el
ejercicio anterior, escriba los siguientes procedimientos Sub:
Nota.- Para los dos ejemplos anteriores que nombran un rango como abc, en el primer caso
hay que seleccionar el rango y despus ejecutar la macro. En el segundo caso basta
con que el puntero de celda se encuentre dentro del cuadro y al ejecutar la macro, a
todo el cuadro (Regin actual) se le dar el nombre de rango.
ActiveCell.CurrentRegion.Columns(2).Select
Nota.- Este ejemplo es semejante al anterior, con la diferencia que funciona para cualquier
cuadro sin importar su tamao, basta con seleccionar una celda del cuadro y cuando
se ejecute la macro se seleccionar solo la 2da columna del cuadro. Observe que la
2da columna del cuadro no es la columna B, sino en este caso la columna C.
Nota.- En este ejemplo la referencia "A:C" es considerada como una referencia relativa, o sea
que no indica que se seleccionen las 3 primeras columnas A,B y C de la hoja de
calculo, sino que se seleccionen las 3 primeras columnas de la regin actual.
11) Seleccionar las columnas del rango abc y del rango xyz. (rangos separados)
Range("abc, xyz").Select
Selection.EntireColumn.Select
Range("C5:D7").ClearContents
Nota.- Si desea escribir en una celda utilizando Visual Basic, no es necesario seleccionar la
celda, slo necesita devolver el objeto Range y a continuacin asignarle el dato que
desee, como se muestra en los siguientes ejemplos:
3) Escribir el nmero 120 en todas las celdas del rango llamado Pagos. (El
rango llamado Pagos es B4:B9)
4) Escribir el contenido de la celda B4 multiplicado por 2, en la celda B9
5) Escribir la funcin SUMA del rango Pagos, en la celda B10, y luego poner
en negrita la celda B10.
6) Escribir la fecha actual en la celda C3
Range("Pagos") = 120
Range("B9") = Range("B4")*2
Range("B10").Formula = "=SUM(Pagos)"
Range("B10").Font.Bold = True
Range("C3") = Date
Nota.- Cuando se escriben formulas en las instrucciones de Visual Basic, estas formulas
debern estar encerradas entre comillas dobles, los argumentos de las funciones
siempre se escribirn separados con comas y adems los nombres de las funciones
Sub Macro1()
Range("A3").Select
ActiveCell.FormulaR1C1 = "CLIENTE"
Range("B4").Select
ActiveCell.FormulaR1C1 = "PAGOS"
Range("A3:B3").Select
Selection.Font.Bold = True
End Sub
Sub Macro2()
Range("A3") = "CLIENTE"
Range("B3") = "PAGOS"
Range("A3:B3").Font.Bold = True
End Sub
Caso2:
Caso3:
Ahora crear un procedimiento que borre el contenido del rango B3:B5 y luego
seleccione la celda B3.
1.- Ingrese a la ventana de Visual Basic y debajo del procedimiento anterior
escriba este otro procedimiento Sub:
Sub Borrar()
Range("b1:b3").ClearContents
Range("b1").Select
End Sub
2.- En la hoja de clculo dibuje otro botn para la macro Borrar como se
muestra en la siguiente figura:
Caso1:
Se desea crear un procedimiento en Visual Basic para controlar los ahorros en
una cuenta personal.
1.- En una hoja en blanco escriba lo siguiente:
Nota.- Este procedimiento tal y como esta diseado, una vez que ya se ha ingresado un
depsito y nos est solicitando ingresar ahora el retiro, no nos da opcin a enmendar
el anterior ingreso si es que hubo un error en l. Ms adelante en otro ejercicio
veremos como insertar instrucciones condicionales que permitan abortar una
transaccin o continuar ejecutndola.
MsgBox ("Su saldo Actual es de " & Range("Actual") & " soles")
End Sub
Aunque el lenguaje de Visual Basic para aplicaciones tiene una lista propia de
funciones disponibles, habrn casos en los cuales se va ha desear que las macros
utilicen las funciones de hoja de calculo de Excel, pero no para escribir estas
funciones en las celdas, sino para obtener un resultado con ellas y utilizar este
resultado dentro del programa en Visual Basic.
Se pueden usar la mayora de las funciones de hoja de clculo de Microsoft Excel en
las instrucciones de Visual Basic.
A Contar.Si Distr.Norm.Estand.In
v
Acos ContarA
Distr.Norm.Inv
Acosh Cosh
Distr.T
Asen Covar
Distr.T.Inv
Asenoh Crecimiento
Atan2 Cuartil E
Curtosis Elegir
Atanh
D EncontrarB
B
Error.Tipico.XY
BDContar DB
EsErr
BDContarA DDB
Decimal EsError
BDDesvEst
EsLogico
BDDesvEstP Despejar
EsNod
BDExtraer DesvEst
EsNoTexto
BDMax DesvEstP
EsNumero
BDMin Desvia2
Espacios
BDProducto DesvProm
EsTexto
BDPromedio Dias360
Estimacion.Lineal
BDSuma DiaSem
Estimacion.Logaritmi
BDVar Dist.Weibull
ca
BDVarP Distr.Beta
F
Binom.Crit Distr.Beta.Inv
Fact
Buscar Distr.Binom
Fisher
Buscar Distr.Chi
Fonetico
BuscarH Distr.Exp
Frecuencia
BuscarV Distr.F
G
C Distr.F.Inv
Gamma.Ln
Coef.De.Correl Distr.Gamma
Grados
Coeficiente.Asimetria Distr.Gamma.Inv
Distr.Hipergeom H
Coeficiente.R2
Distr.Log.Inv Hallar
Coincidir
Distr.Log.Norm HallarB
Combinat
Distr.Norm I
Contar
Distr.Norm.Estand ndice
Contar.Blanco
Elaborado por: Daniel Zegarra Zavaleta Pag. 50
Manual de Microsoft Excel Programacin VBA
Int.Pago.Dir PagoPrin
Interseccion.Eje Pearson
Intervalo.Confianza Pendiente
Jerarquia Percentil
K.Esimo.Mayor Permutaciones
K.Esimo.Menor Pi
L Poisson
Ln Potencia
Log Probabilidad
Log10 Producto
M Promedio
Max Pronostico
MDeterm Prueba.Chi
Media.Acotada Prueba.Chi.Inv
Media.Armo Prueba.F
Media.Geom Prueba.Fisher.Inv
Mediana Prueba.T
Min Prueba.Z
MInversa R
MMult Radianes
Moda Rango.Percentil
Moneda Redondea.Impar
Multiplo.Inferior Redondea.Par
Multiplo.Superior Redondear
N Redondear.Mas
NegBinomDist Redondear.Menos
NomPropio
Normalizacion
NPer
Numero.Romano
P
Pago
PagoInt
Elaborado por: Daniel Zegarra Zavaleta Pag. 51
Manual de Microsoft Excel Programacin VBA
Nota.- Algunas funciones de hoja de clculo no tienen utilidad en Visual Basic. Por ejemplo, la
funcin Concatenar no se necesita, ya que en Visual Basic puede usar el operador de
concatenacin & para unir varios valores de texto..
Sub UsarFuncion()
Dim CUADRO As Range
Set CUADRO = Range("A1:C10")
MINIMO = Application.WorksheetFunction.Min(CUADRO)
Range("A12") = MINIMO * 100
End Sub
Otra manera ms simple de obtener el mismo resultado que la macro anterior sera de
la siguiente forma:
Sub OtraFuncion()
Range("A12") = Application.WorksheetFunction.Min(Range("A1:C10"))*100
End Sub
Si usa una funcin de hoja de clculo que requiere como argumento una referencia de
rango, deber especificar un objeto Range. Por ejemplo, puede usar la funcin de hoja
de clculo BUSCARV para efectuar una bsqueda en un rango de celdas.
En una celda de hoja de clculo, podra insertar una frmula como
=BUSCARV(4,A1:B10,2,0). No obstante, en un procedimiento de Visual Basic, para
obtener el mismo resultado debe especificar un objeto Range para referirse al rango
A1:B10.
En el siguiente ejemplo, el procedimiento Sub BuscarDato asigna a la variable RPTA
el resultado de la funcin VLOOKUP (que es el nombre en ingls de la funcin
BUSCARV) y luego muestra en pantalla un mensaje con el valor de la variable RPTA.
Sub BuscarDato()
RPTA = Application.WorksheetFunction.VLOOKUP(4,Range("A1:B10"),2,0)
MsgBox RPTA
End Sub
Nota.- Las funciones de Visual Basic no usan el calificador WorksheetFunction. Una funcin de
Visual Basic puede tener el mismo nombre que una funcin de Microsoft Excel y, sin embargo,
dar otros resultados. Por ejemplo, Application.WorksheetFunction.Log, y la funcin
Log dan resultados diferentes.
SUMA es SUM
PROMEDIO es AVG
CONTAR es COUNT
d. La Funcin InputBox
Sintaxis
InputBox (Mensaje , titulo, defecto, xpos, ypos, ayuda, contexto)
Donde:
Mensaje Obligatorio. Texto que se muestra como mensaje en el cuadro de
dilogo. Si mensaje consta de ms de una lnea, puede separarlos
utilizando un carcter de retorno de carro Chr(13), un carcter de
avance de lnea Chr(10) o una combinacin de los caracteres de retorno
de carro-avance de lnea Chr(13) y Chr(10) entre cada lnea y la
siguiente.
titulo Opcional. Texto que se muestra en la barra de ttulo del cuadro de
dilogo. Si omite titulo, en la barra de ttulo se coloca el nombre de la
aplicacin Excel
defecto Opcional. Texto que se muestra en el cuadro de texto como respuesta
predeterminada cuando no se suministra una cadena. Si omite defecto,
se muestra el cuadro de texto vaco.
xpos Opcional. Numero que especifica, en pixels, la distancia en sentido
horizontal entre el borde izquierdo del cuadro de dilogo y el borde
izquierdo de la pantalla. Si se omite xpos, el cuadro de dilogo se centra
horizontalmente.
ypos Opcional. Expresin numrica que especifica, en pixels, la distancia en
sentido vertical entre el borde superior del cuadro de dilogo y el borde
superior de la pantalla. Si se omite ypos, el cuadro de dilogo se coloca
a aproximadamente un tercio de la altura de la pantalla.
ayuda Opcional. Texto que identifica el archivo de Ayuda que se utilizar para
proporcionar ayuda interactiva para el cuadro de dilogo. Si se
especifica ayuda, tambin deber especificarse contexto.
contexto Opcional. Expresin numrica que es el nmero de contexto de Ayuda
asignado por el autor al tema de Ayuda correspondiente. Si se
especifica contexto, tambin deber especificarse ayuda.
Nota.- Si desea especificar ms que el primer argumento con nombre, debe utilizar InputBox en una
expresin. Si desea omitir algunos argumentos de posicin, debe incluir los delimitadores de
coma correspondiente.
Inputbox("Ingrese nombre:", ,"Desconocido")
e. El Mtodo InputBox
Sintaxis:
expresin.InputBox (Mensaje, titulo, defecto, xpos, ypos, ayuda, contexto, tipo)
Donde:
expresin Expresin obligatoria que asigna un objeto Application.
Mensaje Dato obligatorio que se mostrar en el cuadro de dilogo. Puede ser
un texto, un nmero, una fecha o un valor Boolean (Excel convierte el
dato en texto antes de que muestre).
Title Opcional. Titulo del cuadro de entrada. Si este argumento se omite, el
ttulo predeterminado ser "Entrada".
Defecto Opcional. Especifica un valor que aparecer en el cuadro de texto
cuando se muestre inicialmente el cuadro de dilogo. Si este argumento
se omite, el cuadro de texto permanecer vaco. Este valor puede ser un
objeto Range.
xpos Opcional. Especifica la posicin X del cuadro de dilogo con respecto
a la esquina superior izquierda de la pantalla, en puntos.
ypos Opcional. Especifica la posicin Y del cuadro de dilogo con respecto
a la esquina superior izquierda de la pantalla, en puntos.
Ayuda Opcional. El nombre del archivo de Ayuda para este cuadro de
entrada.
Contexto Opcional. La identificacin de contexto del tema de Ayuda.
Tipo Opcional. Especifica el tipo de datos que se devuelve. Si este
argumento se omite, el cuadro de dilogo devolver texto. Puede ser
uno de los siguientes valores o bien una suma de ellos.
Valor Significado
0 Una frmula
1 Un nmero
2 Texto (una cadena)
4 Un valor lgico (True o False)
8 Una referencia a una celda, como un objeto Range.
16 Un valor de error, como por ejemplo #N/A
64 Una matriz de valores
Es posible usar una suma de valores permitidos para Tipo. Por ejemplo, para que un
cuadro de entrada acepte texto o nmeros, establezca Tipo como 1 + 2.
Use InputBox para mostrar un cuadro de dilogo sencillo que permite introducir
informacin para usarla en una macro. El cuadro de dilogo tiene un botn Aceptar y
un botn Cancelar. Si elige el botn Aceptar, InputBox devolver el valor introducido
en el cuadro de dilogo. Si elige el botn Cancelar, InputBox devolver False.
Si Type es 0, InputBox devolver la frmula en forma de texto, por ejemplo,
"=2*PI()/360". Si existen referencias en la frmula, se devolvern como referencias de
Conclusin:
El mtodo InputBox difiere de la funcin InputBox en que el primero permite la
validacin selectiva de las entradas del usuario y en que puede usarse con objetos,
valores de error y frmulas de Excel. Tenga en cuenta que Application.InputBox llama
al mtodo InputBox, y el dato que se escriba puede ser considerado de diferentes tipos
(texto, numero, formula, etc); en cambio InputBox sin calificador de objeto llama a la
funcin InputBox, y el dato escrito ser considerado siempre como del tipo texto.
Ejemplos
En este ejemplo se solicita un nmero al usuario.
EDAD = Application.InputBox("Escriba su edad:")
En este otro ejemplo se solicita al usuario que seleccione una celda de la Hoja1. Se usa
el argumento Type para asegurar que al hacer clic en una celda, se considere como que
se hubiese escrito la coordenada de esta celda con el teclado.
Worksheets("Hoja1").Activate
Set SUELDO = Application.InputBox("Seleccione su sueldo", Type:=8)
En este ejemplo se usa la funcin de hoja de clculo PAGO para calcular el pago
mensual de un prstamo hipotecario.
1ra Solucin:
1.- En la Hoja1 de un nuevo libro
escribir los siguientes datos que se
muestran en la imagen adjunta.
2.- Luego, en la celda B7 escribir la
funcin PAGO siguiente:
=PAGO(B3/1200,B4,-B5)
Nmero de pagos
2da Solucin:
Ahora, el mismo caso anterior se va ha resolver pero utilizando ntegramente un
procedimiento Sub. Es decir no se necesitarn en absoluto datos de ninguna celda.
1.- Ingresar al Editor de Visual Basic con Alt+F11 y luego inserte una hoja de mdulo
con el men Insertar/Modulo.
2.- En la hoja de mdulo escriba las siguientes instrucciones:
Sub PagoMensual()
Interes = Val(InputBox("Ingrese el Inters:"))
Periodos = Val(InputBox("Ingrese los Periodos:"))
Prestamo = Val(InputBox("Ingrese el Prstamo:"))
Pago = Application.WorksheetFunction.Pmt(Interes/1200, _
Periodos,-Prestamo)
MsgBox ("El Pago mensual es de: " & Format(Pago, "Currency"))
End Sub
Como la funcin Inputbox devuelve datos tipo texto al escribir el Inters, los
Perodos o el Prstamo, entonces, se le antepone la funcin Val para convertir esos
datos en nmeros, y as poder operarlos matemticamente con la funcin Pago (que
en ingles su equivalente es Pmt)
3.- Con Autoformas/Formas bsicas/Bisel dibuje un botn en la hoja de calculo y
asgnele la macro PagoMensual.
3ra Solucin:
Una tercera forma de ingresar los datos para el calculo del pago de la hipoteca es
haciendo uso del Mtodo Inputbox, en vez de la Funcin Inputbox.
1.- Ingresar al Editor de Visual Basic con Alt+F11 y en la hoja de mdulo escriba las
siguientes instrucciones:
Sub OtroPago()
Interes = Application.InputBox("Seleccione el Inters:")
Periodos = Application.InputBox("Seleccione los Periodos:")
Prestamo = Application.InputBox("Seleccione el Prstamo:")
Pago = Application.WorksheetFunction.Pmt(Interes / 1200, _
Periodos, -Prestamo)
MsgBox ("El Pago mensual es de: " & Format(Pago, "Currency"))
End Sub
En este caso el mtodo Inters = Application.Inputbox trata al dato que uno escribe,
directamente como del tipo numrico, ya no como texto. Por esta razn ya no es
necesario usar la funcin Val.
2.- Luego asigne esta macro al mismo botn de autoformas del caso anterior.
Cuando la macro se ejecute y aparezcan las ventanas para introducir datos, se podrn
escribir los datos o sino tambin se podr seleccionar con el mouse las celdas que
contienen los datos que se solicitan y hacer luego clic en el botn Aceptar:
Val Convierte los nmeros contenidos en una cadena como un valor numrico del tipo
adecuado.
Left Extrae un nmero especificado de caracteres del lado izquierdo de una cadena.
Right Extrae un nmero especificado de caracteres del lado derecho de una cadena.
Int, Fix Las funciones Int y Fix eliminan la fraccin de un nmero y devuelven el valor
entero resultante. La diferencia entre Int y Fix es que si el nmero es negativo, Int
devuelve el primer entero negativo menor o igual a nmero, mientras que Fix
devuelve el primer entero negativo mayor o igual a nmero.
Len Da como resultado la cantidad de caracteres que tiene una cadena de texto.
Hour Obtiene un nmero entero entre 0 y 23, inclusive, que representa la hora del
argumento de la funcin.
Now Obtiene un nmero que especifica la fecha y hora actuales de acuerdo con la
configuracin de la fecha y la hora del sistema de su equipo.
Day Obtiene un nmero entero entre 1 y 31, inclusive, que representa el da del mes.
Minute Obtiene un nmero entero entre 0 y 59, inclusive, que representa el minuto de la
hora actual del sistema.
Second Obtiene nmero entero entre 0 y 59, inclusive, que representa los segundos de la
hora actual del sistema.
Por ejemplo:
Pago = 3562.4
Z = Format(Pago, "Currency")
Y = Format(Pago, "#,##0.00")
For Each...Next: Repite un grupo de instrucciones para cada uno de los objetos
de una coleccin.
Donde:
condicin Requerido. Uno o ms de los siguientes dos tipos de
expresiones:
Una expresin numrica o expresin de cadena que puede ser
evaluada como Verdadera o Falsa. Si condicin es Null,
condicin se considera Falsa.
instrucciones Opcional en formato de bloque; se requiere en formato de lnea
sencilla que no tenga una clusula Else. Una o ms instrucciones
Puede utilizar la forma de una sola lnea (Sintaxis 1) para pruebas cortas y sencillas.
Sin embargo, el formato de bloque (Sintaxis 2) proporciona ms estructura y
flexibilidad que la forma de lnea simple y, generalmente, es ms fcil de leer, de
mantener y de depurar.
Nota.- Con la sintaxis1 es posible ejecutar mltiples instrucciones como resultado de una decisin
If...Then, pero todas deben estar en la misma lnea y separadas por dos puntos, como en la
instruccin siguiente:
If N > 1 Then A = N * 2 : B = B + N : C = C - N
Una instruccin con formato de bloque If debe ser la primera de la lnea. Las partes
Else, ElseIf y End If, de la instruccin, solamente pueden ir precedidas de un nmero
de lnea o una etiqueta de lnea. El bloque If debe terminar con una instruccin End If.
Para determinar si una instruccin If es un bloque, examine lo que sigue a la palabra
clave Then. Si lo que aparece detrs de Then en la misma lnea no es un comentario, la
instruccin se considera como una instruccin If de una sola lnea.
Las clusulas Else y ElseIf son opcionales. Puede tener en un bloque ElseIf, tantas
clusulas If como desee, pero ninguna puede aparecer despus de una clusula Else.
Las instrucciones de bloque If se pueden anidar; es decir, unas pueden contener a otras.
Cuando se ejecuta un bloque If (Sintaxis 2), se prueba condicin. Si condicin es
Verdadera, se ejecutan las instrucciones que estn a continuacin de Then. Si
condicin es False, se evalan una a una las condiciones ElseIf (si existen). Cuando se
encuentra una condicin Verdadera se ejecutan las instrucciones que siguen
inmediatamente a la instruccin Then asociada. Si ninguna de las condiciones ElseIf es
Verdadera (o si no hay clusulas ElseIf), se ejecutan las instrucciones que siguen a
Else. Despus de la ejecucin de las instrucciones que siguen a Then o Else, la
ejecucin contina con la instruccin que sigue a End If.
Sub Cumpleaos()
MiCumple = #23/8/2009#
If MiCumple > Now Then msgbox "An falta para mi cumpleaos"
End Sub
trabajador. La instruccin que sigue a la instruccin Else slo se ejecuta cuando las
condiciones de todas las restantes instrucciones If y ElseIf son Falsas.
Sub Remuneracion()
Sueldo = Range("C4")
If Sueldo < 1500 Then
Aumento = Sueldo * 0.20
ElseIf Sueldo < 2000 Then
Aumento = Sueldo * 0.15
ElseIf Sueldo < 3000 Then
Aumento = Sueldo * 0.10
Else
Aumento = Sueldo * 0.05
End If
Range("C5") = Aumento
End Sub
Ejecuta una serie de instrucciones mientras una condicin dada sea True.
Sintaxis
While condicin
intrucciones
Wend
Donde:
condicin Requerido. Expresin numrica o expresin de cadena cuyo
valor es Verdadero o Falso. Si condicin es Null, condicin se
considera Falso.
instrucciones Opcional. Una o ms instrucciones que se ejecutan mientras la
condicin es Verdadera.
La siguiente macro busca a partir de la celda B3 hacia abajo una celda que se
encuentre vaca.
Sub BuscaBlanco()
Range("B3").select
While ActiveCell <> Empty
ActiveCell.Offset(1,0).Activate
Wend
End Sub
Donde:
Una vez que se inicia el bucle y se han ejecutado todas las instrucciones en el bucle,
incremento se suma a contador. En este punto, las instrucciones del bucle se pueden
ejecutar de nuevo (si se cumple la misma prueba que caus que el bucle se ejecutara
inicialmente) o bien se sale del bucle y la ejecucin contina con la instruccin que
sigue a la instruccin Next.
Sugerencia Cambiar el valor de contador mientras est dentro de un bucle hace difcil
su lectura y depuracin.
Se pueden colocar en el bucle cualquier nmero de instrucciones Exit For como una
manera alternativa de salir del mismo. La instruccin Exit For, que se utiliza a menudo
en la evaluacin de alguna condicin (por ejemplo, If...Then), transfiere el control a la
instruccin que sigue inmediatamente a la instruccin Next.
Se pueden anidar bucles For...Next, colocando un bucle For...Next dentro de otro. Para
ello, proporcione a cada bucle un nombre de variable nico para su contador. La
siguiente construccin es correcta:
For Pais = 1 To 5
For Ciudad = 1 To 3
For Distrito = 1 To 10
...
...
Next Distrito
Next Ciudad
Next Pais
Nota-- Si omite mencionar un contador en una instruccin Next, la ejecucin contina como si este se
hubiera incluido. En cambio si se produce un error si se encuentra una instruccin Next antes
de su instruccin For correspondiente.
incrementa en 2 cada vez que se repite la ejecucin del bucle. Cuando el bucle deja de
ejecutarse, Total representa la suma de 2, 4, 6, 8 y 10.
Sub TotalPares()
For Num = 2 To 10 Step 2
Total = Total + Num
Next Num
MsgBox "El total es " & Total
End Sub
Para disminuir la variable contador utilice un valor negativo en Step. Para disminuir la
variable contador es preciso especificar un valor final que sea menor que el valor
inicial. En el siguiente ejemplo OtroTotal, la variable contador Cant se disminuye en 2
cada vez que se repite el bucle. Cuando termina la ejecucin del bucle, Total
representa la suma de 16, 14, 12, 10, 8, 6, 4 y 2.
Sub OtroTotal()
For Cant = 16 To 2 Step -2
Total = Total + Cant
Next Cant
MsgBox "El total es " & total
End Sub
Ejecuta uno de varios grupos de instrucciones, dependiendo del valor de una expresin.
Sintaxis
Select Case expresin_prueba
Case lista_expresion-n
instrucciones-n...
Case Else
instrucciones_else
End Select
Donde:
expresin_prueba Requerido. Es cualquier expresin numrica o expresin de
cadena.
lista_expresin-n Requerido si aparece la palabra clave Case. Lista delimitada por
comas de una o ms de las formas siguientes:
expresin,
expresin To expresin,
Is operador_de_comparacin expresin.
La palabra clave especifica un intervalo de valores. Si se utiliza
la palabra clave To, el valor menor debe aparecer antes de To.
Utilice la palabra clave Is con operadores de comparacin para
especificar un intervalo de valores. Si no se escribe, la palabra
clave Is se insertar automticamente.
instrucciones-n Opcional. Una o ms instrucciones ejecutadas si
expresin_prueba coincide con cualquier parte de
lista_expresin-n.
instrucciones_else Opcional. Una o ms instrucciones que se ejecuten si
expresin_prueba no coincide con ninguna de las clusulas
Case.
Las instrucciones Select Case se pueden anidar. Cada instruccin Select Case debe
tener su correspondiente instruccin End Select.
Sub Pago()
Sueldo = Range("C4")
Select Case Sueldo
Case Is <1500
Aumento = Sueldo * 0.20
Case Is <2000
Aumento = Sueldo * 0.15
Case Is <3000
Aumento = Sueldo * 0.10
Case 3000 To 4000
Aumento = Sueldo * 0.05
Case Else
Aumento = 0
End Select
Range("C5") = Aumento
End Sub
Repite un bloque de instrucciones cuando una condicin es Verdadera o hasta que una
condicin se convierta en Falsa.
Sintaxis
Donde:
condicin Opcional. Expresin numrica o expresin de cadena que es
Verdadera o Falsa. Si la condicin es Null, la condicin se
considera Falsa.
Instrucciones Una o ms instrucciones que se repiten mientras (While) o hasta
que (Until) la condicin sea Verdadera.
Sub WhileInicial()
Contador = 0
Nota = Range("D4")
Do While Nota < 10
Nota = Nota + 1
Contador = contador + 1
Loop
MsgBox "El bucle se ha repetido " & Contador & " veces."
End Sub
Sub WhileFinal()
Contador = 0
Nota = Range("D4")
Do
Nota = Nota + 1
Contador = contador + 1
Loop While Nota < 10
MsgBox "El bucle se ha repetido " & Contador & " veces."
End Sub
Sub UntilFinal()
Contador = 0
Nota = Range("D4")
Do
Nota = Nota + 1
Contador = Contador + 1
Loop Until Nota = 10
MsgBox "El bucle se ha repetido " & Contador & " veces."
End Sub
Nota.- Para detener manualmente la ejecucin de un bucle sin fin que se repite sin control, presione
la tecla Esc o la combinacin de teclas Ctrl+Pausa.
Donde:
elemento Requerido. Variable que se utiliza para iterar por los elementos
del conjunto o matriz. Para conjuntos, elemento solamente
puede ser una variable del tipo Variant, una variable de objeto
genrica o cualquier variable de objeto especfica.
grupo Requerido. Nombre de un conjunto de objetos o de una matriz .
instrucciones Opcional. Una o ms instrucciones que se ejecutan para cada
elemento de un grupo.
La entrada al bloque For Each se produce si hay al menos un elemento en grupo. Una
vez que se ha entrado en el bucle, todas las instrucciones en el bucle se ejecutan para el
primer elemento en grupo. Despus, mientras haya ms elementos en grupo, las
instrucciones en el bucle continan ejecutndose para cada elemento. Cuando no hay
ms elementos en el grupo, se sale del bucle y la ejecucin contina con la instruccin
que sigue a la instruccin Next.
Se pueden colocar en el bucle cualquier nmero de instrucciones Exit For. La
instruccin Exit For se utiliza a menudo en la evaluacin de alguna condicin (por
ejemplo, If...Then) y transfiere el control a la instruccin que sigue inmediatamente a
la instruccin Next.
Puede anidar bucles For Each...Next, colocando un bucle For Each...Next dentro de
otro. Sin embargo, cada elemento del bucle debe ser nico.
Nota.- Si se omite el nombre del elemento en una instruccin Next, la ejecucin contina como si se
hubiera incluido. En cambio si se encuentra una instruccin Next antes de su instruccin For
correspondiente, se producir un error.
El siguiente ejemplo vuelve negrita todas aquellas celdas dentro del rango C4:C20 que
sean mayores que 10.
Sub Negrita()
For Each Casilla In Range("C4:C20")
If Casilla > 10 Then Casilla.Font.Bold = True
Next
End Sub
El cdigo siguiente recorre todas las celdas de un rango, asignado a la variable Cuadro
con la instruccin Set, e introduce el valor de la variable P en aquellas celdas cuyos
contenidos son menores o iguales a 10.
Sub Escribe()
P = Range("B1")
Set Cuadro = Range("C4:C20")
For Each Cel In Cuadro
If Cel <= 10 Then Cel.Value = P
Next
End Sub
El siguiente ejemplo recorre las celdas del rango B3:B15 y convierte cualquier valor
absoluto menor de 0.01 en 0 (cero).
Sub ValeCero()
Set Lecturas = Range("B3:B15")
For Each Dato in Lecturas
If Abs(Dato.Value) < 0.01 Then Dato.Value = 0
Next
End Sub
Sub CierraFormularios()
For Each Ficha In Application.Forms
If Ficha.Caption <> Screen.ActiveForm.Caption Then Ficha.Close
Next
End Sub
Este otro ejemplo agrega tantas hojas nuevas al libro activo como textos hay en el
rango B1:B5, y a continuacin nombra a estas hojas con los textos que va encontrando.
Sub CreaHojas()
For Each Nombre In Range("B1:B5")
If Nombre <> Empty Then
Set NewSheet = Worksheets.Add
NewSheet.Name = Nombre
End If
Next
End Sub
Este ltimo ejemplo muestra el nombre de cada una de las hojas de clculo del libro
activo.
Sub VerHojas()
For Each Hoja In Worksheets
MsgBox Hoja.Name
Next
End Sub
Sub EncuentraTexto()
For Each Celda In Range("C3:C30")
If Not IsNumeric(Celda) Then
Celda.Select
MsgBox "El objeto contiene un valor no numrico."
Exit For
End If
Next
End Sub
haciendo referencia al objeto una vez, en lugar de hacerlo con cada asignacin de
propiedad.
Nota Una vez que se ha entrado en un bloque With no es posible cambiar el objeto. Por tanto, no
puede utilizar una nica instruccin With para varios objetos.
Nota En general, no es aconsejable que salte hacia dentro o hacia fuera de bloques With. Si se
ejecutan instrucciones en bloques With, sin que se ejecuten las instrucciones With o End
With conserva en memoria una variable temporal que contiene una referencia al objeto
hasta que se salga del procedimiento.
Sub RaizCuadrada()
With Workbooks("Pagos.xls").Worksheets("Clientes").Range("C4")
.Formula = "=SQRT(200)"
With .Font
.Name = "Arial"
.Bold = True
.Size = 8
End With
.ColumnWidth = 20
End With
End Sub
El cuadro de herramientas contiene una serie de controles de, cada uno de los cuales
cumplen una funcin especial una vez que se insertan dentro del formulario.
En este ejemplo se usar un formulario para ingresar datos de varios alumnos en una
lista de Excel.
Unload Me
End Sub
ActiveCell.Select
While ActiveCell <> Empty
If ActiveCell = Codigo Then
Rpta = MsgBox("Alumno ya existe desea reemplazarlo?", _
vbYesNo)
If Rpta = vbYes Then GoTo Sigue
Exit Sub
End If
ActiveCell.Offset(1, 0).Select
Wend
Sigue:
If Masculino Then Sexo = "M"
If Femenino Then Sexo = "F"
ActiveCell = Codigo
ActiveCell.Offset(0, 1) = Nombre
ActiveCell.Offset(0, 2) = Apellido
ActiveCell.Offset(0, 3) = Val(Edad)
ActiveCell.Offset(0, 4) = Sexo
ActiveCell.Offset(0, 5) = Telefono
MsgBox ("Alumno registrado con exito")
Range("Codigo").Select
While ActiveCell <> Empty
ActiveCell.Offset(1, 0).Select
Wend
ActiveCell.Offset(-1, 0).Select
Codigo = "A" & Right("00" & Val(Right(ActiveCell, 3)) + 1, 3)
Nombre = ""
Apellido = ""
Edad = ""
Telefono = ""
Masculino = False
Femenino = False
Nombre.SetFocus
End Sub
Para el Formulario:
Private Sub UserForm_Initialize()
Range("Codigo").Select
While ActiveCell <> Empty
ActiveCell.Offset(1, 0).Select
Wend
ActiveCell.Offset(-1, 0).Select
Codigo = "A" & Right("00" & Val(Right(ActiveCell, 3)) + 1, 3)
Nombre.SetFocus
Foto.Visible = False
End Sub
11. Luego regrese a la hoja de Excel y asigne la macro FichaAlumno al botn Abrir
Ficha.
12. Finalmente guarde el archivo como un libro habilitado para macros y pngale el
nombre Registro de alumnos.
13. En la misma carpeta donde guarde el anterior archivo de Excel, deber guardar
tambin los archivos con formato jpg que contengan las fotos de los alumnos, los
cuales debern tener nombres como: A001.jpg, A002.jpg, etc.
Tambin es posible operar al mismo tiempo sobre toda una coleccin de objetos siempre
que los objetos compartan mtodos comunes. Por ejemplo, el siguiente procedimiento
cierra todos los formularios abiertos.
Sub CierraTodosLosFormularios()
Forms.Close
End Sub
Mtodo es toda accin que puede realizar un objeto. Por ejemplo, Add es un mtodo del
objeto ComboBox ya que sirve para aadir un nuevo elemento a un cuadro combinado.
El siguiente procedimiento utiliza el mtodo Add para aadir dos elementos a un
ComboBox.
Sub AadeElementos()
Combo1.AddItem "Masculino"
Combo1.AddItem "Femenino"
End Sub
Propiedad es uno de los atributos de un objeto, que define una de las caractersticas del
objeto, tal como su tamao, color o localizacin en la pantalla, o un aspecto de su
comportamiento, por ejemplo si est visible o activado. Para cambiar las caractersticas de
un objeto, se cambia el valor de sus propiedades.
Para dar valor a una propiedad, hay que colocar un punto despus de la referencia a un
objeto, despus el nombre de la propiedad y finalmente el signo igual (=) y el nuevo valor
de la propiedad. Por ejemplo, el siguiente procedimiento cambia el ttulo de un formulario
de Visual Basic dando un valor a la propiedad Caption.
Sub CambiaTitulo()
miFormulario.Caption = "Datos del Cliente"
End Sub
Hay propiedades a las que no se puede dar valor. El tema de ayuda de cada propiedad
indica si es posible leer y dar valores a la propiedad (lectura/escritura), leer slo el valor de
la propiedad (slo lectura) o slo dar valor a la propiedad (slo escritura).
Evento es toda accin que puede ser reconocida por un objeto, como puede ser el clic del
mouse o la pulsacin de una tecla y para la que es posible escribir cdigo como respuesta.
Los eventos pueden ocurrir como resultado de una accin del usuario o del cdigo del
programa, tambin pueden ser originados por el sistema.
El siguiente procedimiento escrito en el cdigo de la Hoja1, establece el zoom al 75% y
selecciona la celda A1. Esto ocurrir cuando se produzca el evento de activar la Hoja1.
Private Sub Worksheet_Activate()
ActiveWindow.Zoom = 75
Range("A1").select
End Sub
objeto.Activate
En la sintaxis de la funcin MsgBox, las palabras en cursiva y negrita son argumentos con
nombre de la funcin. Los argumentos que aparecen entre corchetes son opcionales. (No
escriba los corchetes en el cdigo de Visual Basic). En el caso de la funcin MsgBox, el
nico argumento que se debe incluir es el texto de la pregunta.
Los argumentos para funciones y mtodos se pueden especificar en el cdigo mediante su
posicin o por su nombre. Para especificar argumentos mediante su posicin, siga el orden
que se indica en la sintaxis, separando los argumentos con una coma, por ejemplo:
MsgBox "Su respuesta es correcta!",0,"Cuadro de Respuesta"
Para especificar un argumento mediante su nombre basta con usar el nombre del
argumento seguido de dos puntos y un signo igual (:=) y el valor del argumento. Los
argumentos con nombre se pueden especificar en cualquier orden, por ejemplo:
MsgBox Title:="Cuadro de Respuesta", Prompt:="Su respuesta es correcta!"
La sintaxis de las funciones y algunos mtodos muestran los argumentos entre parntesis.
Estas funciones y mtodos devuelven valores, por eso deben encerrarse los argumentos
entre parntesis al asignar un valor a una variable. Si se ignora el valor de retorno o si no
se pasan argumentos en forma alguna, no deben incluirse los parntesis. Los mtodos que
no devuelven valores no necesitan que sus argumentos aparezcan encerrados entre
parntesis. Estas normas son aplicables tanto si se usan argumentos posicionales o
nominativos.
En el siguiente ejemplo, el valor que devuelve la funcin MsgBox es un nmero que
indica el botn seleccionado almacenado en la variable miVar. Dado que se utiliza el valor
que devuelve la funcin, es preciso utilizar parntesis. Otro cuadro de mensaje presenta
entonces en pantalla el valor de la variable.
Sub Pregunta()
miVar = MsgBox(Prompt:="Me gusta mi trabajo.", _
Title:="Cuadro de respuesta", Buttons:="4")
MsgBox miVar
End Sub
En la sintaxis de la instruccin Option Compare, las llaves y la lnea vertical indican una
eleccin obligatoria entre tres opciones. (No escriba las llaves en la instruccin de Visual
Basic).
Por ejemplo, en Visual Basic al comparar dos textos se tienen en cuenta las maysculas y
minsculas, pero si se escribe la siguiente instruccin en el rea de declaraciones dentro
del mdulo (antes de todas las subrutinas) entonces las cadenas de texto que se comparen
no importan ya si se escriben en maysculas o minsculas.
Option Compare Text
En la sintaxis de la instruccin Dim, la palabra Dim es una palabra clave exigida. El nico
elemento necesario es nombrevariable (el nombre de la variable). Por ejemplo, la siguiente
instruccin crea tres variables: miVar, siguienteVar y terceraVar. Estas variables se
declaran automticamente como Variant.
Dim miVar, siguienteVar, terceraVar
El siguiente ejemplo declara una variable como String. Al incluir un tipo de datos se
ahorra memoria y se pueden evitar errores en el cdigo.
Dim miRespuesta As String
Para declarar varias variables en una instruccin, debe incluirse el tipo de datos para cada
variable. Las variables declaradas sin un tipo de datos se declaran automticamente como
Variant.
Dim x As Integer, y As Integer, z As Integer
En la siguiente instruccin, a x e y se les asigna el tipo de datos Variant. Slo a z se le
asigna el tipo de datos Integer.
Dim x, y, z As Integer
Si se declara una variable matriz, deben incluirse los parntesis. Los subscriptos son
opcionales. La siguiente instruccin define las dimensiones de una matriz dinmica,
miMatriz.
Dim miMatriz()
informacin sobre tipos de datos puede consultar la seccin "Tipo de datos Summary" en
la Ayuda de Visual Basic.
Se pueden declarar varias variables en una instruccin. Para especificar el tipo de datos se
debe incluir un tipo de datos para cada variable. En la siguiente instruccin se declaran las
variables intX, intY, e intZ como del tipo Integer.
Dim intX As Integer, intY As Integer, intZ As Integer
En la siguiente instruccin, intX e intY se declaran como del tipo Variant; y slo intZ se
declara como del tipo Integer.
Dim intX, intY, intZ As Integer
No es necesario especificar el tipo de datos en la instruccin de declaracin. Si se omite, la
variable ser del tipo Variant.
Tamao de
Tipo de datos almacenamiento Intervalo
Variant 22 bytes + longitud de la El mismo intervalo que para un tipo String de longitud
(con caracteres) cadena variable
Definido por el usuario Nmero requerido por los El intervalo de cada elemento es el mismo que el intervalo de
(utilizando Type) elementos su tipo de datos.
Nota: Las matrices de cualquier tipo de datos requieren 20 bytes de memoria, ms cuatro
bytes para cada dimensin de matriz, ms el nmero de bytes que ocupan los propios
datos. Puede calcular la memoria que ocupan los datos multiplicando el nmero de
elementos de datos por el tamao de cada elemento. Por ejemplo, los datos de una matriz
unidimensional que consten de cuatro elementos de datos tipo Integer de dos bytes cada
uno, ocupan ocho bytes. Los ocho bytes que requieren los datos ms los 24 bytes
necesarios para la matriz suman un requisito total de memoria de 32 bytes para dicha
matriz.
Un tipo Variant que contiene una matiz requiere 12 bytes ms que la matriz por s sola.
Sub FueraAlcance()
MsgBox strMensaje
End Sub
pblicas estn disponibles para todos los procedimientos de todos los mdulos de un
proyecto; las variables privadas slo estn disponibles para los procedimientos de ese
mdulo. Las variables declaradas con la instruccin Dim en la seccin Declarations tiene
un alcance privado a no ser que se especifique otra cosa. Sin embargo, es aconsejable
colocar la palabra clave Private delante del nombre de la variable para que el alcance sea
evidente al leer el cdigo.
En el siguiente ejemplo, la variable de cadena strMensaje est disponible para cualquier
procedimiento definido en el mdulo. Cuando se llama al segundo procedimiento, presenta
el contenido de la variable de cadena strMensaje en un cuadro de dialogo.
' Aada lo siguiente a la seccin de Declarations del mdulo.
Private strMensaje As String
Sub InicializaVariablePrivada()
strMensaje = "Esta variable no se puede usar fuera de este mdulo."
End Sub
Sub UsaVariablePrivada()
MsgBox strMensaje
End Sub
Nota Los procedimientos pblicos de un mdulo estndar o mdulo de clase estn
disponibles para cualquier proyecto de referencia al proyecto actual. Para limitar el
alcance de todos los procedimientos de un mdulo al proyecto actual, aada una
instruccin Option Private Module a la seccin Declarations del mdulo. Las variables y
procedimientos pblicos seguirn estando disponibles para los restantes procedimientos
del proyecto actual, pero no lo estarn para los proyectos que a los que puedan hacer
referencia.
Este ejercicio muestra tres mtodos distintos, cada uno de ellos ms eficiente y ms rpido
que el otro, para buscar y copiar un dato que se intenta localizar dentro de una lista:
2do Metodo:
Utiliza la opcin Buscar de la ficha Inicio/Buscar y reemplazar/Buscar.
Este mtodo es mas rpido que el anterior.
Sub Busca2()
T = Timer
Range("Valor").ClearContents
Dato = Range("Dato")
Cells.Find(What:=Dato, After:=ActiveCell, LookIn:=xlValues, _
LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False).Activate
Range("Valor") = ActiveCell.Offset(0, 1)
Range("Valor").Select
Range("Tiempo") = Timer - T
End Sub
3er Metodo:
Utiliza la sentencia Find del mismo Visual Basic..
Este mtodo es mucho ms rpido que los anteriores porque ya no utiliza herramientas de
la hoja de calculo de Excel, sino la sentencia Find que es nativa de Visual Basic.
Sub Busca3()
T = Timer
Range("Valor").ClearContents
Dato = Range("Dato")
Set c = Range("Lista").Find(Dato, LookIn:=xlValues)
If Not c Is Nothing Then Celda = c.Address
Range("Valor") = Range(Celda).Offset(0, 1)
Range("Valor").Select
Range("Tiempo") = Timer T
End Sub
Sub AbrirArchivo()
'elije un archivo para abrirlo
ChDrive Left(ActiveWorkbook.Path, 1)
ChDir ActiveWorkbook.Path
Archivo = Application.GetOpenFilename("Archivos del Excel" & _
"(*.xls*),*.xls*", , "Elija el Archivo que desea Abrir")
On Error GoTo Sale
Workbooks.Open Archivo
Archivo = ActiveWorkbook.Name
Rpta = MsgBox("El archivo: " & Archivo & " ha sido cargado" & _
"vbNewLine & "Desea cerrarlo?", vbYesNo)
If Rpta = vbNo Then Exit Sub
Application.DisplayAlerts = False
ActiveWorkbook.Close
Sale:
End Sub
Sub AbrirLibro2()
Ruta = ActiveWorkbook.Path
Archivo = InputBox("Nombre del archivo a abrir (Ej: Lista.xls
Lista.xlsx)")
If Archivo = "" Then Exit Sub
For Each Libro In Application.Workbooks
If UCase(Libro.Name) = UCase(Archivo) Then
Windows(Archivo).Activate
Exit Sub
End If
Next
On Error GoTo NoHay
Workbooks.Open Ruta & "\" & Archivo
Exit Sub
NoHay:
MsgBox ("El archivo " & Archivo & " no existe en la carpeta actual")
End Sub
Luego con esta nueva herramienta, dibuje el calendario dentro del formulario, y al hacer
doble clic sobre l, agrguele el siguiente cdigo:
Private Sub Calendar1_Click()
ActiveCell = Calendar1.Value
Unload Me
End Sub
ProgressBar:
Cuando se realicen procesos que demandan mucho tiempo para Excel, quizs se desee
mostrar una barra de avance de este proceso a fin de que el usuario sepa lo que est
ocurriendo.
Por ejemplo si se desea crear este cuadro:
(Name) Barra1
BorderStyle 1-ccFixedSingle
Scrolling 1-ccScrollingSmooth
(Name) Barra2
BorderStyle 1-ccFixedSingle
Scrolling 1-ccScrollingStandard
Sub Avance()
Dim i As Double, j As Double
ActiveSheet.Barra1.Visible = True
ActiveSheet.Barra2.Visible = True
Range("A3:C13").ClearContents
Range("A3").Select
For i = 1 To 100
For j = 1 To 200000
Sqr (j)
Next
ActiveCell.Cells(i / 10 + 1, 1) = i
ActiveCell.Cells(i / 10 + 1, 2) = i * i
ActiveCell.Cells(i / 10 + 1, 3) = Sqr(i)
ActiveSheet.Barra1.Value = i
ActiveSheet.Barra2.Value = i
Next
MsgBox ("Terminado")
ActiveSheet.Barra1.Value = 0
ActiveSheet.Barra2.Value = 0
End Sub
(Name) Barra1
BorderStyle 1-ccFixedSingle
Scrolling 1-ccScrollingSmooth
(Name) Barra1
BorderStyle 1-ccFixedSingle
Scrolling 1-ccScrollingSmooth
Barra2.Value = i
Next
Mensaje = "Proceso terminado"
Barra.Value = 0
Barra2.Value = 0
End Sub
Sub Ventana()
UserForm1.Show
End Sub
Prctica De Laboratorio N1
Objetivos:
Entender la diferencia al grabar macros con referencias absolutas y macros con referencias
relativas.
Uso de la grabadora de macros utilizando referencias absolutas y relativas.
Asignacin de macros a botones
Un Empresa de taxis se comunica por radio con sus unidades a fin de establecer la tarifa que
deben cobrar los choferes a sus clientes, teniendo como datos los lugares de origen y destino
de cada carrera.
Para lograr esto, en la central de taxis se cuenta con una hoja de clculo en Excel que contiene
las tarifas a cobrar entre cada punto origen y destino de los distritos de Lima:
El chofer llama a la central informando los sitios origen y destino de la carrera
La central de taxis calcula el monto a cobrar en la carrera y si el cliente la acepta la
central registrar la carrera en el cuadro de viajes
Elegir la Ficha Formulas/Crear desde la seleccin, verificar que solo est marcada la
casilla Fila superior, y luego Aceptar
5. En la celda H5 escribir la siguiente frmula matricial:
{=SUMA(SI((Chofer=G5)*(Dia>=H$2)*(Dia<H$2+1),Precio))}
Luego copiar esta frmula en el rango H5:H9, y finalmente en H10 escribir la
formula: =SUMA(H5:H9).
Presionar Ctrl+*
Ficha Formulas/Crear desde la seleccin, marcar solo Fila superior, y Aceptar
Seleccionar la celda B6, y luego presionar Ctrl+
Finalmente presionar la tecla una vez
Para Ver y Modificar la macro Registrar en la ventana del Editor de Visual Basic:
Selection.End(xlDown).Select
ActiveCell.Offset(1, 0).Range("A1").Select
End Sub
13. El usar la grabadora de macros crea en ocasiones algunas lineas de codigo innecesarias.
Lineas que aparecen en negrita en la subrutina anterior. Si se desea estas lineas se pueden
borrar o modificar para hacer mas eficiente la ejecucion de la macro, adems agregar la
sentencia Application.DisplayAlerts=False, luego de lo cual la subrutina quedara como
se muestra a continuacin:
Sub Registrar()
ActiveCell.Offset(0, 1).Select
ActiveCell.FormulaR1C1 = "=INDIRECT(RC[-2]) INDIRECT(RC[-1])"
Selection.Style = "Currency"
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
ActiveCell.Offset(0, -4).Select
ActiveCell = "=NOW()"
Selection.Copy
Selection.PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
ActiveCell.Offset(0, 1).Range("A1:C1").Select
Selection.AutoFill Destination:=ActiveCell.Range("A1:C2"), Type:= _
xlFillDefault
ActiveCell.Offset(1, 0).Range("A1:C1").ClearContents
Application.CutCopyMode = False
Selection.CurrentRegion.Select
Application.DisplayAlerts = False
Selection.CreateNames Top:=True, Left:=False
Range("B4").Select
Selection.End(xlDown).Offset(1, 0).Select
End Sub
Sub Nuevo()
Range("B4").Select
While ActiveCell <> Empty
ActiveCell.Offset(1, 0).Select
Wend
End Sub
15. Finalmente dibuje los botones Nuevo y Registrar, y asigneles a cada uno las macros
correspondientes.
16. Si en la celda H2 se escribe la fecha, entonces la Hoja1 se deber ver asi:
17. Para ingresar una nueva carrera de taxi, solo habr que elegir en la celda B6 el nombre del
chofer, en C6 el lugar origen, en D6 el lugar destino, y luego bastar con hacer clic en el
boton Registrar para que se complete el registro de un nuevo viaje.
19. Finalmente guarde este archivo como un Libro habilitado para macros y pngale el
nombre Taxi. El archivo se guardar con el nombre Taxi.xlsm
Prctica De Laboratorio N2
Objetivos:
Se desea ingresar datos en tres diferentes listas ubicadas en hojas distintas de un libro, a
partir de datos escritos en la primera hoja de clculo. Para los cual se van a crear dos
macros:
Una macro que crea cdigos correlativos para cada una de las listas.
Una segunda macro que registra los datos en la lista respectiva.
7. Ingresar a Visual Basic y en una hoja de mdulo escriba el siguiente cdigo para las
macros:
Sub CreaCodigo()
If Range("B3") = "" Then Exit Sub
Cuadro = Range("B3")
Sheets(Cuadro).Select
Range("A3").Select
Selection.Sort Key1:=Range("A3"), Order1:=xlAscending, Header:= _
xlGuess, OrderCustom:=1, MatchCase:=False, _
Orientation:=xlTopToBottom, DataOption1:=xlSortNormal
Selection.End(xlDown).Select
Cod = Left(ActiveCell, 1) & Right("000" & _
Val(Right(ActiveCell, 4)) + 1, 4)
Sheets("Datos").Select
Range("B4") = Cod
End Sub
Sub Registrar()
Cuadro = Range("B3")
Codigo = Range("B4")
Descripcion = Range("B5")
Unidad = Range("B6")
Costo = Range("B7")
Sheets(Cuadro).Select
Range("A3").Select
While ActiveCell <> Empty
ActiveCell.Offset(1, 0).Select
Wend
ActiveCell = Codigo
ActiveCell.Offset(0, 1) = Descripcion
ActiveCell.Offset(0, 2) = Unidad
ActiveCell.Offset(0, 3) = Costo
Sheets("Datos").Select
MsgBox ("Los datos han sido registrados exitosamente")
Range("B3:B7").ClearContents
End Sub
Prctica De Laboratorio N3
Objetivos:
Utilizar las distintas sentencias de control para la solucin de mltiples tareas en el manejo
de datos. Las sentencias de control a utilizarse son las siguientes:
If..then..else,
Select Case
Whilewend,
Fornext,
For eachnext.
2. En Visual Basic insertar una hoja de mdulo y escribir las siguientes subrutinas:
Sub PrimeraEdad1()
Range("A3").Select
ActiveCell.CurrentRegion.Columns(4).Select
ActiveCell.Offset(1, 0).Select
End Sub
Sub PrimeraEdad2()
Range("A3").Select
ActiveCell.CurrentRegion.Select
ActiveCell.Select
While ActiveCell <> "Edad"
ActiveCell.Offset(0, 1).Select
Wend
ActiveCell.Offset(1, 0).Select
End Sub
Sub Nuevo()
Range("A3").End(xlDown).Offset(1, 0).Select
End Sub
Sub Nuevo2()
Range("A3").Select
ActiveCell.CurrentRegion.Select
ActiveCell.Offset(Selection.Rows.Count,0).Select
End Sub
Sub Nuevo3()
Range("A3").Select
While ActiveCell <> Empty
ActiveCell.Offset(1, 0).Select
Wend
End Sub
Sub ContarInscritos()
Range("A4").Select
N = 0
While ActiveCell <> Empty
N = N + 1
ActiveCell.Offset(1, 0).Select
Wend
MsgBox ("Hay " & N & " alumnos inscritos")
End Sub
Sub ContarPorSexo1()
Range("A4").Select
H = 0
M = 0
While ActiveCell <> Empty
If ActiveCell.Offset(0, 2) = "M" Then H = H + 1
If ActiveCell.Offset(0, 2) = "F" Then M = M + 1
ActiveCell.Offset(1, 0).Select
Wend
MsgBox ("Hay " & M & " Mujeres y " & H & " Hombres inscritos")
End Sub
Sub ContarPorSexo2()
Range("A3").Select
ActiveCell.CurrentRegion.Columns(3).Select
H = Application.WorksheetFunction.CountIf(Selection, "M")
M = Application.WorksheetFunction.CountIf(Selection, "F")
Range("A3").Select
MsgBox ("Hay " & M & " Mujeres y " & H & " Hombres inscritos")
End Sub
Sub TipoPersona()
Edad = Val(InputBox("Ingrese su edad"))
If Edad = Empty Then Exit Sub
If Edad < 18 Then MsgBox ("Ud. es menor de Edad")
If Edad >= 18 Then MsgBox ("Ud. es mayor de edad")
End Sub
Sub Inscripcion()
Nombre = InputBox("Ingrese el Nombre de la persona:")
Range("A3").End(xlDown).Offset(1, 0).Select
ActiveCell = Nombre
End Sub
Sub Entrega1()
Range("A3").Select
Nombre = InputBox("Ingrese el Nombre de la persona:")
If Nombre = Empty Then Exit Sub
While ActiveCell <> Empty
ActiveCell.Offset(1, 0).Select
If UCase(ActiveCell) = UCase(Nombre) Then
If ActiveCell.Offset(0, 1) = "Entregado" Then
MsgBox ("A " & Nombre & " ya se le ha entregado su Carnet")
Exit Sub
End If
ActiveCell.Offset(0, 1) = "Entregado"
Exit Sub
End If
Wend
MsgBox (Nombre & " no existe en esta lista")
End Sub
Sub Entrega2()
Range("A3").Select
Nombre = InputBox("Ingrese el Nombre de la persona:")
If Nombre = "" Then Exit Sub
While ActiveCell <> Nombre
ActiveCell.Offset(1, 0).Select
If ActiveCell = Empty Then
MsgBox (Nombre & " no existe en esta lista")
Exit Sub
End If
Wend
ActiveCell.Offset(0, 1) = "Entregado"
End Sub
Sub Persona()
Range("A4").Select
While ActiveCell <> Empty
Edad = ActiveCell.Offset(0, 3)
Sub CalculaDeuda()
Range("A3").CurrentRegion.Select
Alumnos = Selection.Rows.Count - 1
Range("G4").Select
For N = 1 To Alumnos
ActiveCell = 200 - ActiveCell.Offset(0, -1)
ActiveCell.Offset(1, 0).Select
Next
End Sub
Sub ContarPorSexo3()
Range("A3").CurrentRegion.Select
Alumnos = Selection.Rows.Count - 1
Range("C4").Select
H = 0
M = 0
For N = 1 To Alumnos
If ActiveCell = "M" Then H = H + 1
If ActiveCell = "F" Then M = M + 1
ActiveCell.Offset(1, 0).Select
Next
MsgBox ("Hay " & M & " Mujeres y " & H & " Hombres inscritos")
End Sub
Sub ContarPorSexo4()
Range("A3").CurrentRegion.Columns("C").Select
H = 0
M = 0
For Each Celda In Selection
If Celda = "M" Then H = H + 1
If Celda = "F" Then M = M + 1
Next
MsgBox ("Hay " & M & " Mujeres y " & H & " Hombres inscritos")
End Sub
Sub BorraCeros()
Range("A3").CurrentRegion.Columns("F:G").Select
N = 0
For Each Celda In Selection
If Celda = 0 Then Celda.ClearContents: N = N + 1
Next
MsgBox "habian " & N & " ceros"
End Sub
Sub OcultarHojas()
N = 1
For Each H In Worksheets
If ActiveSheet.Name <> H.Name Then H.Visible = False
N = N + 1
Next
End Sub
Sub MostrarHojas()
N = 1
For Each H In Worksheets
If ActiveSheet.Name <> H.Name Then H.Visible = True
N = N + 1
Next
End Sub
Sub SeparaAlumnos()
Application.DisplayAlerts = False
For Each H In Worksheets
If H.Name = "Hombres" Then Sheets("Hombres").Delete
Next
For Each H In Worksheets
If H.Name = "Mujeres" Then Sheets("Mujeres").Delete
Next
Range("A3").Select
Selection.AutoFilter Field:=3, Criteria1:="M"
Selection.CurrentRegion.Select
Selection.Copy
Sheets.Add
ActiveSheet.Name = "Hombres"
Range("A3").Select
ActiveSheet.Paste
Application.CutCopyMode = False
ActiveCell.Select
Sheets("Hoja1").Select
Range("A3").Select
Selection.AutoFilter Field:=3, Criteria1:="F"
Selection.CurrentRegion.Select
Selection.Copy
Sheets.Add
ActiveSheet.Name = "Mujeres"
Range("A3").Select
ActiveSheet.Paste
Application.CutCopyMode = False
ActiveCell.Select
Sheets("Hoja1").Select
Range("A3").Select
Selection.AutoFilter
End Sub
Prctica De Laboratorio N4
Objetivos:
Se desea ingresar datos de diferentes clientes en una lista, utilizando tres mtodos
diferentes:.
Copiando datos del cliente desde un rango de celdas.
Ingresar datos del cliente utilizando ventanas de Inputbox.
Ingresar datos del cliente a travs de formularios
Sub IngresoDatos1()
Rpta = MsgBox("Seguro desea registrar estos datos?", vbYesNo)
If Rpta = vbNo Then Exit Sub
DNI = Range("B6")
Cliente = Range("B7")
Telefono = Range("B8")
Range("A11").Select
While ActiveCell <> Empty
If ActiveCell = DNI Then
Rpta = MsgBox("Cliente ya existe, desea reemplazarlo?", vbYesNo)
If Rpta = vbYes Then GoTo Sigue
Exit Sub
End If
ActiveCell.Offset(1, 0).Select
Wend
Sigue:
ActiveCell = DNI
ActiveCell.NumberFormat = "00000000"
ActiveCell.Offset(0, 1) = Cliente
ActiveCell.Offset(0, 2) = Telefono
ActiveCell.Offset(0, 2).NumberFormat = "#-####"
Range("B6:B8").ClearContents
Range("B6").Select
End Sub
Sub IngresoDatos2()
DNI = Val(InputBox("Ingrese DNI"))
Cliente = InputBox("Ingrese nombre del cliente")
Telefono = Val(InputBox("Ingrese numero de telefono"))
Range("A11").Select
While ActiveCell <> Empty
If ActiveCell = DNI Then
Rpta = MsgBox("Cliente ya existe, desea reemplazarlo?", vbYesNo)
If Rpta = vbYes Then GoTo Sigue
Exit Sub
End If
ActiveCell.Offset(1, 0).Select
Wend
Sigue:
ActiveCell = DNI
ActiveCell.NumberFormat = "00000000"
ActiveCell.Offset(0, 1) = Cliente
ActiveCell.Offset(0, 2) = Telefono
ActiveCell.Offset(0, 2).NumberFormat = "#-####"
End Sub
Sub IngresoDatos3()
Ficha1.Show
End Sub
End If
ActiveCell.Offset(1, 0).Select
Wend
Sigue:
ActiveCell = Val(DNI)
ActiveCell.NumberFormat = "00000000"
ActiveCell.Offset(0, 1) = Cliente
ActiveCell.Offset(0, 2) = Val(Telefono)
ActiveCell.Offset(0, 2).NumberFormat = "#-####"
DNI = ""
Cliente = ""
Telefono = ""
DNI.SetFocus
End Sub
11. Seguidamente regrese al formulario y haga doble clic en el botn de comando Cancelar, y
all escriba el siguiente cdigo:
12. Regrese a la ventana de Excel, y asigne a cada uno de los botones las macros:
IngresoDatos1,IngresoDatos2, e IngresoDatos3 respectivamente.
13. Finalmente guarde el libro con el nombre Ingreso de Clientes en un archivo habilitado
para macros.
Prctica De Laboratorio N5
Objetivos:
Se van a confeccionar un cuadro que permita controlar las horas de ingreso y salida del
personal de vigilancia de la empresa, para luego al final de la semana calcular el monto del
pago por este servicio.
Uso de elementos de formulario.
Manejo de Fechas y Horas y sus respectivos formatos
Empleo de las funciones Now y CountA en Visual Basic
Proteccin de la hoja de calculo con contraseas
Como crear macros que asignan otras macros.
Un Empresa contrata los servicios de un vigilante particular el cual debe cumplir con un
horario normal de 8:00 de maana hasta las 4:00 de la tarde, y por lo cual se le pagar un
jornal diario de 90 soles.
Adicionalmente se han acordado estas otras condiciones que debern cumplirse por ambas
partes:
Si trabaja 5 das a la semana sin faltar, hay una bonificacin de 1 jornal adicional.
Por cada minuto de tardanza habr un descuento de 1 sol.
Por tiempo extra de trabajo previamente autorizado, se pagar el doble que las horas
normales.
20. En una hoja de clculo de Excel, a la cual se le pondr el nombre Vigilancia, escriba el
siguiente Cuadro de Pagos por Servicio de Vigilancia, tal y como se muestra a
continuacin en la figura.
21. Combinar y centrar los siguientes rangos de celdas:
D2:C2 Tamao de letra 12 puntos
E2:G2, E3:F3, E10:H10, E12:F12 y G12:H12
22. Dar los siguientes colores de relleno a las celdas:
B2:C2 Negro E2:H2 Negro
B3:D3 Azul oscuro E3:F3 Rojo
G3:H3 Oro F4:F8 Rojo
H4:H8 Oro E10:H10 Azul oscuro
D12 Rojo E12:F12 Oro
G12H12 Turquesa claro
23. Seleccionar el rango C3:D8 y llamando al men Formato/Celdas elegir la ficha Numero,
categora Personalizada y elegir el tipo de formato: hh:mm AM/PM, luego en la celda
C3 escribir 8:00, y en D3 escribir 16:00.
25. A la Hoja1 del libro darle el nombre Semana haciendo doble clic en etiqueta de hoja, y a la
Hoja2 darle el nombre Horas.
26. En la hoja Horas escribir en A1 el ttulo THORAS y en las celdas A3 y A4 las horas 7:30
y 7:31, luego darle a ambas el formato personalizado
hh:mm AM/PM.
27. Seleccionar las celdas A3:A4 y arrastrar el cuadro de
relleno hacia abajo hasta llegar a la celda A873 en la
cual deber aparecer las 10:00 pm.
28. Seleccionar el rango A3:A873 y darle el nombre de
rango THORAS.
29. En las celdas C3 y C4 de la hoja Horas escribir las
fechas 15/1/04 y 12/1/04 que corresponden a los dos
primeros dias Lunes del ao 2004. Luego
seleccionando ambas celdas, arrastrar el cuadro de
relleno hacia abajo hasta la celda C158 que
correspondera al 25/12/06.
30. Seleccionar el rango C3:C158 y darle el nombre de
rango SEMANAS.
31. En las celdas E3:F14 escribir los nmeros y nombres
de los doce meses del ao como se muestra en la figura, y luego seleccionando el rango
E3:F14 darle el nombre de rango MESES.
C12: =CONTAR(C4:C8)
D12: =E9*24*60
E12: =G9*24*B12/4
F12: =B10+B12*C12-D12+E12
E4: =SI(ESTEXTO(C4),"",SI(Y(C4>C$3,C4<>""),C4-C$3,""))
Copie luego la anterior formula con el cuadro de relleno de E4 hasta E8.
G4: =SI(ESTEXTO(D4),"",SI(D4>D$3,D4-D$3,""))
Copie igualmente la anterior formula de G4 hasta G8.
En la celda E9: =SUMAR.SI(F4:F8,VERDADERO,E4:E8)
G9: =SUMAR.SI(H4:H8,VERDADERO,G4:G8)
36. Abra las herramientas de formulario con el men Ver/Barra de herramientas/
Formularios, y con el botn Casilla de verificacin dibuje una casilla y borre
totalmente el texto que lo acompaa.
37. En la casilla que acaba de crear haga un clic derecho y elija la opcin Formato de control,
luego en la casilla Vincular con la celda escriba F4, marque la casilla Sombreado 3D, y
luego Aceptar.
38. Luego copie esta casilla 4 veces ms otras celdas de la columna F y con la opcin Formato
de control cambie las celdas de vinculacin para que sean F5, F6, F7 y F8
respectivamente. Luego repita el mismo procedimiento para las celdas G4:G8.
39. Cierre el grupo de herramientas de Formulario y luego marque con un check las casillas
reverificacin de las celdas F4, F5, F6, F7, F8, G7 y G8. tal y como se muestra en la figura
ms adelante.
A continuacin vamos a dar formato condicional a las celdas que tienen las horas para que
cambien de color automticamente de la siguiente forma:
las horas de llegada si son ms de las 8:00 am deberan cambiar a color rojo el fondo y
letras blancas.
Si hay descuentos, siempre y cuando este marcado un check en la columna G, entonces
la celda tambin se pintar de fondo rojo y letras blancas.
Las horas extras previamente autorizadas con un check en la columna H se pintarn de
fondo color Oro.
40. Seleccionar el rango C4:C8 y llamando al men Formato/Formato condicional elija lo
siguiente:
En el botn de Formato elija.- Fuente: Color Blanco y en Negrita; Bordes: Contorno;
Tramas: Color Rojo.
42. Seleccionar ahora el rango F4:F8 y dele este otro formato condicional:
En el botn de Formato elija.- Fuente: Color Blanco y en Negrita; Bordes: Contorno;
Tramas: Color Rojo.
46. Con el botn que se encuentra en las herramientas de Formulario, dibujar los siguientes
botones: Ingreso, Falta, Salida y Borrar Todo, como los que se muestran a
continuacin:
47. Adems hacia el dalo superior derecho del cuadro dibujar con Autoformas/Formas
bsicas/Seal de prohibido, el crculo con diagonal que se muestra en la figura anterior y
luego pntela con la herramienta de color de relleno, de color Rojo. Adems haga un clic
derecho en este botn y elija Formato de autoforma, luego en la ficha Proteger
desactive la casilla Bloqueada.
48. Luego ingrese al Editor de Visual Basic con Alt+F11 y escriba en la hoja de Mdulo las
siguientes macros:
Sub Ingreso()
N = Application.WorksheetFunction.CountA(Range("Ingreso"))
If N = 5 Then End
Range("Horas").Select
ActiveCell.Select
While ActiveCell <> Empty
ActiveCell.Offset(1, 0).Activate
Wend
On Error GoTo Sale
ActiveCell = Now: Selection.NumberFormat = "h:mm AM/PM"
Range("A1").Select
Sale:
End Sub
Sub Salida()
N = Application.WorksheetFunction.CountA(Range("Salida"))
If N = 5 Then End
Range("Horas").Select
ActiveCell.Select
ActiveCell.Offset(0, 1).Activate
While ActiveCell <> Empty
ActiveCell.Offset(1, 0).Activate
Wend
If ActiveCell.Offset(0, -1) = Empty Then End
ActiveCell = Time: Selection.NumberFormat = "h:mm AM/PM"
Range("A1").Select
End Sub
Sub Falta()
N = Application.WorksheetFunction.CountA(Range("Ingreso"))
If N = 5 Then End
Range("Horas").Select
ActiveCell.Select
While ActiveCell <> Empty
ActiveCell.Offset(1, 0).Activate
Wend
On Error GoTo Sale
ActiveCell = "Falt"
ActiveCell.Offset(0, 1) = "Falt"
Range("A1").Select
Sale:
End Sub
Sub BorraTodo()
Rpta = MsgBox("Seguro desea Borrar todo?", _
vbYesNo + vbCritical + vbDefaultButton2)
If Rpta = vbNo Then End
On Error GoTo Sale
Range("Horas").ClearContents
Range("ChDctos") = True
Range("ChExtras").ClearContents
Sale:
End Sub
Sub QuitarSeguro()
ActiveSheet.Unprotect
ActiveSheet.Shapes("LLAVE").Select
Selection.OnAction = "PoneSeguro"
Range("a1").Select
MsgBox "Proteccin ha sido retirada"
End Sub
Sub PonerSeguro()
ActiveSheet.Protect Password:="MACRO", DrawingObjects:=True, _
Contents:=True
ActiveSheet.Shapes("LLAVE").Select
Selection.OnAction = "QuitaSeguro"
Range("a1").Select
ActiveWorkbook.Save
MsgBox "La Hoja se encuentra protegida"
End Sub
49. Regrese a la Hoja Semana de Excel y a cada uno de los botones Ingreso, Falta, Salida y
Borrar todo, asgnele su respectiva macro.
50. A la autoforma seal de prohibido (circulo con diagonal rojo) asgnele la macro
PonerSeguro.
51. Ejecute la macro BorrarTodo haciendo un clic en el botn correspondiente.
52. Vuelva a guardar el archivo Vigilancia con Ctrl.+G.
Ahora estamos listos para empezar a registrar las horas de ingreso y salida del vigilante. Sin
embrago, con la finalidad de que nadie mas que usted sea el que se encargue de llevar el
control, el cuadro deber estar protegido constantemente para que nadie pueda modificar su
contenido.
Veamos, si realmente fuera la hora de ingreso en este instante habria que hacer un clic en el
botn Ingreso y se escribira automaticamente la hora en la celda correspondiente del dia
Lunes. Sino, haga un clic en la lista desplegable y elija como hora de ingreso las 7:48 am.
Luego, para proteger el cuadro bastar con hacer un clic en el botn de Seal de Prohibido y
listo. La hoja quedar protegida y adems el archivo Vigilancia se habr grabado tambin
automticamente en disco. En pantalla aparecer un mensaje indicando que la hoja ha
quedado protegida.
Cuando se desee quitar la proteccin, vuelva a presionar el botn de Seal de Prohibido y
cuando le solicite la contrasea escriba la palabra MACRO, que coincide con la palabra que se
escribi tambien en la macro QuitarSeguro de Visual Basic. Esta palabra clave usted la
puede cambiar cuando quiera alli en visual basic, y con ella se podr quitar la proteccin a la
hoja.
Una vez retirada la proteccin, en la pantalla aparecer un mensaje indicando que la hoja se
encuentra sin proteccin y entonces podr usted seguir ingresando las dems horas, tanto de
salida como de ingreso a medida que pasen los dias. Una vez ingresada una fecha recuerde
que debe volver a conectar la proteccin con un clic en el botn correspondiente.
Si las formulas en la hoja han sido escritas correctamente, los clculos debern realizarse
automticamente.
Las celdas que definen las condiciones de pago y que usted puede cambiar son las siguientes:
La celda B2: Nombre del Vigilante
La celda C3: hora de ingreso oficial (actualmente 8:00 am)
La celda D3: hora de salida oficial (actualmente 4:00 pm)
La celda B12: Jornal diario (actualmente 90 soles)
Tamao de
Tipo de datos Intervalo
almacenamiento
Byte 1 byte 0 a 255
Boolean 2 bytes True o False
Integer 2 bytes -32,768 a 32,767
Long
4 bytes -2,147,483,648 a 2,147,483,647
(entero largo)
Single -3.402823E38 a 1.401298E-45 para valores
(coma flotante/ 4 bytes negativos; 1,401298E-45 a 3,402823E38 para
precisin simple) valores positivos
-1.79769313486231E308 a
Double
-4,94065645841247E-324 para valores negativos;
(coma flotante/ 8 bytes
4,94065645841247E-324 a
precisin doble)
1,79769313486232E308 para valores positivos
Currency -922,337,203,685,477.5808 a
8 bytes
(entero a escala) 922,337,203.685,477.5807
+/-79,228,162,514,264,337,593,543,950,335 sin
punto decimal;
+/-7.9228162514264337593543950335 con 28
Decimal 14 bytes
posiciones a la derecha del signo decimal; el
nmero ms pequeo distinto de cero es
+/-0.0000000000000000000000000001
Date 8 bytes 1 de enero de 100 a 31 de diciembre de 9999
Object 4 bytes Cualquier referencia a tipo Object
String 10 bytes + longitud de la
Desde 0 a 2.000 millones
(longitud variable) cadena
String
Longitud de la cadena Desde 1 a 65,400 aproximadamente
(longitud fija)
Variant Cualquier valor numrico hasta el intervalo de un
16 bytes
(con nmeros) tipo Double
Variant 22 bytes + longitud de la El mismo intervalo que para un tipo String de
(con caracteres) cadena longitud variable
Definido por el
Nmero requerido por El intervalo de cada elemento es el mismo que el
usuario
los elementos intervalo de su tipo de datos.
(utilizando Type)
Nota Las matrices de cualquier tipo de datos requieren 20 bytes de memoria ms cuatro bytes para
cada dimensin de matriz, ms el nmero de bytes que ocupan los propios datos. Puede
calcular la memoria que ocupan los datos multiplicando el nmero de elementos de datos por
el tamao de cada elemento. Por ejemplo, los datos de una matriz unidimensional que
consten de cuatro elementos de datos tipo Integer de dos bytes cada uno, ocupan ocho bytes.
Los ocho bytes que requieren los datos ms los 24 bytes necesarios para la matriz suman un
requisito total de memoria de 32 bytes para dicha matriz.
Un tipo Variant que contiene una matiz requiere 12 bytes ms que la matriz por s sola.
Nota Use la funncin StrConv para converter un dato sting a otro tipo de dato
Sintaxis
CBool(expresin) CByte(expresin)
CCur(expresin) CDate(expresin)
CDbl(expresin) CDec(expresin)
CInt(expresin) CLng(expresin)
CSng(expresin) CStr(expresin)
CVar(expresin)
Tipos devueltos
Comentarios
Si la expresin del argumento expresin que se pasa a la funcin est fuera del intervalo del tipo de
dato al que se va a convertir, se producir un error.
En general, el cdigo se puede documentar utilizando las funciones de conversin de tipos de datos
para indicar que el resultado de alguna de las operaciones se debera expresar como un tipo de datos
en particular, no como el tipo de datos predeterminado. Por ejemplo, utilice Ccur para forzar la
ejecucin de operaciones con aritmtica monetaria en los casos en los que se hara con precisin
simple, doble precisin o aritmtica entera.
Debe utilizar funciones de conversin de tipos en lugar de Val para proporcionar conversiones que
reconozcan las variantes internacionales. Por ejemplo, cuando utiliza CCur, se reconocen diferentes
separadores decimales, diferentes separadores de millares y varias opciones monetarias
dependiendo de la configuracin regional establecida en su equipo.
Cuando la parte fraccionaria es exactamente 0,5, CInt y CLng siempre redondean al nmero par ms
cercano. Por ejemplo, 0,5 redondea a 0, y 1,5 redondea a 2. CInt y CLng se diferencian de las
funciones Fix y Int en que truncan la parte fraccionaria de un nmero, en lugar de redondear.
Adems, Fix y Int siempre devuelven un valor del mismo tipo del que se le pasa.
Utilice la funcin IsDate para determinar si se puede convertir date a una fecha o una hora. CDate
reconoce literales de fecha y literales de hora adems de nmeros comprendidos dentro del intervalo
de fechas aceptables. Al convertir un nmero a una fecha, la parte numrica entera se convierte a una
fecha. Cualquier parte fraccionaria del nmero se convierte a la hora del da, comenzando a
medianoche.
Se proporciona una funcin CVDate por compatibilidad con versiones anteriores de Visual Basic. La
sintaxis de la funcin CVDate es idntica a la de la funcin CDate; sin embargo, CVDate devuelve un
Variant de subtipo Date en lugar del tipo Date real. Puesto que ahora hay un tipo de dato intrnseco
Date, no es necesario CVDate. Se puede observar el mismo efecto al convertir una expresin a Date
y asignarla despus a un Variant. Esta tcnica es coherente con la conversin de todos los dems
tipos intrnsecos a sus equivalentes subtipos Variant.
Nota La funcin CDec no devuelve un tipo de dato discreto; en su lugar, siempre devuelve un
Variant con los valores convertidos a un subtipo Decimal.