Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Manual Excel VBA 1 PDF
Manual Excel VBA 1 PDF
5. Sentencias de Control
a. If...then…else
b. Select Case
c. Do While/Until
d. For Next
e. For Each Next
f. With End With
iii. Arreglos
b. Sentencias de asignación
i. De datos
ii. De objetos (Set)
c. Tipos de objetos
i. Aplicaciones, libros, hojas, rangos, celdas, gráficos, formas, etc.
ii. Colecciones de objetos
2. Control del flujo de un programa
a. Sentencias de bifurcación
b. Sentencias de repetición o bucle
c. Sentencia de ejecución múltiple con un objeto
d. Las Sentencias: Goto, Call, Exit
3. Manejo de Rangos
a. Mover y copiar rangos
b. Nombrar rangos
c. Obteniendo la intersección 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 múltiples
c. Formulario para ingreso de fechas con calendario
d. Formularios para ingreso de usuarios con contraseña
8. Crear Funciones personalizadas
9. Uso de botones de control ActiveX
a. Propiedades de los controles
b. Código VBA de los controles
10. Manejo de gráficos
a. Redefinir los rangos a graficar
b. Mostrar gráficos en una ventana de formulario
11. Manejo de formas e imágenes
a. Mover, copiar, cambiar tamaño
b. Escribir formulas en las formas
La Programación en Excel
g. Uso de la grabadora de macros
A pesar que la programación 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 continuación como se hace para que la macro
funcione:
Clic derecho
----------------
----------------
----------------
Asignar macro...
----------------
----------------
1.- Señalar con el mouse el borde del botón y hacer un clic derecho para llamar
al menú contextual
2.- En el menú elegir la opción 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 acción 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 encontraría escrito en una hoja de Modulo insertada dentro del
libro actual de Excel, y para ver esta hoja de módulo habría 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 consultándonos 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.
Aclaración 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 máquina
inteligente, ésta sin embargo, no razona como lo haría 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 podría ordenarle a su hijo menor que
por favor apague la cocina.
Si su hijo aun es pequeño, ¿cómo cree que haría 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 tendría que ser más preciso en darle las instrucciones al pequeño para que
pueda apagar la cocina como es debido sin que ocurra ninguna desgracia, pues él
quizás aun no se percata exactamente del peligro que esta acción 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 ambigüedades para que no lleven a erróneas
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. Añadir comentarios
Los comentarios pueden explicar un procedimiento o una instrucción en
particular a cualquier persona que tenga que leer el código. Visual Basic ignora
los comentarios cuando ejecuta los procedimientos. Las líneas de comentario
comienzan por un apóstrofe (') o con la palabra clave Rem seguida por un
espacio y puede colocarse en cualquier lugar del procedimiento. Para añadir un
comentario a la misma línea que ocupa una instrucción, 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 instrucción 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 instrucción 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 común en Visual Basic especificar una celda o un rango de celdas,
y a continuación realizar alguna acción en ellas, como ingresar un dato, escribir
una fórmula o cambiar el formato. Normalmente esto se realiza en una
instrucción que primero identifica el rango y luego además cambia una
propiedad o aplica un método 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 más 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") Múltiples filas 1, 3 y 8
Range("A:A,C:C,F:F") Múltiples 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 cálculo
Columns(1) Columna uno
Columns("A") Columna uno
Columns Todas las columnas de la hoja de
cálculo
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 programación, 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.- Déle 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 módulo (Menú Insertar/Módulo).
4.- En la hoja de módulo 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 continuación
Clic en Ejecutar.
1) Seleccionar la celda B4
Range("B4").Select
Nota.- Para seleccionar un rango de celdas, use el método Select. Para activar sólo una
celda, puede utilizar el método Activate. Si se activa una celda que se encuentra dentro
del rango seleccionado entonces no se pierde la selección, pero si la celda que se
activa está fuera del rango seleccionado la selección 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 región que contiene el rango fuente.
Equivale a presionar las teclas FIN+FLECHA ARRIBA, FIN+FLECHA ABAJO,
FIN+FLECHA IZQUIERDA o FIN+FLECHA DERECHA.
Sintaxis:
Expresión.End(Dirección)
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/Módulo) 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 después 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 (Región 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 tamaño, 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 región 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, sólo necesita devolver el objeto Range y a continuación asignarle el dato que
desee, como se muestra en los siguientes ejemplos:
3) Escribir el número 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 función 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
deberán estar encerradas entre comillas dobles, los argumentos de las funciones
siempre se escribirán separados con comas y además 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
Este segundo ejemplo evidentemente es más simple y a la vez más eficiente que
el anterior, pues la macro no pierde tiempo desplazando el puntero de celda en la
pantalla para seleccionar ningun rango previamente al ingreso de los datos; la
imagen en la pantalla permanece estática y solo se verán que aparecen los datos
en las celdas correspondientes.
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 cálculo dibuje otro botón 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 diseñado, una vez que ya se ha ingresado un
depósito y nos está solicitando ingresar ahora el retiro, no nos da opción a enmendar
el anterior ingreso si es que hubo un error en él. Más adelante en otro ejercicio
veremos como insertar instrucciones condicionales que permitan abortar una
transacción o continuar ejecutándola.
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, habrán 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 mayoría de las funciones de hoja de cálculo 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 Programación 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 Programación VBA
Nota.- Algunas funciones de hoja de cálculo no tienen utilidad en Visual Basic. Por ejemplo, la
función Concatenar no se necesita, ya que en Visual Basic puede usar el operador de
concatenación & 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 más simple de obtener el mismo resultado que la macro anterior sería de
la siguiente forma:
Sub OtraFuncion()
Range("A12") = Application.WorksheetFunction.Min(Range("A1:C10"))*100
End Sub
Si usa una función de hoja de cálculo que requiere como argumento una referencia de
rango, deberá especificar un objeto Range. Por ejemplo, puede usar la función de hoja
de cálculo BUSCARV para efectuar una búsqueda en un rango de celdas.
En una celda de hoja de cálculo, podría insertar una fórmula 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 función VLOOKUP (que es el nombre en inglés de la función
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 función de
Visual Basic puede tener el mismo nombre que una función de Microsoft Excel y, sin embargo,
dar otros resultados. Por ejemplo, Application.WorksheetFunction.Log, y la función
Log dan resultados diferentes.
SUMA es SUM
PROMEDIO es AVG
CONTAR es COUNT
d. La Función InputBox
Sintaxis
InputBox (Mensaje , titulo, defecto, xpos, ypos, ayuda, contexto)
Donde:
Mensaje Obligatorio. Texto que se muestra como mensaje en el cuadro de
diálogo. Si mensaje consta de más de una línea, puede separarlos
utilizando un carácter de retorno de carro Chr(13), un carácter de
avance de línea Chr(10) o una combinación de los caracteres de retorno
de carro-avance de línea Chr(13) y Chr(10) entre cada línea y la
siguiente.
titulo Opcional. Texto que se muestra en la barra de título del cuadro de
diálogo. Si omite titulo, en la barra de título se coloca el nombre de la
aplicación 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 vacío.
xpos Opcional. Numero que especifica, en pixels, la distancia en sentido
horizontal entre el borde izquierdo del cuadro de diálogo y el borde
izquierdo de la pantalla. Si se omite xpos, el cuadro de diálogo se centra
horizontalmente.
ypos Opcional. Expresión numérica que especifica, en pixels, la distancia en
sentido vertical entre el borde superior del cuadro de diálogo y el borde
superior de la pantalla. Si se omite ypos, el cuadro de diálogo 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 diálogo. Si se
especifica ayuda, también deberá especificarse contexto.
contexto Opcional. Expresión numérica que es el número de contexto de Ayuda
asignado por el autor al tema de Ayuda correspondiente. Si se
especifica contexto, también deberá especificarse ayuda.
Nota.- Si desea especificar más que el primer argumento con nombre, debe utilizar InputBox en una
expresión. Si desea omitir algunos argumentos de posición, debe incluir los delimitadores de
coma correspondiente.
Inputbox("Ingrese nombre:", ,"Desconocido")
e. El Método InputBox
Sintaxis:
expresión.InputBox (Mensaje, titulo, defecto, xpos, ypos, ayuda, contexto, tipo)
Donde:
expresión Expresión obligatoria que asigna un objeto Application.
Mensaje Dato obligatorio que se mostrará en el cuadro de diálogo. Puede ser
un texto, un número, una fecha o un valor Boolean (Excel convierte el
dato en texto antes de que muestre).
Title Opcional. Tiítulo del cuadro de entrada. Si este argumento se omite, el
título predeterminado será "Entrada".
Defecto Opcional. Especifica un valor que aparecerá en el cuadro de texto
cuando se muestre inicialmente el cuadro de diálogo. Si este argumento
se omite, el cuadro de texto permanecerá vacío. Este valor puede ser un
objeto Range.
xpos Opcional. Especifica la posición X del cuadro de diálogo con respecto
a la esquina superior izquierda de la pantalla, en puntos.
ypos Opcional. Especifica la posición Y del cuadro de diálogo 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 identificación de contexto del tema de Ayuda.
Tipo Opcional. Especifica el tipo de datos que se devuelve. Si este
argumento se omite, el cuadro de diálogo devolverá texto. Puede ser
uno de los siguientes valores o bien una suma de ellos.
Valor Significado
0 Una fórmula
1 Un número
2 Texto (una cadena)
4 Un valor lógico (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 números, establezca Tipo como 1 + 2.
Use InputBox para mostrar un cuadro de diálogo sencillo que permite introducir
información para usarla en una macro. El cuadro de diálogo tiene un botón Aceptar y
un botón Cancelar. Si elige el botón Aceptar, InputBox devolverá el valor introducido
en el cuadro de diálogo. Si elige el botón Cancelar, InputBox devolverá False.
Si Type es 0, InputBox devolverá la fórmula en forma de texto, por ejemplo,
"=2*PI()/360". Si existen referencias en la fórmula, se devolverán como referencias de
Conclusión:
El método InputBox difiere de la función InputBox en que el primero permite la
validación selectiva de las entradas del usuario y en que puede usarse con objetos,
valores de error y fórmulas de Excel. Tenga en cuenta que Application.InputBox llama
al método 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
función InputBox, y el dato escrito será considerado siempre como del tipo texto.
Ejemplos
En este ejemplo se solicita un número 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 función de hoja de cálculo PAGO para calcular el pago
mensual de un préstamo hipotecario.
1ra Solución:
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
función PAGO siguiente:
=PAGO(B3/1200,B4,-B5)
Número de pagos
2da Solución:
Ahora, el mismo caso anterior se va ha resolver pero utilizando íntegramente un
procedimiento Sub. Es decir no se necesitarán en absoluto datos de ninguna celda.
1.- Ingresar al Editor de Visual Basic con Alt+F11 y luego inserte una hoja de módulo
con el menú Insertar/Modulo.
2.- En la hoja de módulo escriba las siguientes instrucciones:
Sub PagoMensual()
Interes = Val(InputBox("Ingrese el Interés:"))
Periodos = Val(InputBox("Ingrese los Periodos:"))
Prestamo = Val(InputBox("Ingrese el Préstamo:"))
Pago = Application.WorksheetFunction.Pmt(Interes/1200, _
Periodos,-Prestamo)
MsgBox ("El Pago mensual es de: " & Format(Pago, "Currency"))
End Sub
Como la función Inputbox devuelve datos tipo texto al escribir el Interés, los
Períodos o el Préstamo, entonces, se le antepone la función Val para convertir esos
datos en números, y así poder operarlos matemáticamente con la función Pago (que
en ingles su equivalente es Pmt)
3.- Con Autoformas/Formas básicas/Bisel dibuje un botón en la hoja de calculo y
asígnele la macro PagoMensual.
3ra Solución:
Una tercera forma de ingresar los datos para el calculo del pago de la hipoteca es
haciendo uso del Método Inputbox, en vez de la Función Inputbox.
1.- Ingresar al Editor de Visual Basic con Alt+F11 y en la hoja de módulo escriba las
siguientes instrucciones:
Sub OtroPago()
Interes = Application.InputBox("Seleccione el Interés:")
Periodos = Application.InputBox("Seleccione los Periodos:")
Prestamo = Application.InputBox("Seleccione el Préstamo:")
Pago = Application.WorksheetFunction.Pmt(Interes / 1200, _
Periodos, -Prestamo)
MsgBox ("El Pago mensual es de: " & Format(Pago, "Currency"))
End Sub
En este caso el método Interés = Application.Inputbox trata al dato que uno escribe,
directamente como del tipo numérico, ya no como texto. Por esta razón ya no es
necesario usar la función Val.
2.- Luego asigne esta macro al mismo botón de autoformas del caso anterior.
Cuando la macro se ejecute y aparezcan las ventanas para introducir datos, se podrán
escribir los datos o sino también se podrá seleccionar con el mouse las celdas que
contienen los datos que se solicitan y hacer luego clic en el botón Aceptar:
Val Convierte los números contenidos en una cadena como un valor numérico del tipo
adecuado.
Left Extrae un número especificado de caracteres del lado izquierdo de una cadena.
Right Extrae un número especificado de caracteres del lado derecho de una cadena.
Int, Fix Las funciones Int y Fix eliminan la fracción de un número y devuelven el valor
entero resultante. La diferencia entre Int y Fix es que si el número es negativo, Int
devuelve el primer entero negativo menor o igual a número, mientras que Fix
devuelve el primer entero negativo mayor o igual a número.
Len Da como resultado la cantidad de caracteres que tiene una cadena de texto.
Hour Obtiene un número entero entre 0 y 23, inclusive, que representa la hora del
argumento de la función.
Now Obtiene un número que especifica la fecha y hora actuales de acuerdo con la
configuración de la fecha y la hora del sistema de su equipo.
Day Obtiene un número entero entre 1 y 31, inclusive, que representa el día del mes.
Minute Obtiene un número entero entre 0 y 59, inclusive, que representa el minuto de la
hora actual del sistema.
Second Obtiene número entero entre 0 y 59, inclusive, que representa los segundos de la
hora actual del sistema.
Year Obtiene un número entero que representa el año 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 colección.
Donde:
condición Requerido. Uno o más de los siguientes dos tipos de
expresiones:
Una expresión numérica o expresión de cadena que puede ser
evaluada como Verdadera o Falsa. Si condición es Null,
condición se considera Falsa.
instrucciones Opcional en formato de bloque; se requiere en formato de línea
sencilla que no tenga una cláusula Else. Una o más instrucciones
Puede utilizar la forma de una sola línea (Sintaxis 1) para pruebas cortas y sencillas.
Sin embargo, el formato de bloque (Sintaxis 2) proporciona más estructura y
flexibilidad que la forma de línea simple y, generalmente, es más fácil de leer, de
mantener y de depurar.
Nota.- Con la sintaxis1 es posible ejecutar múltiples instrucciones como resultado de una decisión
If...Then, pero todas deben estar en la misma línea y separadas por dos puntos, como en la
instrucción siguiente:
If N > 1 Then A = N * 2 : B = B + N : C = C - N
Una instrucción con formato de bloque If debe ser la primera de la línea. Las partes
Else, ElseIf y End If, de la instrucción, solamente pueden ir precedidas de un número
de línea o una etiqueta de línea. El bloque If debe terminar con una instrucción End If.
Para determinar si una instrucción If es un bloque, examine lo que sigue a la palabra
clave Then. Si lo que aparece detrás de Then en la misma línea no es un comentario, la
instrucción se considera como una instrucción If de una sola línea.
Las cláusulas Else y ElseIf son opcionales. Puede tener en un bloque ElseIf, tantas
cláusulas If como desee, pero ninguna puede aparecer después de una cláusula 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 condición. Si condición es
Verdadera, se ejecutan las instrucciones que están a continuación de Then. Si
condición es False, se evalúan una a una las condiciones ElseIf (si existen). Cuando se
encuentra una condición Verdadera se ejecutan las instrucciones que siguen
inmediatamente a la instrucción Then asociada. Si ninguna de las condiciones ElseIf es
Verdadera (o si no hay cláusulas ElseIf), se ejecutan las instrucciones que siguen a
Else. Después de la ejecución de las instrucciones que siguen a Then o Else, la
ejecución continúa con la instrucción que sigue a End If.
Sub Cumpleaños()
MiCumple = #23/8/2009#
If MiCumple > Now Then msgbox "Aún falta para mi cumpleaños"
End Sub
Para ejecutar más de una línea de código, es preciso utilizar la sintaxis de múltiples
líneas. Esta sintaxis incluye la instrucción End If, tal y como muestra el siguiente
ejemplo:
trabajador. La instrucción que sigue a la instrucción Else sólo 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 condición dada sea True.
Sintaxis
While condición
intrucciones
Wend
Donde:
condición Requerido. Expresión numérica o expresión de cadena cuyo
valor es Verdadero o Falso. Si condición es Null, condición se
considera Falso.
instrucciones Opcional. Una o más instrucciones que se ejecutan mientras la
condición es Verdadera.
La siguiente macro busca a partir de la celda B3 hacia abajo una celda que se
encuentre vacía.
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 ejecución continúa con la instrucción que
sigue a la instrucción Next.
Sugerencia Cambiar el valor de contador mientras está dentro de un bucle hace difícil
su lectura y depuración.
Se pueden colocar en el bucle cualquier número de instrucciones Exit For como una
manera alternativa de salir del mismo. La instrucción Exit For, que se utiliza a menudo
en la evaluación de alguna condición (por ejemplo, If...Then), transfiere el control a la
instrucción que sigue inmediatamente a la instrucción 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 construcción 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 instrucción Next, la ejecución continúa como si este se
hubiera incluido. En cambio si se produce un error si se encuentra una instrucción Next antes
de su instrucción For correspondiente.
incrementa en 2 cada vez que se repite la ejecución 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 ejecución 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 expresión.
Sintaxis
Select Case expresión_prueba
Case lista_expresion-n
instrucciones-n...
Case Else
instrucciones_else
End Select
Donde:
expresión_prueba Requerido. Es cualquier expresión numérica o expresión de
cadena.
lista_expresión-n Requerido si aparece la palabra clave Case. Lista delimitada por
comas de una o más de las formas siguientes:
expresión,
expresión To expresión,
Is operador_de_comparación expresión.
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 comparación para
especificar un intervalo de valores. Si no se escribe, la palabra
clave Is se insertará automáticamente.
instrucciones-n Opcional. Una o más instrucciones ejecutadas si
expresión_prueba coincide con cualquier parte de
lista_expresión-n.
instrucciones_else Opcional. Una o más instrucciones que se ejecuten si
expresión_prueba no coincide con ninguna de las cláusulas
Case.
Las instrucciones Select Case se pueden anidar. Cada instrucción Select Case debe
tener su correspondiente instrucción 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 condición es Verdadera o hasta que una
condición se convierta en Falsa.
Sintaxis
Donde:
condición Opcional. Expresión numérica o expresión de cadena que es
Verdadera o Falsa. Si la condición es Null, la condición se
considera Falsa.
Instrucciones Una o más instrucciones que se repiten mientras (While) o hasta
que (Until) la condición 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 ejecución de un bucle sin fin que se repite sin control, presione
la tecla Esc o la combinación 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
genérica o cualquier variable de objeto específica.
grupo Requerido. Nombre de un conjunto de objetos o de una matriz .
instrucciones Opcional. Una o más 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. Después, mientras haya más elementos en grupo, las
instrucciones en el bucle continúan ejecutándose para cada elemento. Cuando no hay
más elementos en el grupo, se sale del bucle y la ejecución continúa con la instrucción
que sigue a la instrucción Next.
Se pueden colocar en el bucle cualquier número de instrucciones Exit For. La
instrucción Exit For se utiliza a menudo en la evaluación de alguna condición (por
ejemplo, If...Then) y transfiere el control a la instrucción que sigue inmediatamente a
la instrucción 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 instrucción Next, la ejecución continúa como si se
hubiera incluido. En cambio si se encuentra una instrucción Next antes de su instrucción 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 código siguiente recorre todas las celdas de un rango, asignado a la variable Cuadro
con la instrucción 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 continuación 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 cálculo 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 numérico."
Exit For
End If
Next
End Sub
haciendo referencia al objeto una vez, en lugar de hacerlo con cada asignación 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 instrucción 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 función 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 botón “Abrir
Ficha”.
12. Finalmente guarde el archivo como un libro habilitado para macros y póngale el
nombre Registro de alumnos.
13. En la misma carpeta donde guarde el anterior archivo de Excel, deberá guardar
también los archivos con formato jpg que contengan las fotos de los alumnos, los
cuales deberán tener nombres como: A001.jpg, A002.jpg, … etc.
También es posible operar al mismo tiempo sobre toda una colección de objetos siempre
que los objetos compartan métodos comunes. Por ejemplo, el siguiente procedimiento
cierra todos los formularios abiertos.
Sub CierraTodosLosFormularios()
Forms.Close
End Sub
Método es toda acción que puede realizar un objeto. Por ejemplo, Add es un método del
objeto ComboBox ya que sirve para añadir un nuevo elemento a un cuadro combinado.
El siguiente procedimiento utiliza el método Add para añadir dos elementos a un
ComboBox.
Sub AñadeElementos()
Combo1.AddItem "Masculino"
Combo1.AddItem "Femenino"
End Sub
Propiedad es uno de los atributos de un objeto, que define una de las características del
objeto, tal como su tamaño, color o localización en la pantalla, o un aspecto de su
comportamiento, por ejemplo si está visible o activado. Para cambiar las características de
un objeto, se cambia el valor de sus propiedades.
Para dar valor a una propiedad, hay que colocar un punto después de la referencia a un
objeto, después el nombre de la propiedad y finalmente el signo igual (=) y el nuevo valor
de la propiedad. Por ejemplo, el siguiente procedimiento cambia el título 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 sólo el valor de
la propiedad (sólo lectura) o sólo dar valor a la propiedad (sólo escritura).
Evento es toda acción que puede ser reconocida por un objeto, como puede ser el clic del
mouse o la pulsación de una tecla y para la que es posible escribir código como respuesta.
Los eventos pueden ocurrir como resultado de una acción del usuario o del código del
programa, también pueden ser originados por el sistema.
El siguiente procedimiento escrito en el código 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 función MsgBox, las palabras en cursiva y negrita son argumentos con
nombre de la función. Los argumentos que aparecen entre corchetes son opcionales. (No
escriba los corchetes en el código de Visual Basic). En el caso de la función MsgBox, el
único argumento que se debe incluir es el texto de la pregunta.
Los argumentos para funciones y métodos se pueden especificar en el código mediante su
posición o por su nombre. Para especificar argumentos mediante su posición, 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 métodos muestran los argumentos entre paréntesis.
Estas funciones y métodos devuelven valores, por eso deben encerrarse los argumentos
entre paréntesis 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 paréntesis. Los métodos que
no devuelven valores no necesitan que sus argumentos aparezcan encerrados entre
paréntesis. Estas normas son aplicables tanto si se usan argumentos posicionales o
nominativos.
En el siguiente ejemplo, el valor que devuelve la función MsgBox es un número que
indica el botón seleccionado almacenado en la variable miVar. Dado que se utiliza el valor
que devuelve la función, es preciso utilizar paréntesis. 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 instrucción Option Compare, las llaves y la línea vertical indican una
elección obligatoria entre tres opciones. (No escriba las llaves en la instrucción de Visual
Basic).
Por ejemplo, en Visual Basic al comparar dos textos se tienen en cuenta las mayúsculas y
minúsculas, pero si se escribe la siguiente instrucción en el área de declaraciones dentro
del módulo (antes de todas las subrutinas) entonces las cadenas de texto que se comparen
no importan ya si se escriben en mayúsculas o minúsculas.
Option Compare Text
En la sintaxis de la instrucción Dim, la palabra Dim es una palabra clave exigida. El único
elemento necesario es nombrevariable (el nombre de la variable). Por ejemplo, la siguiente
instrucción crea tres variables: miVar, siguienteVar y terceraVar. Estas variables se
declaran automáticamente 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 código.
Dim miRespuesta As String
Para declarar varias variables en una instrucción, debe incluirse el tipo de datos para cada
variable. Las variables declaradas sin un tipo de datos se declaran automáticamente como
Variant.
Dim x As Integer, y As Integer, z As Integer
En la siguiente instrucción, a x e y se les asigna el tipo de datos Variant. Sólo 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 paréntesis. Los subscriptos son
opcionales. La siguiente instrucción define las dimensiones de una matriz dinámica,
miMatriz.
Dim miMatriz()
información sobre tipos de datos puede consultar la sección "Tipo de datos Summary" en
la Ayuda de Visual Basic.
Se pueden declarar varias variables en una instrucción. Para especificar el tipo de datos se
debe incluir un tipo de datos para cada variable. En la siguiente instrucción 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 instrucción, intX e intY se declaran como del tipo Variant; y sólo intZ se
declara como del tipo Integer.
Dim intX, intY, intZ As Integer
No es necesario especificar el tipo de datos en la instrucción de declaración. Si se omite, la
variable será del tipo Variant.
Tamaño 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 Número 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, más cuatro
bytes para cada dimensión de matriz, más el número de bytes que ocupan los propios
datos. Puede calcular la memoria que ocupan los datos multiplicando el número de
elementos de datos por el tamaño 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 más 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 más que la matriz por sí sola.
Sub FueraAlcance()
MsgBox strMensaje
End Sub
públicas están disponibles para todos los procedimientos de todos los módulos de un
proyecto; las variables privadas sólo están disponibles para los procedimientos de ese
módulo. Las variables declaradas con la instrucción Dim en la sección 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 código.
En el siguiente ejemplo, la variable de cadena strMensaje está disponible para cualquier
procedimiento definido en el módulo. Cuando se llama al segundo procedimiento, presenta
el contenido de la variable de cadena strMensaje en un cuadro de dialogo.
' Añada lo siguiente a la sección de Declarations del módulo.
Private strMensaje As String
Sub InicializaVariablePrivada()
strMensaje = "Esta variable no se puede usar fuera de este módulo."
End Sub
Sub UsaVariablePrivada()
MsgBox strMensaje
End Sub
Nota Los procedimientos públicos de un módulo estándar o módulo de clase están
disponibles para cualquier proyecto de referencia al proyecto actual. Para limitar el
alcance de todos los procedimientos de un módulo al proyecto actual, añada una
instrucción Option Private Module a la sección Declarations del módulo. Las variables y
procedimientos públicos seguirán estando disponibles para los restantes procedimientos
del proyecto actual, pero no lo estarán para los proyectos que a los que puedan hacer
referencia.
Este ejercicio muestra tres métodos distintos, cada uno de ellos más eficiente y más rápido
que el otro, para buscar y copiar un dato que se intenta localizar dentro de una lista:
2do Metodo:
Utiliza la opción Buscar de la ficha Inicio/Buscar y reemplazar/Buscar.
Este método es mas rápido 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 método es mucho más rápido 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, agréguele el siguiente código:
Private Sub Calendar1_Click()
ActiveCell = Calendar1.Value
Unload Me
End Sub
ProgressBar:
Cuando se realicen procesos que demandan mucho tiempo para Excel, quizás 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
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.
Asignación 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 cálculo 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 selección, verificar que solo esté marcada la
casilla Fila superior, y luego Aceptar
5. En la celda H5 escribir la siguiente fórmula matricial:
{=SUMA(SI((Chofer=G5)*(Dia>=H$2)*(Dia<H$2+1),Precio))}
Luego copiar esta fórmula en el rango H5:H9, y finalmente en H10 escribir la
formula: =SUMA(H5:H9).
Presionar Ctrl+*
Ficha Formulas/Crear desde la selección, 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, además agregar la
sentencia Application.DisplayAlerts=False, luego de lo cual la subrutina quedaría como
se muestra a continuación:
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 póngale el
nombre Taxi. El archivo se guardará 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 cálculo. Para los cual se van a crear dos
macros:
Una macro que crea códigos 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 módulo escriba el siguiente código 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
Objetivos:
Utilizar las distintas sentencias de control para la solución de múltiples tareas en el manejo
de datos. Las sentencias de control a utilizarse son las siguientes:
If..then..else,
Select Case
While…wend,
For…next,
For each…next.
2. En Visual Basic insertar una hoja de módulo 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
Objetivos:
Se desea ingresar datos de diferentes clientes en una lista, utilizando tres métodos
diferentes:.
Copiando datos del cliente desde un rango de celdas.
Ingresar datos del cliente utilizando ventanas de Inputbox.
Ingresar datos del cliente a través 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 botón de comando Cancelar, y
allí escriba el siguiente código:
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
Protección de la hoja de calculo con contraseñas
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 mañana 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 deberán cumplirse por ambas
partes:
Si trabaja 5 días a la semana sin faltar, hay una bonificación 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 cálculo 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
continuación en la figura.
21. Combinar y centrar los siguientes rangos de celdas:
D2:C2 Tamaño 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,
categoría 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 título 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 año 2004. Luego
seleccionando ambas celdas, arrastrar el cuadro de
relleno hacia abajo hasta la celda C158 que
correspondería 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 números y nombres
de los doce meses del año 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 botón “Casilla de verificación” dibuje una casilla y borre
totalmente el texto que lo acompaña.
37. En la casilla que acaba de crear haga un clic derecho y elija la opción 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 más otras celdas de la columna F y con la opción Formato
de control cambie las celdas de vinculación 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
reverificación de las celdas F4, F5, F6, F7, F8, G7 y G8. tal y como se muestra en la figura
más adelante.
A continuación vamos a dar formato condicional a las celdas que tienen las horas para que
cambien de color automáticamente de la siguiente forma:
las horas de llegada si son más 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 también se pintará de fondo rojo y letras blancas.
Las horas extras previamente autorizadas con un check en la columna H se pintarán de
fondo color Oro.
40. Seleccionar el rango C4:C8 y llamando al menú Formato/Formato condicional elija lo
siguiente:
En el botón 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 botón de Formato elija.- Fuente: Color Blanco y en Negrita; Bordes: Contorno;
Tramas: Color Rojo.
46. Con el botón que se encuentra en las herramientas de Formulario, dibujar los siguientes
botones: Ingreso, Falta, Salida y Borrar Todo, como los que se muestran a
continuación:
47. Además hacia el dalo superior derecho del cuadro dibujar con Autoformas/Formas
básicas/Señal de prohibido, el círculo con diagonal que se muestra en la figura anterior y
luego píntela con la herramienta de color de relleno, de color Rojo. Además haga un clic
derecho en este botón 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 Módulo 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 "Protección 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, asígnele su respectiva macro.
50. A la autoforma “señal de prohibido” (circulo con diagonal rojo) asígnele la macro
PonerSeguro.
51. Ejecute la macro BorrarTodo haciendo un clic en el botón 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
botón Ingreso y se escribiría 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 botón de Señal de Prohibido y
listo. La hoja quedará protegida y además el archivo Vigilancia se habrá grabado también
automáticamente en disco. En pantalla aparecerá un mensaje indicando que la hoja ha
quedado protegida.
Cuando se desee quitar la protección, vuelva a presionar el botón de Señal de Prohibido y
cuando le solicite la contraseña 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 protección a la
hoja.
Una vez retirada la protección, en la pantalla aparecerá un mensaje indicando que la hoja se
encuentra sin protección y entonces podrá usted seguir ingresando las demás 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 protección con un clic en el botón correspondiente.
Si las formulas en la hoja han sido escritas correctamente, los cálculos deberán realizarse
automáticamente.
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)
Tamaño 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
precisión simple) valores positivos
-1.79769313486231E308 a
Double
-4,94065645841247E-324 para valores negativos;
(coma flotante/ 8 bytes
4,94065645841247E-324 a
precisión 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
número más pequeño 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 numérico hasta el intervalo de un
16 bytes
(con números) 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
Número 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 más cuatro bytes para
cada dimensión de matriz, más el número de bytes que ocupan los propios datos. Puede
calcular la memoria que ocupan los datos multiplicando el número de elementos de datos por
el tamaño 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 más 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 más que la matriz por sí sola.
Nota Use la funnción StrConv para converter un dato sting a otro tipo de dato
Sintaxis
CBool(expresión) CByte(expresión)
CCur(expresión) CDate(expresión)
CDbl(expresión) CDec(expresión)
CInt(expresión) CLng(expresión)
CSng(expresión) CStr(expresión)
CVar(expresión)
Tipos devueltos
Comentarios
Si la expresión del argumento expresión que se pasa a la función está fuera del intervalo del tipo de
dato al que se va a convertir, se producirá un error.
En general, el código se puede documentar utilizando las funciones de conversión de tipos de datos
para indicar que el resultado de alguna de las operaciones se debería expresar como un tipo de datos
en particular, no como el tipo de datos predeterminado. Por ejemplo, utilice Ccur para forzar la
ejecución de operaciones con aritmética monetaria en los casos en los que se haría con precisión
simple, doble precisión o aritmética entera.
Debe utilizar funciones de conversión 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 configuración regional establecida en su equipo.
Cuando la parte fraccionaria es exactamente 0,5, CInt y CLng siempre redondean al número par más
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 número, en lugar de redondear.
Además, Fix y Int siempre devuelven un valor del mismo tipo del que se le pasa.
Utilice la función IsDate para determinar si se puede convertir date a una fecha o una hora. CDate
reconoce literales de fecha y literales de hora además de números comprendidos dentro del intervalo
de fechas aceptables. Al convertir un número a una fecha, la parte numérica entera se convierte a una
fecha. Cualquier parte fraccionaria del número se convierte a la hora del día, comenzando a
medianoche.
Se proporciona una función CVDate por compatibilidad con versiones anteriores de Visual Basic. La
sintaxis de la función CVDate es idéntica a la de la función CDate; sin embargo, CVDate devuelve un
Variant de subtipo Date en lugar del tipo Date real. Puesto que ahora hay un tipo de dato intrínseco
Date, no es necesario CVDate. Se puede observar el mismo efecto al convertir una expresión a Date
y asignarla después a un Variant. Esta técnica es coherente con la conversión de todos los demás
tipos intrínsecos a sus equivalentes subtipos Variant.
Nota La función CDec no devuelve un tipo de dato discreto; en su lugar, siempre devuelve un
Variant con los valores convertidos a un subtipo Decimal.