Documente Academic
Documente Profesional
Documente Cultură
5. Sentencias de Control
a. If...thenelse
b. Select Case
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 vertica tu como vaslmente al centro, el contenido
de una celda:
1.- Para esto primero escribir en una celda un dato.
2.- 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.
3.- Al aparecer el mensaje Grabando
en la barra de estado, realizar la accin de
centrado, esto es: llamar al men
Formato/Celdas y en la ficha Alineacin
elegir en la opcin Alineacin del texto
Vertical, la alternativa Centrar, luego elegir
el botn Aceptar.
d. Cmo es el programa
creado por la grabadora de macros
Para la macro del ejemplo anterior, el programa o subrutina en el lenguaje de Visual
Basic que se habra generado automticamente, sera el siguiente:
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.
Por ejemplo, si en vez de ordenar "apaga la cocina", se le dijese al nio "paga la
cocina". El no va a poder obedecernos porque no conoce como se realiza esa accin ya
que aun no maneja dinero y no sabe cmo se paga un artefacto. Esto es un error de
sintaxis, la palabra est mal escrita.
Pero adems las instrucciones deben seguir una cierta lgica adecuada porque si no
tambin se estara incurriendo en un error de lgica al escribir el programa.
Por ejemplo, un error de lgica podra ser que se le diga al nio: " por favor apaga la
cocina y luego srveme un caf". La orden aparentemente parece correcta. Pero el
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 apstrofe despus de esta, seguido por el
comentario. Los comentarios aparecen en pantalla en color verde, color predefinido.
Dim SUELDO
Dim EDAD As Variant
EMPRESA = "Editora Macro"
Nota: Si se especifica un tipo de datos para una variable o argumento y a continuacin se utiliza un
tipo errneo de datos, se producir un error de tipo de datos. Para evitar errores de tipo de
datos, se deben usar slo variables (del tipo de datos Variant) o declarar explcitamente todas
las variables y especificar para ellas un tipo de datos. El ltimo mtodo es el preferible.
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
2005.
Sub DarFormato()
Dim Celda As Range
Set Celda = Worksheets("Hoja3").Range("A1")
With Celda.Font
.Bold = True
.Italic = True
End With
Celda= 2005
End Sub
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.
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
Donde: referencia puede ser un rango de celdas o un nombre de rango,
escritos entre comillas
Sintaxis: [referencia].Select
Donde: referencia puede ser un rango de celdas o un nombre de rango,
escritos entre comillas
Selecciona el rango B5:C7
[B5:C7].Select
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
Selecciona todas las celdas ocupadas o vacas hacia abajo, a partir de la celda
actual
Range(ActiveCell, ActiveCell.End(xlDown)).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
Selecciona en la regin actual las celdas hacia abajo a partir de la celda actual
inicio = ActiveCell.Row
fin = ActiveCell.CurrentRegion.Rows.Count + _
ActiveCell.CurrentRegion.Row - 1
Range(ActiveCell.EntireColumn.Cells(inicio, 1), _
ActiveCell.EntireColumn.Cells(fin, 1)).Select
Selecciona en la regin actual las celdas hacia abajo a partir de la celda actual
Range(ActiveCell.EntireColumn.Cells(ActiveCell.Row, 1), _
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:
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
9) Seleccionar el rango A3:C7 y luego "mover la seleccin" 2 filas hacia abajo y una
columna hacia la derecha
Range("A3:C7").Select
Selection.Offset(2,1).Select
11) Seleccionar el rango A3:C7 y luego "mover el puntero de celda" 2 filas hacia
abajo y una columna hacia la derecha dentro del rango seleccionado
Range("A3:C7").Select
ActiveCell.Offset(2,1).Select
13) Seleccionar la regin actual y luego seleccionar la ltima celda ocupada al final de
la primera columna de la regin actual
ActiveCell.CurrentRegion.Select
ActiveCell.Offset(Selection.Rows.Count - 1, 0).Select
14) Suponiendo una tabla con una fila de encabezado, a continuacin se muestran 2
formas para seleccionar la tabla sin seleccionar la fila de encabezados. Debe haber
una celda activada en algn lugar de la tabla antes de ejecutar el ejemplo.
ActiveCell.CurrentRegion.Select
ActiveCell.Offset(1, 0).Resize(Selection.Rows.Count - 1, _
Selection.Columns.Count).Select
ActiveCell.CurrentRegion.Rows(2).Select
Range(Selection, ActiveCell.Offset(ActiveCell.CurrentRegion. _
Rows.Count - 2, 0)).Select
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:
1) Definir con el nombre abc al rango seleccionado. (Se supone que previamente se
ha seleccionado un rango como B3:E7)
ActiveWorkbook.Names.Add Name:="abc", RefersTo:=Selection
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.
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.
8) Seleccionar las 3 columnas a partir de la celda activa. Suponer que la celda activa
es la B5.
ActiveCell.Columns("A:C").EntireColumn.Select
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.
9) Seleccionar la 3ra columna a partir de la celda activa. Suponer que la celda activa
es la celda B5.
ActiveCell.Columns(3).EntireColumn.Select
11) Seleccionar las columnas del rango abc y del rango xyz. (rangos separados)
Range("abc, xyz").Select
Selection.EntireColumn.Select
12) Seleccionar dentro de la regin actual la columna de la celda activa. Suponer que
la celda activa es la C4.
ActiveCell.CurrentRegion.Columns(ActiveCell.Column ActiveCell _
.CurrentRegion.Column + 1).Select
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:
1.- Abra un nuevo libro en blanco, y ubique el puntero en cualquier celda de la Hoja1.
Ejemplos de procedimientos Sub para asignar valores:
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.- Si al escribir alguna formula en Visual Basic no se conoce su equivalente en ingls, lo que hay
que hacer es regresar a la ventana de Excel y encender la grabadora de macros, luego escribir
la frmula en espaol en cualquier celda, apagar la grabadora y observar en la hoja de
modulo como ha escrito el editor de Visual Basic su equivalente en la versin en ingls.
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()
2.- Ingrese a la ventana de Visual Basic y debajo del procedimiento anterior escriba
este otro procedimiento Sub:
Sub Soles()
Monto = range("B5")
tcambio = range("B4")
Range("B3") = Monto * tcambio
End Sub
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:
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:
Luego de haber ingresado el depsito o el retiro, y haber calculado el saldo final, las
instrucciones adicionales en este procedimiento hacen lo siguiente:
- Primero selecciona la celda A9
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.
Binom.Crit DB Distr.Norm
DDB Distr.Norm.Estand
Buscar
Decimal
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.
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
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
estilo A1. (Utilice ConvertFormula para realizar conversiones entre estilos de
referencia).
Si Type es 8, InputBox devolver un objeto Range. Debe usar el enunciado Set para
asignar el resultado a un objeto Range, como se muestra en el ejemplo siguiente:
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
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.
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
separadas por dos puntos ejecutados si la condicin es
Verdadera.
condicin-n Opcional. Igual que condicin.
instrucciones_elseif Opcional. Una o ms instrucciones ejecutadas si la condicin-n
asociada es Verdadera.
instrucciones_else Opcional. Una o ms instrucciones ejecutadas si ninguna de las
expresiones anteriores condicin o condicin-n es Verdadera.
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.
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
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
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
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.
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.
Las instrucciones Select Case se pueden anidar. Cada instruccin Select Case debe
tener su correspondiente instruccin End Select.
Repite un bloque de instrucciones cuando una condicin es Verdadera o hasta que una
condicin se convierta en Falsa.
Sintaxis
Do While | Until condicin
instrucciones
Exit Do
instrucciones
Loop
O bien, puede utilizar esta sintaxis:
Do
instrucciones
Exit Do
instrucciones
Loop While | Until condicin
Donde:
Sub WhileFinal()
Contador = 0
Nota = Range("D4")
Do
Nota = Nota + 1
Contador = contador + 1
Loop While Nota < 10
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
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
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
En este ejemplo se usar un formulario para ingresar datos de varios alumnos en una
lista de Excel.
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.
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
Para Ver y Modificar la macro Registrar en la ventana del Editor de Visual Basic:
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 gaurdar con el nombre Taxi.xlsm
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
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 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 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
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
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
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
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
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.
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.
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.
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.
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
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
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
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.
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.
CDate reconoce formatos de fecha que se ajusten a la configuracin regional de su sistema. Es posible
que no se determine el orden correcto del da, mes y ao si se proporciona en un formato diferente del
que reconoce la configuracin de fecha. Adems, no se puede reconocer un formato de fecha largo si
contiene la cadena del da de la semana.
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.
10. EstructurasdeControlenlasinstruccionesmacro.................................................. 56
f. Quesonlassentenciasdecontrol ..................................................................................... 56
g. QuehacenlasInstruccionesCondicionales........................................................................ 56
h. QuehacenlasInstruccionesdeBucle ................................................................................ 56
i. QuehacenlasInstruccionesdeejecucinmltiple ............................................................ 56
11. LaInstruccinIf...Then...Else .................................................................................. 57
a. ComousarlasinstruccionesIf...Then...Else ....................................................................... 58
b. EjecutarunasolainstruccincuandolacondicinesVerdadera........................................ 58
c. EjecutarunasinstruccionessilacondicinesVerdaderayejecutarotrassiesFalsa.......... 59
d. ComprobarunasegundacondicinsilaprimeracondicinesFalsa................................... 59
12. LaInstruccinWhile...Wend................................................................................... 60
13. LaInstruccinFor...Next......................................................................................... 60
a. ComousarlasinstruccionesFor...Next .............................................................................. 62
14. LaInstruccinSelectCase....................................................................................... 63
a. ComousarlainstruccionSelectCase ................................................................................. 64