Manual Excel VBA2
Manual Excel VBA2
Contenido
Propiedades
Procedimientos
2. Segn su contenido
Tipo de Tamao de
datos almacenamiento Intervalo
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 4 bytes -3,402823E38 a 1,401298E-45 para
(coma valores negativos; 1,401298E-45 a
flotante/ 3,402823E38 para valores positivos
precisin
simple)
Double 8 bytes -1.79769313486231E308 a
(coma -4,94065645841247E-324 para valores
flotante/ negativos; 4,94065645841247E-324 a
precisin 1,79769313486232E308 para valores
doble) positivos
Currency 8 bytes -922.337.203.685.477,5808 a
(entero a 922.337.203.685.477,5807
escala)
Decimal 14 bytes +/-
79.228.162.514.264.337.593.543.950.335
sin punto decimal;
+/-7,9228162514264337593543950335
con 28 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
3. Segn su alcance
Ejemplo1:
Dim I As Integer
Dim R As Double
Dim Nombre As String
Dim Etiquetas As String * 10
Dim F As Currency
Dim K As Long, S, X As Currency
Las sentencias anteriores declaran I como una variable entera, R como una variable
real de precisin doble, Nombre como una variable para contener una cadena de
caracteres de longitud variable fraccionaria, L como una variable entera larga y X
como una variable fraccionaria.
Observad como en una sentencia Dim se puede realizar ms de una declaraci
Ejemplo2:
Dim A, B As Integer
La sentencia anterior puede inducir a pensar que A y B son del tipo entero, lo cual
no es cierto; A es del tipo Variant (por defecto) y B es del tipo Integer.
Otra forma de declarar una variable es utilizando los caracteres de declaracin de
tipo.
Declaracin explcita
En Visual no es necesario declarar una variable antes de utilizarla pero esta forma
de trabajar puede dar lugar a errores.
Por ejemplo:
Dim M As Integer, N As Integer
VarTemp = M ...
N = VarTemp
Option Explicit
Esta sentencia opera slo en el formulario o mdulo donde se especifica. Para tener
la opcin activa para todo el cdigo de la aplicacin, debemos acudir al men
Herramientas, seleccionar Opciones,
Del cuadro de dialogo presentado activar "Requerir Declaracin de variables".
Variables locales
Una variable local se reconoce solamente en el procedimiento en el que est
definida. Fuera de l, la variable no es conocida. Su utilizacin ms comn es
intervenir en clculos intermedios.
Para declarar una variable local a un procedimiento utilizamos Dim.
Por ejemplo:
Private Sub Grados_C_KeyPress(KeyAscii As Integer)
Dim GradosFahr As Double
If(KeyAscii = 13) Then
GradosFahr = Val(Grados_C.Text) * 9 / 5 + 32
Grados_F.Text = Format$(GradosFahr)
End If
End Sub
Una variable local es reinicializada cada vez que se entra en el procedimiento. Es
decir, no conserva su valor entre una llamada al procedimiento y la siguiente.
Variable esttica
Para hacer que esto no suceda, hay que declarar la variable como esttica. Visual
reinicializa una variable esttica solamente la primera vez que se llama al
procedimiento. Para declarar una variable como esttica se utiliza la palabra clave
Static en lugar de Dim.
Por ejemplo:
Static var_ent As Integer
Variables globales
Una variable global es una variable declarada a nivel de mdulo pero que puede
ser accedida desde cualquier otro mdulo. Para hacer que sea global o pblica hay
que declararla Public (Global en versiones anteriores) en la seccin de
declaraciones del mdulo.
Por ejemplo:
Public var1_global As Souble, var2_global As String
Cuando una variable Public, por ejemplo var1_global, se declara en un formulario,
por ejemplo Mi_Formulario, para acceder a ella desde otro mdulo es necesario
especificar su pertenencia; esto es, de qu objeto es dato miembro dicha variable.
General Declaraciones
Dim b As Integer
La variable b es un variable a nivel de formulario esto quiere decir que tiene como
mbito todo el formulario, sus controles y eventos. Como nos damos cuenta de esto.
Si usted edita el cdigo y ejecuta el programa ver que cuando presiona el botn
de command1, en el Text1 se muestra el valor 5.
La variable c es un variable static, esto quiere decir que retiene su valor cada vez
que ejecuta el evento click en el command1. Como nos damos cuenta de esto. Si
usted edita el cdigo y ejecuta el programa ver que cuando presiona el botn
command1, en el Text1 se muestra el valor 3, si vuelve a presionarlo el botn
command1 en el Text1 se muestra el valor 6, si vuelve a presionar el botn
command1 en el Text1 se muestra el valor 9, se comporta como un contador.
Conclusin:
c es una variable static, no se reinicia, retiene su valor, esto hace que se comporte
como un contador. Una variable static, slo se puede declarar en eventos de los
controles mas no en el objeto General, evento Declaraciones.
La variable d es una variable pblica a nivel de mdulo, esto quiere decir que tiene
como mbito todos los formularios del proyecto.
Como nos damos cuenta de esto. Si usted edita el cdigo y ejecuta el programa
ver que cuando presiona el botn command1 del form1, en el Text1 se muestra el
valor 5, si vuelve a presionarlo el botn command1 en el Text1 se muestra el valor
10, se comporta como un contador.
Cuando pasa al segundo Form2 y presiona el botn Command1 en el Text1 se
muestra el valor 13. Pasa el valor de la variable d del form1 al form2.
Conclusin:
c es una variable static, no se reinicia, retiene su valor, esto hace que se comporte
como un contador..
Una variable static, slo se puede declarar en eventos de los controles mas no en
el objeto General, evento Declaraciones
3. Nombres de rango
2. Programa
Sub Busca1()
T = Timer
Range("Valor").ClearContents
Range("Tiempo").ClearContents
Application.ScreenUpdating = False
Range("Lista").Select
While ActiveCell <> Range("Dato")
ActiveCell.Offset(1, 0).Select
Wend
Range("Valor") = ActiveCell.Offset(0, 1)
Range("Valor").Select
Application.ScreenUpdating = True
Range("Tiempo") = Timer - T
End Sub
Sub Busca2()
T = Timer
Range("Valor").ClearContents
Range("Tiempo").ClearContents
Application.ScreenUpdating = False
Dato = Range("Dato")
Range("Lista").Select
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
Application.ScreenUpdating = True
Range("Tiempo") = Timer - T
End Sub
Sub Busca3()
T = Timer
Range("Valor").ClearContents
Range("Tiempo").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)
End If
Range("Valor").Select
Range("Tiempo") = Timer - T
End Sub
Sub Busca4()
T = Timer
Range("Valor").ClearContents
Range("Tiempo").ClearContents
Dato = Range("Dato")
Range("Valor") = Range("Lista").Cells.Find(Dato, , , xlWhole).Offset(0, 1)
Range("Tiempo") = Timer - T
End Sub
Elaborado por: Dennis Pichilingue R Pgina: 15
Ms. Excel VBA - Nivel II
Sub Busca5()
T = Timer
Range("Valor").ClearContents
Range("Tiempo").ClearContents
Dato = Range("Dato")
Range("Valor") = Application.Evaluate("=vlookup(Dato,Cuadro,2,0)")
Range("Tiempo") = Timer - T
End Sub
Sub Borrar()
Range("Valor").ClearContents
Range("Tiempo").ClearContents
End Sub
Objetos Propiedad
Worksheets(1).Cells(1).Font.Size = 15
Objetos Propiedad
Application.ActiveWorkbook.Worksheets("Hoja1").Range ("A1").Value = 5
Las jerarquas
Nos ayuda hacer referencia a los objetos segn su posicin en la jerarqua de objetos.
Utilice un punto para separar los objetos. Ejemplo.
Application.Workbooks(datos.xlsx).Worksheets(Hoja1). Range(A1)
Objeto Range
El objeto Range est contenido dentro del objeto Worksheet y consta de una o varias
celdas.
Application.Workbooks(datos.xlsx).Worksheets(Hoja1).
Range(A1).value=1
Worksheets(Hoja1). Range(Input).value=1
Worksheets(Hoja1). Range(A1,B10).value=1
El examinador de objetos
Muestra los eventos, mtodos y propiedades asociados a cada objeto.
Propiedades
Mtodos
Evento
La ventana inmediato
Es una herramienta para probar instrucciones, expresiones VBA, propiedades y
mtodos. El resultado se muestra inmediatamente
Presionar las teclas Crtl + G para mostrar la ventana inmediato.
Ejecutar comandos
Presione las teclas Ctrl + Barra espaciadora para mostrar la lista de objetos
Ejemplos.
1: Workbooks.add Agrega un nuevo libro
2: Workbooks(1).close Cierra el libro activo
3: Workbooks(libro3).Activate Activa el libro3
4: Worksheets(2).Delete Elimina la hoja2
5: Worksheets(2).Activate Activa la hoja2
6: Worksheets.Add.Name = Ene Agrega una hoja con el nombre Ene
7: Worksheets(Array(1,2,3)).Select Selecciona la hoja 1,2 y 3
Expresiones lgicas
Imprescindibles para verificar condiciones son las expresiones lgicas, expresiones
cuya evaluacin produce un valor lgico.
a. Operadores de relacin
Se utiliza para establecer una relacin, entre un valor numrico con sus
respectiva variable o entre expresiones matemticas. Entre los operadores de
relacin tenemos:
= igualdad
< Menor que
<= menor o igual que
> Mayor que
>= mayor o igual que
< > Diferente
Is Compara dos variables de referencia a objetos
Objeto Is Var resulta en True suponiendo que Objeto sea igual a X y que
X igual a Var
Like Compara dos secuencias de caracteres. FnnnF Like F*F resulta en
True.
Ejemplos
1. Verificar si es verdadero o falso
Relacin Resultados
5>3 es verdadero
3=2 es falso
2. Dado las siguientes variables A=3, B=4 y C=3 entonces evaluar los
resultados:
A=B falso ; A<B verdadero
A=C verdadero ; A <= C verdadero
b. Operadores lgicos.
Se utiliza para establecer condiciones entre expresiones. Entre los operadores
lgicos tenemos:
not No lgico
and Y lgico
or O lgico.
c. Tablas de verdad
Negacin (not)
Invierte la condicin de la expresin.
P not P
V F
F V
Conjuncin (and)
Es verdadero (true), si todas las comparaciones son verdaderas. Si alguna es
falsa el resultado es falso (false)
p q p and q
V V V
V F F
F V F
F F F
Disyuncin (or)
Es verdadera si una de las dos comparaciones lo es. Si ambas, son falsas, el
resultado es falso.
p q p or q
V V V
V F V
F V V
F F F
Ejemplos:
1. (1 > 0) AND (3 = 3) verdadero
2. (0 < 7) OR (0 > 7) verdadero
3. Defina una expresin lgica que evalu si un nmero se encuentra en el
rango de nmeros 48 y 57. Sea n el nmero
(n >= 48 and n <= 57)
4. Defina una expresin lgica que evalu si un nmero se encuentra en el
rango de nmeros 65 y 90, o en el rango 95 y 122. Sea n el nmero.
(n >= 65 and n <= 90) or (n >= 95 and n <= 122)
5. Defina una expresin lgica que evalu si un nmero se encuentra entre el
siguiente listado de nmeros 8, 32, 13, 25,27, 42. Sea n el nmero.
(n = 8 or n=32 or n=13 or n=25 or n=27 or n=42)
6. Formas de representar una negacin lgica:
Not True = False
7. La expresin "NO a es igual a b" not(a) =b
Es verdadera si a es distinto de b, y es falsa si a es igual a b.
8. La expresin " NO a es menor que b not(a) < b
Es falsa si (a<b) es verdadero, y es verdadera si la comparacin es falsa.
Por tanto, el operador NOT actuando sobre (a<b) es equivalente a (a>=b)
3.1.1 If...Then
Use la estructura If...Then para ejecutar una o ms instrucciones basadas en una
expresin lgica. Puede utilizar la sintaxis de una lnea o un bloque de varias lneas:
Sintaxis 1:
If expresin lgica Then Sentencias
Sintaxis 2:
If expresin lgica Then
Sentencias
End If
Si condicin es True, Visual Basic ejecuta todas las sentencias que siguen a la
palabra clave Then.
Ejemplo 1
Utilizando If Then en una lnea
Sub elimina1()
Rem si la celda B2 contiene una u en su texto, eliminamos la fila 2
If Cells(2, 2) Like "*u*" Then Rows(2).Delete
End Sub
Ejemplo 2
Colocando las instrucciones debajo del then
Sub elimina2()
If Cells(2, 2) Like "*u*" Then
Rows(2).Delete
End If
End Sub
3.1.2 If...Then...Else
Utilice un bloque IF...THEN...ELSE para definir dos bloques de sentencias, uno de
los cuales se ejecutar. VBA evala primero la expresin lgica
Si es verdadero ejecuta el bloque de cdigo que sigue a Then.
Si es falso ejecuta el bloque de cdigo que sigue a Else.
Sintaxis:
If expresin lgica Then
Instrucciones 1
Else
Instrucciones 2
End If
Ejemplo.
Calcular el impuesto por 4ta. Categora
3.1.3 If...Then...ElseIF
Utilice un bloque If...The...Else para definir varios bloques de sentencias, uno de los
cuales se ejecutar:
Sintaxis:
If expresin lgica1 Then
[bloque de sentencias 1]
[ElseIf expresin lgica2 Then
[bloque de sentencias 2]] ...
[Else
[bloque de sentencias n]]
End If
Visual Basic evala primero la expresin lgica1. Si es False, Visual Basic procede
a evaluar la expresin lgica2 y as sucesivamente, hasta que encuentre una
condicin True.
Cuando encuentra una condicin True, Visual Basic ejecuta el bloque de
instrucciones correspondientes y despus ejecuta el cdigo que sigue a End If.
Opcionalmente, puede incluir un bloque de instrucciones Else, que Visual Basic
ejecutar sin ninguna de las condiciones es True.
Nota.
El evento KeyPress ocurre cuando presiona:
Un carcter del teclado
La tecla CTRL en combinacin con una tecla alfabtica
La tecla CTRL en combinacin con un carcter especial
BACKSPACE.
ESC.
El evento KeyPress no ocurre cuando presiona:
TAB.
ENTER.
Teclas flechas
Ejemplo
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger,
ByVal Shift As Integer)
If KeyCode = 13 Then
If TextBox1 = "ALFA" Then
MsgBox ("Bienvenido al sistema")
Else
MsgBox ("Clave errada")
End If
End If
End Sub
Sintaxis
Select Case expresin_prueba
Case lista_expresion-n
instrucciones-n...
Case Else
instrucciones_else
End Select
Donde:
Expresin_prueba . Expresin numrica o expresin de cadena.
Lista_expresin-n . Lista delimitada por comas de una o ms de las formas
siguientes: expresin, expresin To expresin, Is operador_de_comparacin
expresin.
Instrucciones-n. Una o ms instrucciones
Instrucciones_else. Instrucciones que se ejecuten si expresin_prueba no coincide
con ninguna de las clusulas Case.
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
Sub Anidamiento ()
If ActiveSheet.Range("D1").Value = ActiveSheet.Range("E1").Value Then
ActiveSheet.Range("D4").Value = "Los Valores de D1 y E1 son iguales"
Else
If ActiveSheet.Range("D1").Value > ActiveSheet.Range("E1").Value Then
ActiveSheet.Range("D4").Value = "D1 es mayor que E1"
Else
ActiveSheet.Range("D4").Value = "E1 es mayor que D1"
End If
End If
End Sub
Sub SelectCase()
A1 = Range("E1").Value
Select Case Range("D1").Value
Case Is = A1
ActiveSheet.Range("D4").Value = "Los Valores de D1 y E1 son iguales"
Case Is > A1
ActiveSheet.Range("D4").Value = "D1 es mayor que E1"
Case Is < A1
ActiveSheet.Range("D4").Value = "E1 es mayor que D1"
End Select
End Sub
4. Introducir en una celda la nota de un alumno y en otra una leyenda que diga
si esta aplazado, aprobado y en caso de estar aprobado si su nota fue buena,
muy buena, distinguida o sobresaliente, teniendo en cuenta que:
Aplazado= 1, 2, 3
Aprobado= 4,5
Bueno= 6,7
Muy bueno= 8
Elaborado por: Dennis Pichilingue R Pgina: 29
Ms. Excel VBA - Nivel II
Distinguido= 9
Sobresaliente= 10
Sub SelectCase()
a = Range("A2").Value
Select Case a
Case 1 To 3
ActiveSheet.Range("B2").Value = "APLAZADO"
Range("E1").Select
Case 4 To 5
ActiveSheet.Range("B2").Value = "APROBADO"
Range("E1").Select
Case 6 To 7
ActiveSheet.Range("B2").Value = "BUENO"
Range("E1").Select
Case 8
ActiveSheet.Range("B2").Value = "MUY BUENO"
Range("E1").Select
Case 9
ActiveSheet.Range("B2").Value = "DISTINGUIDO"
Range("E1").Select
Case 10
ActiveSheet.Range("B2").Value = "SOBRESALIENTE"
Range("E1").Select
End Select
End Sub
Sub Titulo ()
Worksheets("Hoja2").Range("A1").Select
Selection.ColumnWidth = 50
Selection.RowHeight = 20
Selection.Font.Bold = True
Selection.Size = 20
Selection.Font.ColorIndex = 3
Selection.HorizontalAlignment = xlCenter
End Sub
El siguiente ejemplo realiza lo mismo que el caso anterior e ilustra el uso de la
instruccin With para asignar valores a varias propiedades del mismo objeto.
Sub Titulo ()
Range("A1").Select
With Selection
.ColumnWidth = 50
.RowHeight = 20
.Font.Bold = True
.Size = 20
.Font.ColorIndex = 3
.HorizontalAlignment = xlCenter
End With
End Sub
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
b. For...Next
Repite un grupo de instrucciones un nmero especfico de veces. Se pueden anidar
bucles For...Next, colocando un bucle For...Next dentro de otro.
Sintaxis
For contador = inicio To fin Step incremento
Instrucciones
Exit For
Instrucciones
Next contador
Donde:
Contador. Variable numrica que se utiliza como contador de bucle.
Inicio. Valor inicial del contador.
Fin. Valor final del contador.
Incremento. Cantidad en la que cambia el contador cada vez que se ejecuta el bucle.
Si no se especifica, el valor predeterminado de incremento es uno.
Exit for. Sale del ciclo repetitive for .. next.
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
c. Do...Loop
Repite un bloque de instrucciones cuando una condicin es Verdadera o hasta que
una condicin se convierta en Falsa. Utilice instrucciones Exit Do para salir de este
ciclo repetitivo, la instruccin Exit Do transfiere el control a la instruccin que sigue
inmediatamente a la instruccin Loop.
Cuando se utiliza con instrucciones anidadas DoLoop, la instruccin Exit Do
transfiere control al bucle que est anidado un nivel por encima del bucle donde
ocurre.
Sintaxis 1 Sintaxis 2
Do While | Until condicin Do
instrucciones instrucciones
Exit Do Exit Do
instrucciones instrucciones
Loop Loop While | Until condici
Donde:
Condicin. Expresin numrica o expresin de cadena que es Verdadera o Falsa. Si
la condicin es Null, la condicin se considera Falsa.
Instrucciones. Una o ms instrucciones que se repiten mientras (While) o hasta que
(Until) la condicin sea Verdadera
Sub WhileInicial()
Contador = 0
Nota = Range("D4")
Do While Nota < 10
Nota = Nota + 1
Contador = contador + 1
Loop
MsgBox "El bucle se ha repetido " & Contador & " veces."
End Sub
Sub WhileFinal()
Contador = 0
Nota = Range("D4")
Do
Nota = Nota + 1
Contador = contador + 1
Loop While Nota < 10
MsgBox "El bucle se ha repetido " & Contador & " veces."
End Su
Pgina: 34 Elaborado por: Dennis Pichilingue R
Ms. Excel VBA - Nivel II
Sub UntilInicial()
Contador = 0
Nota = Range("D4")
Do Until Nota = 10
Nota = Nota + 1
Contador = Contador + 1
Loop
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
d. For Each...Next
Repite un grupo de instrucciones para cada elemento de una matriz o coleccin. 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.
Puede anidar bucles For Each...Next, colocando un bucle For Each...Next dentro de
otro. Sin embargo, cada elemento del bucle debe ser nico.
Sintaxis
For Each elemento In grupo
instrucciones
Exit For
instrucciones
Next elemento
Donde:
Elemento. Variable (Variant, object) que se utiliza para iterar por los elementos del
conjunto o matriz.
Grupo. Nombre de un conjunto de objetos o de una matriz.
Instrucciones. Una o ms instrucciones que se ejecutan para cada elemento de un
grupo.
Sub a()
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
Este otro ejemplo agrega tantas hojas nuevas al libro activo como textos hay en el
rango B1:B5, y a continuacin nombra a estas hojas con los textos que va encontrando.
Sub CreaHojas()
For Each Nombre In Range("B1:B5")
If Nombre <> Empty Then
Set NewSheet = Worksheets.Add
NewSheet.Name = Nombre
End If
Next
End Sub
Este ltimo ejemplo muestra el nombre de cada una de las hojas de clculo del libro
activo.
Sub VerHojas()
For Each Hoja In Worksheets
MsgBox Hoja.Name
Next
End Sub
Sub EncuentraTexto()
For Each Celda In Range("C3:C30")
If Not IsNumeric(Celda) Then
Celda.Select
MsgBox "El objeto contiene un valor no numrico."
Exit For
End If
Next
End Sub
1.
1. Sumar un rango de nmeros
Sub SumaColumna()
Range("D1").Select
Sum = Range("D1")
Do While ActiveCell.Value <> ""
ActiveCell.Offset(1, 0).Select
Sum = Sum + ActiveCell.Value
Loop
ActiveCell.Value = Sum
MsgBox Sum
End Sub
2. Mostrar el nombre UNI en diagonal
Sub Macro1()
Dim a As Integer
Dim j As Integer
Hoja1.Cells(1, 1) = "UNI"
For a = 2 To 8
For b = 1 To a
If ((a + b) Mod 2) = 0 Then
Hoja1.Cells(a, b) = Hoja1.Cells(1, 1)
End If
Next
Next
End Sub
Errologin:
MsgBox Acceso denegado. Solo Juliano Corinto tiene permiso para acceder.
End Sub
3.6 Call
Call en VBA nos permite invocar la macro desde otro procedimiento (Sub o
Function) como si fuera un procedimiento cualquiera.
Al utilizar Call para llamar a tal procedimiento requerir que los argumentos estn
encerrados en parntesis, si este procedimiento no tuviera argumentos no se
colocaran.
Ejemplo del modo de uso, tenemos dos procedimientos diferentes pero que
cumplen la misma funcin, Proc1 uno no recibe parmetros mientras que Proc2 si
recibe parmetros.
Sub Proc1()
MsgBox Hola mundo
End Sub
Sub Proc2(mensaje As String)
MsgBox mensaje
End Sub
Sub principal1()
Call Proc1
End Sub
3. Nombres de rango
5. Programa
Sub limpiar()
Range("b11").Select
a=0
While ActiveCell <> ""
ActiveCell.Offset(1, 0).Select
a=a+1
If a > 5 Then
MsgBox "ya no puede agregar mas datos"
Range("registro").ClearContents
End If
Wend
cmbid.SetFocus
End Sub
4. Manejo de archivos
Mtodo GetOpenFilename
El mtodo GetOpenFilename permite simplificar el acceso a archivos, lo que garantiza
que el nombre y la ruta del archivo estn correctos.
Abre el cuadro de dilogo Abrir y retorna una secuencia de caracteres el nombre del
archivo que el usuario selecciona
Sintaxis:
Application.GetOpenFilename
Mtodo GetSaveAsFilename
Abre un cuadro de dilogo igual al cuadro de Guardar como de Excel y obtiene el
nombre de ruta del archivo pero sin que se realice cualquier accin con estas
informaciones.
Sintaxis:
object.GetSaveAsFilename ( [initialFilename], [fileFilter], [filterIndex], [title],
[buttonText] )
Donde:
InitialFilename: Este argumento determina cul ser el nombre patrn que se muestra
en el cuadro antes que el usuario seleccione otro archivo;
FileFilter: Con este argumento podemos determinar qu tipos de archivos se
encontrarn disponibles en el cuadro de dilogo para que el usuario seleccione;
Title: Este argumento determina el texto que se va a mostrar en la barra de ttulos del
cuadro de dilogo.
Ejemplo: Mostrar la ruta y nombre del archivo en un cuadro de dilogo:
MsgBox Application.GetSaveAsFilename
Utiliza el mandato For eachnext para recorrer por los libros abiertos y verificar si un
cierto archivo ya ha sido abierto anteriormente. Si no es as, abre el archivo, sino, activa
la ventana del archivo ya existente en la memoria.
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
NoHay:
MsgBox ("El archivo " & Archivo & " no existe en la carpeta actual")
End Sub
Mdulo1.
General Declaraciones
Private Caminho As String
Private NomeArq As String
Private CamiArq As String
Private Arq As String
Private App As Application
Sub Importa_Archivo_de_Texto()
'Importa un archivo de texto e inserta una hoja de clculo despus de la primera para
recibir los datos
Set App = Application 'Define el objeto application
Do Until n = 1
Sheets(n).Delete
n=n-1
Loop
On Error Resume Next
FileSystemObject
El objeto FileSystemObject, habilita el acceso al sistema de todos los archivos de nuestros
PC.
Name: Esta propiedad cambia el nombre del archivo. Es una propiedad de solo
lectura.
ActiveCell = ActiveWorkbook.Name
NombreTot = Workbooks(Datos.xlsx).FullName
NombreTot = Activeworkbook.Fullname
Saved: Para los archivos guardados, esta propiedad devuelve el valor True;
para los archivos que no estuviesen guardados, les da el valor False.
Workbooks.Open Filename:=C:\documentos\RelMensal.xlsx
Protect: Se usa este mtodo para proteger el libro de trabajo y tiene una
funcin igual al comando Herramientas / Proteger / Proteger el libro de trabajo. La
sintaxis para ese mtodo es la siguiente:
Protect(Password,Structure,Windows)
Unprotect(Password)
Ejemplo:
Workbooks(prueba1.xlsx).Unprotect 123Contrasea
Propiedades de la hoja
A continuacin, se presentan las propiedades de Worksheets
Worksheets.Count
Ejemplo:
Msgbox El archivo tiene & sheets.count & hoja(s)
WorkSheets(Plan1).ScrollArea = A1:L11
Para liberar la navegacin en todas las celdas de la hoja, solo es necesario digitar
el comando siguiente:
WorkSheets(Plan1).ScrollArea =
Worksheets(Plan1).EnableSelection = xlNoSelection
Mtodos de la hoja
A continuacin, se describen los mtodos del objeto Worksheets:
Add(Before,After,Count,Type)
Add: Por medio de este mtodo, se puede aadir hojas de clculo, macro de
Excel 4.0 o un grfico a un libro de trabajo. Su sintaxis se muestra a continuacin
y, luego se encuentra la descripcin de cada uno de sus elementos:
Before: Hoja antes de que se inserte la nueva;
After: Hoja despus de que se inserte la nueva;
Count: Cantidad de hojas que se insertarn;
Type: Tipo de la hoja que se insertar. Se puede usar el tipo xlWordSheet, que
corresponde a la planilla predeterminada, o xlExcel4MacroSheet, que corresponde
a la hoja de macro de Excel 4.0
En el siguiente ejemplo, se insertan dos hojas luego de la ltima hoja del libro de
trabajo:
Sheets.Add , Sheets(Sheets.Count)
Delete: Este mtodo no incluye las hojas del cuaderno de trabajo. La hoja que
se excluir puede indicarse por su nombre o por la posicin que ocupa en el
archivo. El ejemplo siguiente excluye la quinta hoja del archivo:
Sheets(4).Delete
Copy: Este mtodo copia una hoja a otra ubicacin en el archivo. La sintaxis
de este mtodo es la siguiente:
Copy(After,Before)
Move: Este mtodo mueve la hoja a otra ubicacin del archivo. Su sintaxis es
la siguiente:
Move(Before,After)
Select: Para seleccionar una hoja, se debe usar este mtodo. La lnea siguiente
puede usarse para seleccionar la hoja Plan1:
Sheets(Plan1).Select
Protect: Este mtodo se utiliza para proteger la hoja y tiene una funcin igual
al comando de proteccin de hoja pero con un cuarto argumento. La sintaxis de
este mtodo es la siguiente:
Protect(Password,DrawingObjects,Contents,Scenarios,UserInter
Argumento Descripcin
Password Opcional.
DrawingObjects True o False: Se usa para proteger las formas (el valor
predeterminado es true).
Contents True o False: Se usa para proteger el contenido
(el valor predeterminado es true).
Scenarios True o False: Se usa para proteger escenarios (el valor
predeterminado es true).
Se usa para proteger la interface del usuario, sin
Sheets(Hoja2).Protect 1234
Sheets(Hoja1).Unprotect contrasea
Range(A2).Value = Range(C3).Column
Range(A3).Name = Precios
Range(A5).Select
Copy: El mtodo Copy copia las celdas, y el lugar donde quedar la copia
cambia segn la sintaxis. Para hacer una copia al clipboard, se debe usar la
siguiente sintaxis:
Copy
Range(a2:c4).copy
Cut: Este mtodo recorta celdas. El lugar donde se ubican las celdas recortadas
depende de la sintaxis usada. El ejemplo siguiente recorta las celdas B2:E14 y las
pega en G7:
Clear: Este mtodo equivale al comando Limpiar / Limpiar todo, es decir, limpia
todo lo que hay en las celdas. El ejemplo siguiente limpia el contenido de las celdas
presentes en el intervalo B2:B20:
Range(B2:B20).Clear
Range(B2:B20).ClearContents
Range(c2:c4).ClearFormats
Delete: Este mtodo es usado para eliminar las celdas de la hoja. En su sintaxis,
mostrada a continuacin, el argumento Shift no es obligatorio y sirve para definir
el lugar donde se movern las celdas; si se quiere para la izquierda, se debe usar
xlShiftToLeft, y si es para arriba, xlShiftUp:
Delete(Shift)
El ejemplo a continuacin elimina las celdas contenidas en el intervalo y desplaza
las dems hacia la izquierda:
Range(c2:c4).Delete xlToLeft
6. Programa
Pgina: 60 Elaborado por: Dennis Pichilingue R
Ms. Excel VBA - Nivel II
Sheets(2).Select
Range("a4").Select
While ActiveCell <> ""
ActiveCell.Offset(1, 0).Select
Wend
ActiveCell = txtFecha.Text
ActiveCell.Offset(0, 1) = cmbProducto.Text
ActiveCell.Offset(0, 2) = txtCodigo.Text
ActiveCell = txtFecha.Text
ActiveCell.Offset(0, 1) = cmbProducto.Text
ActiveCell.Offset(0, 2) = txtCodigo.Text
If OptSalida.Value = True Then
ActiveCell.Offset(0, 3) = Val(txtPrecioTotal.Text)
End If
End If
MsgBox "Listo"
cmbProducto = ""
txtCodigo = ""
txtDescripcion.Text = ""
txtPrecioUnitario.Text = ""
txtStock = ""
txtCantidad = ""
Foto.Picture = Nothing
Pgina: 62 Elaborado por: Dennis Pichilingue R
Ms. Excel VBA - Nivel II
optIngreso.Value = False
OptSalida.Value = False
txtPrecioTotal = ""
txtStockFinal = ""
End If
End Sub
8. Arreglos unidimensionales
Es un conjunto finito de elementos del mismo tipo, que tienen un mismo nombre. El
nombre va acompaado de un ndice que indica el nmero de orden del elemento
dentro del arreglo.
X(1), X(2), X(3), X(4) X(n) que son las referencias a los elementos del arreglo.
Grficamente se representa, como se muestra en la grfica
Ejemplo Grfico
Valores
ndices del almacenados
vector X en el vector X
Nombre de la variable
Donde
Nombre: Es el nombre del arreglo
Dimensin: Define el nmero de elementos del arreglo
TipodeDato: Define el tipo de dato: Integer, string, date, etc.
Ejemplo:
Dim sueldo(10) as single
Dim apellidos(10) as string
Tambin puede declarar
Dnde:
Li. Es el lmite inferior del arreglo
Ls. Es el lmite superior del arreglo
Si no define el lmite inferior del arreglo por defecto es cero.
Ejemplo:
Dim sueldo (0 to 10) as single
Dim apellidos(0 to 10) as string
Ejemplo:
Declara un arreglo X de 11 elementos tipo entero:
Dim X (10) As Integer
El tipo de dato para todos los elementos del arreglo es entero. Grficamente se
muestra como sigue:
Ejemplo:
Declara un arreglo Z de 5 elementos tipo texto, denotados como:
Dim Z(1 to 5) as string
El tipo de dato para todos los elementos del arreglo es cadena. Grficamente se
muestra como sigue:
Ejemplo:
Declara un arreglo A de 5 elementos tipo texto, denotados como:
Dim A(4 to 8) as string
El tipo de dato para todos los elementos del arreglo es cadena. Grficamente se
muestra como sigue:
8.3.1 Asignacin.-
Asigna el valor de 25 al elemento 10 del array A
Ejm1: A(10) = 25
8.3.2 Lectura/Escritura
Lectura/Escritura. Permite dar o mostrar los valores de un array
Acumula los valores de un array en una Imprime los valores de un array en el
variable formulario
i=0
Do While i < 6
b = b + a(i) 'Acumula los elementos del array en la variable b
i=i+1
Loop
TextBox1 = b
End Sub
Private Sub RecorridoConForNext_Click()
Dim a(5) As Integer 'Declara un array con 6 elementos
ListBox2.Clear 'Limpia el list2
For j = 0 To 5
a(j) = Int(Rnd * 5) + 2 'Carga el array con valores aleatorios entre 2 y 7
ListBox2.AddItem a(j) 'Agrega el array como elemento del control list2
Next
Pgina: 68 Elaborado por: Dennis Pichilingue R
Ms. Excel VBA - Nivel II
For i = 0 To 5
b = b + a(i) 'Acumula los elementos del array en la variable b
Next
TextBox2 = b
End Sub
For j = 0 To 5
a(j) = Int(Rnd * 5) + 2 'carga el array con valores aleatorios entre 2 y 7
Next
For i = 0 To 5
'Sumar los elementos de dos arrays A y B para obtener un tercer array
ss(i) = a(i) * a(i) * 2
ListBox3.AddItem ss(i)
d = d + ss(i) 'Acumula los elementos del 3er. array en la variable d
Next
TextBox3 = d
End Sub
Insercin
La insercin al final del array es sencilla si el espacio de memoria reservado por el
ARRAY es mayor que el utilizado hasta el momento. Pero si es a la mitad del Array
entonces la mitad deber desplazarse hacia abajo para colocar el nuevo elemento y
que los dems conserven el orden relativo entre ellos
ListBox2.Clear
For i = LBound(a) To UBound(a)
'Lbound(a) devuelve el indice menor del arreglo
'ubound(a) devuelve el indice mayo del arreglo
ListBox2.AddItem a(i)
Next
End Sub
Borrado
Para borrar un elemento de un array debe especificar el ndice del elemento a
eliminar.
General declaraciones
Dim a() As Integer 'Arreglo dinamico No. +/-
Private Sub cmdcargaarreglo_Click()
ListBox1.Clear 'Limpia el list1
Dim j As Integer
j = 0 'incializar la variable j
ReDim a(5) 'Redimensionar el arreglo con 6 elementos
Do While j < 6 'Hacer mientras j sea menor que 6
a(j) = Int(Rnd * 5) + 2 'Carga el array con valores aleatorios entre 2 y 7
ListBox1.AddItem a(j) 'Agrega el array como elemento del control list1
j = j + 1 'Contador
Loop
End Sub
Private Sub cmdeliminar_Click()
For i = Val(txtposeliminacion) - 1 To UBound(a) - 1
a(i) = a(i + 1) 'Posicion actual es reemplazada por posicion siguiente
Next
ReDim Preserve a(UBound(a) - 1) 'Redimensiona array
'a(UBound(a) - 1) elimina un elemento del arreglo
ListBox2.Clear
For i = LBound(a) To UBound(a) 'Carga el nuevo array
ListBox2.AddItem a(i)
Next
End Sub
Ordenacin
Organizacin de los elementos de la lista de acuerdo con algn tipo de orden. Ejm.
ordenar de mayor a menor, en orden alfabtico, etc.
Este proceso permite ordenar un conjunto de objetos en un orden especfico. Esto
se hace por lo general para facilitar la bsqueda de los elementos del array. As se
clasifica en: los diccionarios, agendas telefnicas, en los casilleros de bibliotecas,
relacin de amigos, etc.
ListBox2.Clear
For i = LBound(a) To UBound(a)
ListBox2.AddItem a(i)
resultado = resultado + a(i)
Next
TextBox2 = resultado
End Sub
Matenimiento de pasajeros
1. Diseo de la hoja
2. Nombres de rango
Programa
Sub limpiar()
For Each ctrl In Me.Controls 'Recorre los controles
If TypeOf ctrl Is TextBox Then ctrl.Text = ""
Next
foto.Picture = Nothing 'Limpia la foto
End Sub
End Sub
Programa
If cmbhora.ListIndex = -1 Then
MsgBox "Debe ingresar la hora que se realizara el vuelo"
cmbhora.SetFocus
Exit Sub
End If
Rpta = MsgBox("Esta seguro de Registrar al Viajero", vbYesNo + vbQuestion)
If Rpta = vbNo Then Exit Sub
Sheets("Hoja1").Select 'cambia a la pagina de orden de compra
Range("A3").Select
i=0
While ActiveCell <> "" 'hacer mientras la celda activa tenga datos
ActiveCell.Offset(1, 0).Select 'se desplaza una fila hacia abajo
Wend
ActiveCell.Offset(0, 1) = txtnombre
ActiveCell.Offset(0, 2) = txtapepat
ActiveCell.Offset(0, 3) = txtapemat
ActiveCell.Offset(0, 4) = txtdni
ActiveCell.Offset(0, 5) = cmbdestino
ActiveCell.Offset(0, 6) = cmbdia
ActiveCell.Offset(0, 7) = cmbhora
End Sub
Private Sub CommandButton1_Click()
Unload Me
End Sub
Private Sub UserForm_Initialize()
Range("A3").Select
i=0
While ActiveCell <> "" 'hacer mientras la celda activa tenga datos
ActiveCell.Offset(1, 0).Select 'se desplaza una fila hacia abajo
i=i+1
Wend
txtnumero = i
txtfecha.Text = Date
cmbdestino.RowSource = "destinos"
cmbdia.RowSource = "dia"
cmbhora.RowSource = "hora"
End Sub
Dim Y ( 0 to 1, 0 to 2) as string
Donde:
Columnas
0 1 2
Fila 0
s 1
Arreglos multidimensionales
Podemos definir matrices de dimensin superior a dos. Podemos llegar a un mximo
de 60 dimensiones. Una matriz de 5 dimensiones se declarara:
Dim Variable ( 1 To N, 1 To M, 1 To P, 1 To Q, 1 To R)
Nuestro trabajo consistir en pasar los datos de un rango de celdas a una matriz,
para luego emplear los elementos de esa matriz como parte de un ComboBox
Lo primero que haremos ser incrustar un Cuadro combinado (control ActiveX) en
nuestra 'Hoja1', lo que haremos desde la Ficha Programador, Controles, Insertar
controles, Controles ActiveX, Cuadro combinado:
Programa
Private Sub ComboBox1_gotfocus()
Dim clientes As Long
'cuenta el nmero de elementos en la Hoja1
clientes = Sheets("Hoja1").Range(Range("A2"), Range("A2").End(xlDown)).Rows.C
ount
'Definimos una Matriz sin dimensiones determinadas
Dim MyArray() As Variant
'Sabiendo el nmero de elementos a incluir, redimensionamos nuestra
Matriz
ReDim MyArray(1 To clientes) As Variant
On Error Resume Next 'En caso de error, que contine
ComboBox1.Clear 'limpiamos el ComboBox
'aadimos cada valor del rango definido de la Hoja1 como elemento de la Matriz
For i = 1 To clientes
MyArray(i) = Worksheets("Hoja1").Cells(i + 1, 1).Value
'inclumos cada elemento de la Matriz dentro del Cuadro combinado
ComboBox1.AddItem MyArray(i)
Next i
End Sub
11. El formulario
Se utiliza para disear su aplicacin. Los formularios Excel tienen una gran
variedad de controles, los cuales tienen una variedad de propiedades, funciones
y eventos.
Por defecto los UserForm tienen nombres como UserForm1, UserForm2, etc.. Para
poderlo identificar ms fcilmente podemos cambiarle el nombre en la ventana de
propiedades del UserForm, en concreto en la propiedad Name
Top
Caption
Left
Height
Width
Estableciendo Propiedades
Al disear la interfase de usuario de una aplicacin Visual Basic For Excel, se deben
establecer la propiedades para los controles (objetos) creados.
Objeto Procedimiento
Private Sub CommandButton1_Click()
MsgBox "Bienvenidos
End Sub
Comentarios
El aadir documentacin y comentarios a su cdigo permite comprender mejor lo que
hace el cdigo. Un comentario se inicia con el carcter apstrofe () o la palabra
reservada REM, de modo que todo el texto que contine a este carcter ser
ignorado en la ejecucin de la aplicacin. Veamos el siguiente ejemplo:
Sub CierraLibro()
Libro(1).Close
End Sub
El siguiente procedimiento utiliza un nombre especificado como cadena para
identificar un objeto Form.
Sub CierraForm()
Forms("MiForm.frm").Close
End Sub
Tambin es posible operar al mismo tiempo sobre toda una coleccin de objetos
siempre que los objetos compartan mtodos comunes. Por ejemplo, el siguiente
procedimiento cierra todos los formularios abiertos.
Sub CierraTodos()
Forms.Close
End Sub
Ejercicio de aplicacin
Preparando el Formulario
1. Quitarle las referencias de filas y columnas tradicionales de Excel para
ello tenemos que desactivar los ttulos de la hoja como se muestra en el men
Vista
ActiveWindow.DisplayHeadings = False
2. Quitar la barra de pestaa inferior donde aparece el nombre de todas las hojas
de clculo que nos permite navegar es decir donde estn todas las hojas
abiertas:
ActiveWindow.DisplayWorkbookTabs = False
Controles Bsicos
Con los controles, los usuarios pueden operar y obtener los resultados de una
aplicacin. Puede aadir controles a un formulario seleccionando la herramienta
adecuada del Cuadro de Herramientas. Entre los controles ms comunes a utilizar
en una aplicacin tenemos: Etiqueta (Label), Cuadro de Texto (TextBox) y Botn de
Comando (CommandButton).
Propiedades
AutoSize True/False. Determina si el tamao del control se ajusta
automticamente al texto que contiene.
Caption Texto que muestra el control.
Name Nombre del control.
Font Establece la fuente, estilo y tamao para el texto del control.
Forecolor Color de letra
Backcolor Color de fondo
Eventos
Change Ocurre cuando cambia el texto que contiene el control.
KeyDown Ocurre cuando el usuario presiona una tecla
Keypress Ocurre cuando el usuario escribe
Mtodos
SetFocus Mueve el enfoque al control.
Eventos
Click Ocurre cuando se hace clic sobre el botn.
Mtodos
SetFocus Mueve el enfoque al botn.
Image1.Top = Image1.Top - 10
End If
If KeyCode = vbKeyDown Then
Image1.Top = Image1.Top + 10
End If
If KeyCode = vbKeyLeft Then
Image1.Left = Image1.Left - 10
End If
If KeyCode = vbKeyRight Then
Image1.Left = Image1.Left + 10
End If
End Sub
Propiedades
Caption Ttulo de marco.
Enabled Determina si est habilitado para responder a las acciones del usuario.
Name Nombre del control.
Visible Determina si el Marco y los controles que
contiene estn visibles o no.
Ejemplo 1: Desactiva los controles de un frame
c. Pseudocodigo.
Seleccionar desde los controles CheckBox, los perifricos a adquirir
Utilizar el condicional simple If .. Then, para calcular precio
d. Programa
Private Sub Command1_Click()
Dim Costo_Impr as single
Dim Costo_Scan as single
Dim Costo_Esta as single
Costo_Impr = 0
Costo_Scan = 0
Costo_Esta = 0
If Check1.Value = 1 Then
Costo_Impr = 250
End If
If Check2.Value = 1 Then
Costo_Scan = 180
End If
If Check3.Value = 1 Then
Costo_Esta = 60
End If
Total = Val(Costo_Impr) + Val(Costo_Scan) + Val(Costo_Esta)
Text1.Text = Total
End Sub
Form Load
Text1.Text = ""
End Sub
Option1 Click
If OptionButton1.Value = True Then
Text1.Text = 5000
OptionButton5.SetFocus
End If
End Sub
Option2 Click
If OptionButton2.Value = True Then
Text1.Text = 3000
OptionButton5.SetFocus
End If
Option3 Click
If OptionButton3.Value = True Then
Text1.Text = 2000
OptionButton5.SetFocus
End If
Option4 Click
If OptionButton4.Value = True Then
Text1.Text = 1000
OptionButton5.SetFocus
End If
Option5 Click
If Option5.Value = True Then
Text2.Text = "Local principal Carlos Castro la Rosa"
OptionButton5.SetFocus
End If
Option7 Click
If OptionButton7.Value = True Then
Text2.Text = "Sucursal de Miraflores Yuri Fitzerald Picklinc"
OptionButton7.SetFocus
End If
Option8 Click
If Option8.Value = True Then
Text2.Text = "Sucursal de Surco Iris Calderon Vasquez"
CommandButton1.SetFocus
End If
With lst_calorias
.ColumnCount = 3
.ColumnHeads = True
.ColumnWidths = "100;10"
.RowSource = "Hoja2!A4:B16"
.ListStyle = fmListStyleOption
End With
End Sub
Ejemplo 7: Elimina el elemento seleccionado cuando presiona la tecla Supr.
Private Sub ListBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal
Shift As Integer)
If KeyCode = 46 Then
ListBox1.RemoveItem ListBox1.ListIndex
End If
End Sub
RowSource Hoja1!A2:C5
lbl_tipo
Opt_calientes
Opt_frios
Multiselect:
Extendido
ListBox2.ListIndex = saveIndex
ListBox2.Visible = True
End Sub
2. Programa
General Declaraciones
Private Ruta
Private Sub Cerrar_Click()
Unload Me
End Sub
Private Sub UserForm_Initialize()
Ruta = ActiveWorkbook.Path
MultiPage1.Value = 0
Sexo.AddItem "Masculino"
Sexo.AddItem "Femenino"
Id = Application.WorksheetFunction.Max(Range("id"))
Boton.Max = Id
Boton = Id
End Sub
Private Sub Boton_Change()
Id = Boton
End Sub
Private Sub Nuevo_Click()
Id = Application.WorksheetFunction.Max(Range("id")) + 1
Boton.Max = Id
Boton = Id
MultiPage1.Value = 0
codigoalumno = ""
Nombres = ""
Apellidos = ""
Edad = ""
Sexo = ""
Direccion = ""
Celular = ""
Email = ""
ciclo = ""
Cargo = ""
foto.Picture = Nothing
Nombres.SetFocus
On Error Resume Next
Kill Ruta & "\Foto.tmp"
End Sub
Private Sub id_Change()
Range("A3").Select
While ActiveCell <> Empty
If ActiveCell = Val(Id) Then
codigoalumno = ActiveCell.Offset(0, 1)
Nombres = ActiveCell.Offset(0, 2)
Apellidos = ActiveCell.Offset(0, 3)
Edad = ActiveCell.Offset(0, 4)
Sexo = ActiveCell.Offset(0, 5)
Direccion = ActiveCell.Offset(0, 6)
Celular = ActiveCell.Offset(0, 7)
Email = ActiveCell.Offset(0, 8)
Cargo = ActiveCell.Offset(0, 9)
ciclo = ActiveCell.Offset(0, 10)
ActiveCell.Offset(0, 2) = Nombres
ActiveCell.Offset(0, 3) = Apellidos
If Val(Edad) > 0 Then ActiveCell.Offset(0, 4) = Val(Edad)
ActiveCell.Offset(0, 4).HorizontalAlignment = xlCenter
ActiveCell.Offset(0, 5) = Sexo
ActiveCell.Offset(0, 5).HorizontalAlignment = xlCenter
ActiveCell.Offset(0, 6) = Direccion
ActiveCell.Offset(0, 7) = Celular
ActiveCell.Offset(0, 8) = Email
ActiveCell.Offset(0, 9) = Cargo
ActiveCell.Offset(0, 10) = ciclo
On Error Resume Next
Kill Ruta & "\" & Id & ".jpg"
Name Ruta & "\Foto.tmp" As Ruta & "\" & Id & ".jpg"
Kill Ruta & "\Foto.tmp"
Id.SetFocus
End Sub
Creacin de un complemento
Para que las funciones creadas puedan utilizarse en los dems archivos, podemos
crear un archivo como complemento de Excel (.xlam), el cual tendr todas las
funciones. Luego, solo se debe vincular este complemento al aplicativo Excel.
Observemos el siguiente procedimiento:
1. En un archivo nuevo, insertar dentro de un mdulo de VBA, todas las funciones
con sus respectivos cdigos;
2. Guardar el archivo como Complemento de Excel (se crear un archivo con la
extensin .xlam).
Asistente de Funciones
Por medio del cdigo en VBA, se puede cambiar el nombre descriptivo de la funcin
y de sus respectivos argumentos, los cuales podrn aparecer en la ventana Asistente
de Funciones.
De acuerdo a lo descrito anteriormente las funciones creadas en VBA se encuentran,
como patrn, en la categora Definida por el Usuario. Sin embargo, podemos crear
una nueva categora dentro del asistente, dejando la funcin dentro de ella.
En el siguiente ejemplo, al ejecutarse la macro Configurar_Asistente(), se definir en
qu categora la funcin dgeneral() se ubicar dentro del Asistente de Funciones, as
como la descripcin de la macro y sus argumentos.
Por medio de la macro Configurar_Asistente(), se ejecuta la macro Reg_Funcin, que
tiene por objetivo cambiar las caractersticas en el Asistente de Funcin de acuerdo
a la versin de Excel, ya sea 2010 o versiones anteriores. Solamente en la versin
2010 podemos insertar texto independiente para cada argumento de la funcin, con
la utilizacin de la matriz insertada dentro del tem ArgumentDescriptions.
#End If
Else
cdigo patrn para versiones anteriores a 2010
Excel.Application.MacroOptions dgeneral, Empty,
Category:=Empty
End If
End Sub
Bloque #if...#else#endif
Esta estructura, que posee un comportamiento similar a la estructura condicional
If...Then... Else, se utiliza para compilar condicionalmente el cdigo VBA en
plataformas diferentes.
Ejemplo2.
Function area_hexagono(Lado, Apotema)
P = Lado * 6
A = (P * Apotema) / 2
area_hexagono = A
End Function
Ejemplo3.
Sub area_circulo()
r=3
Pi = 3.1416
MsgBox "El area del circulo de radio: " & r & _
" es: " & r * r * Pi
End Sub
Se tiene la function.
FUNCTION Area (byval B as integer, byval H as integer ) as single
Sentencias
END FUNCTION
Las celdas de memoria son diferentes para los argumentos formales y actuales.
De esta forma, las modificaciones que el mtodo pueda realizar sobre estos
argumentos se realizan efectivamente sobre los argumentos actuales. En este caso,
ambos argumentos (formal y actual) se pueden considerar como la misma variable con
dos nombres, uno en el mtodo llamante y otro en el llamado o invocado, pero hacen
referencia a la misma posicin de memoria.
Function DirectorioLibro()
DirectorioLibro = ActiveWorkbook.Path
End Function
If c = CaracterBuscado Then
n=n+1
End If
Next i
ContarCaracteres = n
End Function
Sintaxis.
SUB Nombre procedimiento( arg1 as tipo , arg2 as tipo , ... , argn as tipo)
Sentencias
Exit sub Permite salir del procedimiento
END SUB
Donde
arg1, arg2, ... , argn: Son los argumentos formales
Sintaxis
1era. Forma: NombreProcedimiento arg1, arg2, ... , argn
2da. Forma: Call NombreProcedimiento ( arg1, arg2, ... , argn)
Donde:
arg1, arg2, ... , argn: Son los argumentos actuales, deben ser del mismo tipo que
los argumentos formales.
Sub NombrePrimeraHoja()
'Nombre de la primera hoja de trabajo
MsgBox Worksheets(1).Name
End Sub
Sub tamaoletra()
'Tamao de letra
MsgBox Worksheets(1).Cells(1).Font.Size
End Sub
Sub CambiaTipoLetra()
' Cambiando el tipo de letra
Worksheets(1).Cells(1).Font.Name = "Georgia"
End Sub
Sub CambiarTipoLetra()
Range("A1").Font.Bold = True
End Sub
Sub ContarNumHojas()
'Contar el nmero de hojas de un libro de trabajo
Dim numHojas As Integer
numHojas = Application.Sheets.Count
MsgBox numHojas
End Sub
Elaborado por: Dennis Pichilingue R Pgina: 121
Ms. Excel VBA - Nivel II
Sub CambiaColorFondoCelda()
Dim i As Integer
For i = 1 To 11
If Cells(i, 1).Value = "Eva" Then
Cells(i, 1).Resize(1, 4).Interior.ColorIndex = 6 'Cambia color de la columna A a
la columna D
End If
Next i
End Sub
Sub CrearGrafico()
ActiveSheet.Shapes.AddChart.Select
ActiveChart.SetSourceData Source:=Range("A1:B4")
End Sub
Sub GraficoPastel()
ActiveSheet.Shapes.AddChart.Select
ActiveChart.SetSourceData Source:=Range("A1:B4")
ActiveChart.ChartType = xlPie
ActiveChart.SeriesCollection(1).Name = "Ventas por Categora"
End Sub
Sub CrearGrafica()
Dim Grafico As Chart
Dim RangoDatos As Range
' Crea una grfica con ayuda de la grabadora
Set RangoDatos = ActiveSheet.Range("A1:B5")
Set Grafico = Charts.Add
Grafico.SetSourceData Source:=RangoDatos
ActiveChart.ChartType = xlColumnClustered
End Sub
Sub FormulaDatos()
'Transforma la seleccin dada a valores
Dim Celda As Range
For Each Celda In Selection
If Celda.HasFormula Then
Celda.Formula = Celda.Value
End If
Next Celda
End Sub
Sub CambiarColor()
'Cambia el fondo de la celda si cumpla la condicin dada
Dim Celda As Range
For Each Celda In Range("Seleccion")
If Celda.Value >= 10 Then Celda.Interior.Color = RGB(153, 105, 120)
Next
End Sub
Sub CambiarColorCelda()
'Uso de un ciclo para cambiar el color de una celda que cumpla cierta condicin
Dim UltimaFila As Double
Dim i As Integer
Dim ColumnaObjetivo As Integer
ColumnaObjetivo = 1
UltimaFila = Cells(Rows.Count, ColumnaObjetivo).End(xlUp).Row
For i = 1 To UltimaFila
If Cells(i, ColumnaObjetivo) Like "*o*" Then
Cells(i, ColumnaObjetivo).Interior.ColorIndex = 4
End If
Next i
End Sub
Sub BorrarFilas()
'Uso de un ciclo para borrar filas que cumplan cierta condicin esta operacin es
irreversible
Dim UltimaFila As Double
Dim i As Integer
Dim ColumnaObjetivo As Integer
ColumnaObjetivo = 3
UltimaFila = Cells(Rows.Count, ColumnaObjetivo).End(xlUp).Row
For i = 1 To UltimaFila
If Cells(i, ColumnaObjetivo) Like "*o*" Then
Rows(i).Delete
End If
Next i
End Sub
Sub RegionActual()
' Selecciona regin actualCtrl+*
ActiveCell.CurrentRegion.Select
End Sub
Sub Seleccionar1()
'Seleeciona todas las celdas de la hoja activa
Cells.Select
End Sub
Sub Seleccionar2()
'Seleccionar la celda de la fila 2 y la columna 4
Cells(2, 4).Select
End Sub
Sub Seleccionar3()
'Seleccionar la celda 2
Cells(2).Select
End Sub
Sub seleccionar4()
'Selecciona la celda 2 y borra su contenido
Cells(2).ClearContents
End Sub
1. Hoja: Lista
2. Hoja Buscar
3. Hoja Tablas
4. Nombres de rango
Programa
Sub limpiar()
For Each ctrl In Me.Controls 'Recorre los controles
If TypeOf ctrl Is TextBox Then ctrl.Text = ""
Next
foto.Picture = Nothing 'Limpia la foto
End Sub
Programa
Sub VerListado()
Range("Lcriterios").ClearContents ' lo limpioo porq tengo q asegurarme par
ainiciar con un filtro nuevo
Range("Listado").ClearContents ' limpia lista de elementos que ya se abian
extarido manualmente
If Marca.Value <> "" Then Range("Marca") = Marca ' direccionando el
cmdmarca a la hoja BURCAR donde se realiza el proceso de filtrado
If Modelo.Value <> "" Then Range("Modelo") = Modelo ' direccionando el
cmdmarca a la hoja BURCAR donde se realiza el proceso de filtrado
If Ao <> "" Then ' si seleccion un ao
Range("ao") = Val(Ao) ' carga criterio ao. la funcion VAL convierte a
numero
End If
Range("Lista").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range( _
"Criterio"), CopyToRange:=Range("salida"), Unique:=False
' como deseo jalar una cuadro de datos para mostraele ene mi listbox y ese
cuadrto tiene como cantidad de datos diferentes
' por lo cual tengo a crear un algoritmo que me designe un nombre a esa lista
End If
ActiveCell.Select
Listado.RowSource = "Listado"
Sheets("lista").Select
End Sub
Para que una macro se ejecute automticamente al abrir una planilla de Excel basta
con que su nombre sea Auto_open.
Del mismo modo, para que se ejecute al cerrar una planilla, debe
llamarse Auto_close
Ejemplo
Insertar un mdulo
Para insertar un mdulo en Excel, primero debes acceder a la ventana del editor
de VBA. Recuerda que este paso ya lo vimos en un artculo anterior.
Eliminar un mdulo
Hacer clic derecho sobre el mdulo
Elegir Quitar mdulo
Ocultar un mdulo
Ingresa lo siguiente en el principio del mdulo: Option Private Module
Haz clic derecho en el nombre de tu proyecto VBA en el panel de
"Explorador de proyectos" y luego escoge "Propiedades de proyecto VBA"
desde el men de contexto.
Donde:
Ejemplo1:
Ejemplo2:
Ejemplo3:
Sub MuestraHora()
End Sub
Sub PararReloj()
End Sub
El mtodo OnTime permanece activo incluso si se cierra el libro para el que fue
desarrollado, lo que significa que cada 21 segundos, el libro se abrir
nuevamente, si el procedimiento Stopclock no se ha ejecutado. Se puede evitar
que esto ocurra utilizando el evento Workbook_BeforeClose con la siguiente
instruccin:
Ejemplo4:
Sub CellValueAutoIncr2()
eTime = Now + TimeValue("00:00:03")
Application.OnTime eTime, "CellValueAutoIncr2", , True
Cells(1, 1).Value = Cells(1, 1).Value + 5
count = count + 1
End If
End Sub
newHour = Hour(Now())
newMinute = Minute(Now())
newSecond = Second(Now()) + 10
waitTime = TimeSerial(newHour, newMinute, newSecond)
Application.Wait waitTime
Control de errores
Mediante cdigo puede vitar que se muestren los mensajes de error de Excel,
con el fin de prever y controlar los errores antes que se presenten.
Tipos de errores
Errores de lgica. Se produce, por ejemplo, cuando se digita el signo >= (mayor
o igual) en reemplazo del signo mayor que (>) para insertar una condicin en una
estructura condicional.
Ejemplo.
Sub ejemplo_error()
On Error GoTo Control
Dim edad As Byte
Edad = InputBox(Digite la edad) MsgBox La edad es & edad
Exit Sub
Control:
MsgBox Valor Invlido
End Sub
Ejemplo:
On Error GoTo 0
Si se utiliza esta sintaxis, cualquier controlador de error que est activo en el
procedimiento actual ser desactivado.
Ejemplo:
Sub ejemplo_error1()
On Error GoTo 0
Dim edad As Byte
edad = InputBox(Digite la edad) MsgBox La edad es & edad
Exit Sub
Control:
MsgBox Valor no vlido
End Sub
Las rutinas de control de errores son secciones identificadas con una etiqueta o
nmero de fila, y no un procedimiento Sub o Function. Estas identifican la causa
del error a travs del valor en la propiedad Number del objeto Err. Entonces,
guardan y verifican los valores relevantes, lo que se debe hacer antes que ocurra
otro error o de la ejecucin de un procedimiento que cause un error. Los valores de
propiedad en el objeto Err slo muestran el ltimo error que ha ocurrido. En
Err.Description se encuentra en el mensaje de error relacionado con Err.Number.
Para cada error que aparece mientras se ejecuta un procedimiento, hay un cdigo
correspondiente. La propiedad Number da la instruccin Err para identificar y
controlar los errores, as como la instruccin On Error.
Ejemplo
Sub cantidad()
On Error GoTo Controlar
Dim Cantidad As Byte
cantidad = InputBox(Digite la cantidad)
If ctdad < 10 Then
MsgBox inventario Insuficiente
End If
Exit Sub
Controlar:
If Err.Number = 6 Then
MsgBox Valor Excedido. Mximo = 255
ElseIf Err.Number = 13 Then
MsgBox Digite un valor numrico
End If
End Sub
Errores controlables
En algunas situaciones, es posible que tenga errores controlables. Estos se
producen durante la ejecucin de una aplicacin o durante el desarrollo o la
compilacin. Para verificar y responder a los errores controlables, se utiliza la
instruccin On Error o el objeto Err.
Tabla de errores
Cdigo del error Mensaje
76 Ruta no encontrada
91 Variable objet o variable de bloque With no establecida
92 For Loop no iniciado
93 Secuencia de caracteres predefinidos no vlida
94 Uso no vlido de null
322 No se puede crear el archivo temporal necesario
325 Formato no vlido en el archivo de recursos
327 Valor de dato nombrado no encontrado
328 Parmetro no permitido, no es posible grabar matrices
335 No se pudo acceder al registro del sistema
336 Componente no registrado correctamente
337 Componente no encontrado
338 El componente no se ejecut correctamente
360 Objeto cargado
361 No se puede cargar o descargar este objeto
363 Control especificado no encontrado
364 Objeto descargado correctamente
365 No se puede descargar en este contexto
385 Se requiere el ndice de matriz de propiedades
387 Property Set no permitido
393 Property Get no se puede ejecutar en tiempo de ejecucin
419 Permiso para utilizar el objeto denegado
422 Propiedad no encontrada
423 Propiedad o mtodo no encontrado
424 Objeto obligatorio
425 Uso no vlido de objeto
438 El objeto no admite esta propiedad o mtodo
440 Error de automatizacin
443 El objeto de automatizacin no tiene un valor predefinido
445 El objeto no admite esta accin
445 El objeto no admite esta accin
446 El objeto no admite argumentos nombrados
447 El objeto no admite la configuracin de ubicacin actual
448 Argumento nombrado no encontrado
450 Nmero incorrecto de argumentos o asignacin de propiedad no
vlida
451 El objeto, no una coleccin
452 Ordinal no vlido
453 Cdigo especificado no encontrado
454 Recurso de cdigo no encontrado
455 Error de bloqueo del recurso de cdigo
457 Esta clave ya est asociada a un elemento de esta coleccin
460 Formato no vlido de portapapeles
461 Mtodo o miembro de dato no encontrado
With ActiveWindow
DisplayGridlines = True
DisplayHeadings = True
DisplayWorkbookTabs = True
DisplayVerticalScrollBar = False
End With
End Sub
VBA-Application
Ya hemos dicho que los objetos Excel tienen una estructura jerrquica.
1) Metodo Quit
Cierra todos lo libros y cierra Excel.
Si existen libros sin guardar, nos avisar de si queremos hacerlo en funcin del
valor de la propiedad DisplayAlerts.
2) Propiedad DisplayAlerts
Permite eliminar la visualizacin de mensajes de Excel.
Admite los valores True/False.
Con el valor a False se eliminarn todos los mensajes.
El valor por defecto es True.
3) Propiedad ScreenUpdating
Permite eliminar la actualizacin de pantalla.
Admite los valores True/False.
Con el valor a False evitaremos la actualizacin de pantalla.
Se aconseja poner la propiedad en False para mejorar el rendimiento y eliminar el
parpadeo de la pantalla durante la ejecucin.
El valor por defecto es True.
4) Propiedad Visible
Permite eliminar la visualizacin de Excel.
Admite los valores True/False.
Con el valor a False evitaremos la visualizacin de Excel.
Se aconseja usar esta propiedad solamente con formularios.
Colocarla en False en el evento Initialize, y ponerlo a True en el evento Terminate,
Pgina: 142 Elaborado por: Dennis Pichilingue R
Ms. Excel VBA - Nivel II
ambos en el formulario.
El valor por defecto es True.
5) Propiedad EnableEvents
Permite eliminar los eventos de hoja y libro.
Admite los valores True/False.
Con el valor a False evitaremos la ejecucin los eventos de hoja y libro
No afecta a los controles en los formularios ni en las hojas.
Permanece con el valor True/False hasta que no se cambia.
El valor por defecto es True.