SlideShare una empresa de Scribd logo
1 de 29
Aprender código VBA
Introducción
Manual de VBA (Visual Basic para Aplicaciones) para Microsoft Access
Con este artículo pretendo quelas personas puedan inicializarse en la programación con código
VBA y que aunque sean principiantespuedan interpretar cualquier código que se les presente.
Para ello intentare usar el lenguaje más sencillo posible para que sea mas claro para todos.
No pretendo enseñar todos los detalles, solo pretendo "Abrirles la puerta"para que vean este
gran mundo, y con el camino indicado puedan descubrir muchas cosas por su cuenta
¿Porque leer este artículo?
Porque intento que las personas aprendan todo de manera general en tiempo record
Para continuar es necesario que el usuario haya hecho cosas sencillas en Access, como macros
formularios, no es necesario saber mucho
Tampoco es un articulo solo para principiantes,espero abarcarvarios puntos y al finalizar
espero que todos estén preparados para el siguiente articulo (Aprendiendo Funciones API), así
que es mejor que todos lo lean
Importante:
Conforme se vallan tocando los temas quizá quieras profundizar mas en algo e investigar al
respecto,te sugiero que te aguantes las ganas, espera a leer/terminar todo el articulo.Esto es
porque los temas los voy a tocarde manera básica,para que tengas el concepto general y puedas
relacionarlo con los demás temas, de esta manera lograras entendertodo sin complicaciones.
Luego de terminar este articulo y haberlo comprendido, ya podrás especializarte en cualquier
tema o quizá ya empieces a generar tus códigos, y conforme vas avanzando se te irán
presentando los temas para que profundices.
Iniciamos...
Parte I
¿Que son las macros?
Las macros son objetos que nos permiten realizar diferentes acciones, si ves una macro en vista
de diseño veras quehay un campo llamado "Acciones", campo quese puede desplegar y te
aparece el listado de las opciones de lo que puedes realizar.
En realidad estas acciones son procedimientos internos,líneas de código o instrucciones queel
programa seguirá y ejecutara.
¿Cual es el límite de las Macros?
Pues el total de acciones que te aparecen en la "Lista de las Acciones", aunque combinando
diferentes Acciones se convierten en muchas posibilidades
Nosotros podemos escribir directamenteestas acciones en procedimientos (líneas de código o
instrucciones),tendremos a disposición todas las opciones que nos dan las macros y muchas
mas, las posibilidades se hacen casi infinitas. Cuando nosotros empezamos a escribirlos
procedimientos es cuando empezamos a sentir que tomamos el verdadero control de las cosas,
una vez que has iniciado no vuelves atrás,las macros casi pasan al olvido porquete parecerán
que se quedan muy cortas. Escribiendo tus procedimientos pasas de ser un usuario(a) a
programador(a).
¿Interesante verdad?, bueno,estas a punto de se parte de todo eso...
Para iniciar, crea una base de datos nueva que nos servirápara realizar pruebas, recuerda que
no debes borrarnada de lo que vallamos realizando, porque vamos a ir reutilizando ejem plos
Convirtiendo Macros a Procedimientos de Código
Como mencionábamos antes, las macros son en realidad procedimientos de código, estos
procedimientos se escriben en los objetos llamados "Módulos".
Vamos a realizar lo siguiente:
Creemos una nueva macro, en la lista de Acciones escogemos "Bip", le damos guardar, ahora nos
pide un nombre para la macro, le ponemos como nombre "Bip" y por ultimo cerrar.
Si corremos la macro (doble clic) nos dará un sonido (Es la acción que escogimos).
Ahora démosle un clic secundario a la macro, en el menú contextual que se nos desplega
escogemos la opción "Guardar como", nos aparecerá un formulario, allí le ponemos el nuevo
nombre, pongámosle"Procedimiento de la macro Bip", el cuadro combinado de abajo que tiene
como nombre "Como", lo desplegamos y escogemos la opción "Módulo", le damos Aceptar,
ahora nos aparece un formulario con dos checks, desmarca los dos y pulsamos el botón
"Convertir".
Si se quedo en la ventana VBA vacía, dale cerrar(arriba en la "X")
En la ventana principal de Access nos aparecen los diferentes objetos (Tablas, Consultas,
Formularios, Informes, Páginas,Macros y Módulos),vamos a los objetos "Módulos"y nos
aparece el modulo de la macro convertida, si le damos doble clic nos abrirá el modulo y
podremos observar algo como esto:
'------------------------------------------------------------
' Bip
'
'------------------------------------------------------------
Function Bip()
Beep
End Function
Este es el procedimiento interno queesta corriendo la macro "Bip".
Como Se Escriben Los Procedimientos
Analicemos el procedimiento queacabamos de crear al convertirla macro:
Las primeras líneas inician con un apostrofe ( ' ), esto le indica al sistema que no son líneas para
ejecutar, simplemente son notas o apuntes quepodemos utilizarpara dar alguna descripción de
lo que hará el procedimiento o notas personales,si las borráramos no pasaría nada, no influyen
en la ejecución del procedimiento. Estas notas las podemos colocaren cualquier lugar, fuera o
dentro del procedimiento. Las reconocemos fácilmenteporqueaparecen en el código en color
verde
El procedimiento en si contienelas 3 líneas:
Línea 1: Function Bip()
Es la declaración del procedimiento, donde la palabra "Function"esta indicando queinicia un
procedimiento, la palabra"Bip" es el nombre del procedimiento.Los nombres no pueden
contenerespacios en blanco y tampoco pueden tener nombres de palabras reservadas por el
sistema.
Por ultimo tenemos los paréntesis, todos los procedimientos deben terminarcon paréntesis.
Hagamos lo siguiente, cambiémosle el nombre al procedimiento, cambiemos la palabra"Bip"
por "EmitirSonido"
Línea 2: Beep
Es el cuerpo del procedimiento o las instrucciones (en realidad la palabra Beep es una
instrucción quele ordenaal sistema que emita un sonido), en este caso el cuerpo del
procedimiento es de solo una línea, pero puedeser cualquier cantidad
Línea 3: End Function
Aquí estamos indicando que termina el procedimiento
Corriendo/Ejecutando Un Procedimiento
Para que puedas correr/ejecutar/probarun procedimiento, haz clic en cualquiera de sus líneas,
esto es para seleccionarel procedimiento (porquepuedes tenermuchos), luego tienes cualquiera
de estas 3 opciones:
1. Ir al menú:Ejecutar/Ejecutar Sub/UserForm
2. Pulsar la tecla F5
3. O en la barra de herramientas pulsa el triangulo verde
Haz la prueba con las 3 opciones,correel procedimiento anterior, ¿Todo correcto?, ok,
continuamos...
En el mismo modulo podemos escribir muchos procedimientos, pero mejor vamos a crear un
nuevo modulo quenos servirá para realizarnuestras pruebas:
Antes vamos a realizar un ajuste,no tienes que entenderlo ahora, te lo explicare mas adelante.
Siempre en la ventana VBA vamos al menú:
Herramientas/Opciones/Pestaña Editor/Requerir declaración de variables
Este es un check que debes activar,le das aceptar.
Démosle cerrara la ventana VBA, nos quedamos siempreen la ventana principal de Access en
los objetos módulos, pulsemos "Nuevo", nos abre de nuevo la ventanaVBA en un modulo nuevo,
pulsamos el botón de guardar, le ponemos como nombre "Mis primeras pruebas".
En el modulo que acabas de crear te aparecen dos líneas inicialmente:
Option Compare Database
Option Explicit
En este momento no les hagas caso,lo explicaremos mas adelante.Los procedimientos quese
crean en el modulo deben quedar abajo de estas líneas.
Ahora escribamos nuestro primerprocedimiento, copia y pegael procedimiento siguiente:
Sub MiMensaje()
MsgBox "Este es mi primer mensaje, voy muy bien!"
End Sub
Corre el procedimiento como lo hicistecon el anterior... ¿Que tal?,
La instrucción MsgBox le dice al sistema que nos muestreun mensaje
Aquí seguro que ya viste una diferencia, en el primer procedimiento lo declarábamos así:
Function EmitirSonido()
Y ahora lo estamos haciendo así:
Sub MiMensaje()
Exacto, existen dos tipos de procedimientos, Sub y Function. Con los dos podemos escribir
cualquiertipo de líneas de código (instrucciones), una de las diferencias es que los
procedimientos Function además nos pueden devolverun valor (mas adelante profundizaremos
en el tema de devolución de valores).
Seguimos con las pruebas, copia y pega estos procedimientos:
Function TextoDelMensaje()
TextoDelMensaje = "Y o soy el texto"
End Function
Sub MostrarMensaje()
Msgbox TextoDelMensaje
End Sub
(Recuerda que para correr un procedimiento primero debes hacer clic sobrecualquiera de sus
líneas para que el sistema sepa cual es el que estas seleccionando)
Corre el procedimiento Function TextoDelMensaje()... parece queno pasa nada.
Ahora corre el procedimiento Sub MostrarMensaje()... nos muestra un mensaje con el texto que
esta escrito dentro del otro procedimiento Function.
¿Que es lo que esta pasando?
Si ves el cuerpo del procedimiento Function,el procedimiento se esta asignando a si mismo un
valor de texto, ahora solo hay que recogereste valor y hacer algo con el. Esta la forma en que los
procedimientos Function devuelven un valor.
En el cuerpo del procedimiento Sub:
Msgbox TextoDelMensaje
Primero le decimos al sistema que queremos que nos muestreun mensaje con la instrucción
MsgBox, inmediatamentedespués la instrucción nos pide una cadena de texto para mostraren
el mensaje, como cadena de texto estamos escribiendo el nombrede la Function,porque
sabemos que esta nos esta devolviendo una cadena de texto. Cuando corrimos por primera vez
la Function si realizo algo, se asigno su valor, pero ya hubo no nada más.
Esto que acabamos de ver es lo mas básico y elemental en procedimientos, debes saberlo de
memoria, igual que sabes cuanto es 1+1
Antes de continuar debemos aprender como usar la ventana de "Inmediato", que también nos
sirve para realizar pruebas.
Usando La Ventana Inmediato
Estando siempre dentro de la ventana de VBA, podemos verla ventana de inmediato con
cualquiera de estas opciones:
1. Ir al menú Ver/Ventana Inmediato
2. Pulsar la combinación de teclas Ctrl+G
La ventana de Inmediato nos aparece en la parte inferior de la ventana VBA.
Empecemos a utilizarla, en el procedimiento queescribimos anteriormente(el primero del
modulo):
Sub MiMensaje()
MsgBox "Este es mi primer mensaje, voy muy bien!"
End Sub
Ahora cambiaremos MsgBox por Debug.Print, nos quedara así:
Sub MiMensaje()
Debug.Print "Este es mi primer mensaje, voy muy bien!"
End Sub
Corremos el procedimiento y podemos veren la ventana de inmediato que allí se escribió el
mensaje. Ahora intentemos esto, directamente en la ventana de inmediato escribamos:
Debug.Print 5 + 5
Y presionamos Enter, nos imprime(muestra en la ventanainmediato) el valor10
Ahora escribamos:
Debug.Print TextoDelMensaje
Y presionamos Enter
Ahora escribamos:
? 5 + 5
Y presionamos Enter, nos volvió a imprimir el 10. El signo de interrogación es lo mismo que
escribir Debug.Print,lo único es que puedes usarlo solo directamente en la Ventana Inmediato,
no funciona dentro del código
Por ultimo escribamos:
MostrarMensaje
Y presionamos Enter
Te pudiste dar cuentaque esta es otra forma de correr un procedimiento.
¿Todo Correcto?, ¿Fácil no?
Puedes borrarel texto de la ventana inmediato como has borrado cualquier texto, en cualquier
momento, en el momento que gustes
Utilizando Variables
Las variables nos sirven para abrir un espacio de memoria donde podemos guardaralgún valor
que utilizaremos después.
Copia y pega los dos procedimientos siguientes, correlos y analiza lo que esta pasando:
Sub PruebaVariableUno ()
Dim MiTotal 'declaración de la variable, siempre inicia con "Dim" mas el nombre de la variable
MiTotal = 10 * 10 'Aquí le estamos asignando un valor de 100 a la variable
Debug.Print MiTotal 'Mostramos el valorde la variable en la ventana inmediato
MiTotal = 50 + 3 'Le estamos cambiando el valor a la variable
Debug.Print MiTotal
MiTotal = MiTotal + 10 'El valor de la variable es igual al valor que ya tiene,mas 10
Debug.Print MiTotal
End Sub
Sub PruebaVariableDos()
Dim MiTotal 'declaración de la variable, siempre inicia con "Dim" mas el nombre de la variable
Dim UnNumero
MiTotal = 5 + 5
UnNumero = 5 + 5
Debug.Print MiTotal + UnNumero
Debug.Print MiTotal * UnNumero
Debug.Print MiTotal - UnNumero
Debug.Print MiTotal / UnNumero
End Sub
T ipos De Variables
Los diferentes tipos de variables abren diferentes espacios en memoria, algunas consumen más
memoria que otras, porlo que para hacer más eficientetu aplicación debes ir aplicando a tus
variables el tipo necesario. Entre los tipos de variables tenemos:
Boolean (Falso/Verdadero)
Byte (Bite)
Integer (Entero)
Long (Entero Largo)
Currency (Moneda,acepta hasta 4 decimales)
Single (Simple, acepta más decimales que el tipo Currency)
Double (Doble, acepta mas decimales que el tipo Single)
Date (Fecha y Hora)
String (Cadena, Texto)
Object (Objeto)
Variant (Variante, acepta cualquier tipo de valor)
Para conocer los rangos exactos de los valores que acepta cada tipo de variable consulta después
la Ayuda de Access.
Tomemos por ejemplo el tipo Byte, queacepta solo números enteros entre0 y 255:
Sub MisPosiblesNietos()
Dim MiNumeroDeHijos As Byte 'Así declaramos la variablecon su tipo especifico
MiNumeroDeHijos = 5
Debug.Print "Mis posibles nietos:"& MiNumeroDeHijos * 3
End Sub
En el procedimiento anterior declaramos la variable "MiNumeroDeHijos"como
tipo Byte porquecreo quenadie puedetenermas de 255 hijos, esta variabletambién la pudimos
declarar como tipo Integer, Long, Currency, Single, Double o Variant y funcionaria bien, pero
seria un desperdicio de recursos del sistema
Si en la variableanteriorhicieras esto:
Dim MiNumeroDeHijos As Byte
MiNumeroDeHijos = 100 * 3
Te Daria un error de desbordamiento, porquela variable tipo Byte solo aguanta valores hasta
255, si en realidad necesitaras hacer eso,debes declarar la variable con otro tipo, el que le sigue
es el Entero (Integer):
Dim MiNumeroDeHijos As Integer
El tipo de variable Variantes muy especial, este tipo puede contener cualquiertipo de valor,
numérico, texto u objetos. Si se declara una variabley no se especifica el tipo, el sistema la
asume como tipo Variant.
Dim UnaVariable 'Así queda como tipo Variant
Es fácil no declarar cada variablecon un tipo especifico y que queden todas
como Variant (porque acepta cualquier valor), pero como dijimos, es un desperdicio de recursos
del sistema. Un buen programador declara bien todas sus variables,es mas, todos lo hacen y
todos debemos hacerlo.
Nombres De Las Variables
Las variables te aceptan cualquier nombresiempre y cuando no se ingresen espacios
intermedios, el nombre es muy importante porque puede ayudarte a entender tu propio código y
te puede evitarponer demasiadasnotas.En un procedimiento corto es fácil seguir a las
variables, pero cuando tienes procedimientosmuy largos y con muchas variables entonces ves la
diferencia. Una regla general es que los primeros 3 caracteres del nombre te indiqueel tipo con
el que esta declarada:
Dim strDireccion as String 'tipo texto
Dim lngCambios as Long 'tipo entero largo
Veamos un ejemplo para que veas de lo que hablamos, ¿Cual de estos dos procedimientos
entiendes mejor?
Sub PruebaVariables()
Dim c as String
Dim d as String
c = "PL0400"
d = "Wire 800400"
Debug.Print c & " " & d
End Sub
Sub PruebaVariables()
Dim strCodigo as String
Dim strDescripcion as String
strCodigo = "PL0400"
strDescripcion = "Wire 800400"
Debug.Print strCodigo &" " & strDescripcion
End Sub
¿Ves la diferencia?
Estas reglas para nombrar variables también se aplican para los no mbres de procedimientos.
Tampoco vallas a caer en nombres muy largos y muy descriptivos, porquecargas mucho
visualmente tu código, te será más difícil a ti como programadorestar escribiendo nombres
largos y no se ve muy estético:
Dim sngPorcentajeDeDescuentoParaAplicarleAlProducto as Single
Podría ser:
Dim sngPorcDesc as Single
Declarando Procedimientos Function (Funciones)
Al igual que como vimos con las variables,los procedimientos Function que nos van a devolver
un valor debemos declararlos con un tipo especifico de datos. ¿Recuerdas el primer
procedimiento Function que escribimos y que nos devolvía un texto?, iba de esta manera:
Function TextoDelMensaje() 'No le estamos indicando el tipo, así que toma el tipo Variant
TextoDelMensaje = "Y o soy el texto"
End Function
Como esta Function nos devuelve un texto, lo correcto es que la declaremos así:
Function TextoDelMensaje() As String 'Aquí le indicamos quetipo de valornos va a devolver
TextoDelMensaje = "Y o soy el texto"
End Function
Function TuEdad() As Byte 'Aquí le indicamos que tipo de valor nos va a devolver
TuEdad = 25
End Function
Y así con cada Function dependiendo del valorque nos devolverá...
Valores Iniciales De Las Variables Y De Los Procedimientos Function (Funciones)
Las Variables y procedimientos Function nacen con un valor predeterminado, estevalorse los
asigna el sistema en el momento que las crea en memoria. El valorinicial depende del tipo con
el que han sido declarados:
Tipo String (Texto), inicializan como una cadena vacía, igual a ""
Tipo Numéricas, inicializan como cero
Tipo Boolean, inicializan como Falso (False)
Tipo Variant, inicializan como Empty (adelanteentraremos en detalles)
Tipo Object, inicializan como Nothing (adelante entraremos en detalles)
Si deseas conocer si una variable de tipo Variant se ha inicializado puedes hacer:
Dim varVar As Variant
IfIsEmpty(varVar) Then
Debug.Print "La Variable Variant no a sido inicializada"
End If
Si deseas conocer si una variable de tipo Object(Objeto) se ha inicializado puedes hacer:
Dim obj As Object
Ifobj Is Nothing Then
Debug.Print "El objeto no a sido inicializado"
End If
Parte II
Para continuar es necesario que tengas bien comprendida la Parte I, de no ser así puede ser que
vallas a confundirte, repasa lo que sea necesario
Como ya estas bien claro con la Parte I... continuamos
Procedimientos Con Parámetros
Los parámetros son valores quenos piden los procedimientos para su correcto funcionamiento.
Veamos un ejemplo (copia y pega):
Sub LanzarMensaje(strMensaje As String)
MsgBox strMensaje
End Sub
El parámetro aquí es "strMensaje"que como puedes ver,es como una variable que se encuentra
dentro del paréntesis de declaración del procedimiento, se le debe especificar de que tipo será y
para declararla NOusamos la palabra Dim.
Para que este procedimiento pueda funcionar espera que le pasemos un valor de tipo texto en el
parámetro ("strMensaje"), porqueeste texto será el que se mostrara en el mensaje. Llamemos a
este procedimiento desde otro:
Este procedimiento seria bueno queno lo copies y lo pegues, escríbelo a mano para que puedas
ver como es que al ir llamando al otro procedimiento te va pidiendo su parámetro
Sub PruebaMensaje()
LanzarMensaje "Este es una prueba de mensaje"
LanzarMensaje "Y a estoy entendiendo lo de parámetro de texto"
LanzarMensaje "Con este texto ya es suficiente"
End Sub
Corre el procedimiento Sub PruebaMensaje()...
Si llamáramos al procedimiento y no le pasamos el valoral parámetro así:
Sub PruebaMensaje()
LanzarMensaje
End Sub
Recibiríamos un errorque nos dice"El argumento no es opcional", lo cual quiere decir que
obligatoriamente debemos especificar un valor para el parámetro o no se puede continuar
Un procedimiento puede tener cualquier cantidad de parámetros,todos los que sean necesarios,
solo deben declararse separados por coma:
Sub UnProc (strAlgo As String, lngNumero As Long, intValorAs Integer)
...
End Sub
Parámetros Opcionales
Estos son un tipo de parámetro que puede o no ser llenado porquees opcional, el
procedimiento correrá de todas formas. Lo correcto es que al declarar una variable como
opcional le asignemos de una vez el valor que tomara al no recibir un valor(copia y pega):
Sub ImprimirTexto(Optional ElTexto As String = "No me ingresaron, soy una cadena
automatica")
Debug.Print ElTexto
End Sub
Ahora ve a la ventana Inmediato y escribe:
ImprimirTexto "Esta cadena yo la escribí"
Y pulsa enter.
Ahora llamemos al mismo procedimiento pero no ingresemos valoren el parámetro, escribamos
en la ventana Inmediato:
ImprimirTexto
Y pulsas enter, ¿Viste?
A los parámetros declarados como opcionales se les coloca la palabra Optional al inicio de la
declaración, un procedimiento puede tener varios parámetros,los parámetros opcionales
siempre deben ser colocados de último
Recepción De Valores En Los Parámetros
Cuando llamamos a un procedimiento que nos pideun valoren un parámetro,podemos pasarle
como valorel contenido de una variable. Veamos el ejemplo siguientepara que se vea mas claro:
Copia-pega los siguientes procedimientos y analízalos:
Sub ImprimirElMensaje(TextoMensaje As String)
'Imprimir el texto que vieneen el parámetro
Debug.Print TextoMensaje
End Sub
Sub Probando_ImprimirElMensaje()
Dim strTexto As String
'Le cargamos un valor a la variable
strTexto = "Texto original"
'Llamamos al primer procedimiento, pasándole como parámetro la variable
ImprimirElMensaje strTexto
'Imprimir el valorde la variable
Debug.Print strTexto
End Sub
Corre el procedimiento "Probando_ImprimirElMensaje"y sin ningún problema nos imprimió el
texto en la ventana de inmediato:
Texto original
Texto original
Aquí viene lo bonito, ten mucho ojo con lo que vamos a realizar porque es muy importante.
Ahora vamos a realizaruna modificación al primer procedimiento, vamos a agregarleun par de
líneas. Nos quedaría así (Puedes borrar el procedimiento y sustituirlo por este):
Sub ImprimirElMensaje(TextoMensaje As String)
'Imprimir el texto que vieneen el parámetro
Debug.Print TextoMensaje
'Cambiando el valor del parámetro 'Cambio 1, Línea agregada
TextoMensaje = "Y ONO SOY EL TEXTO ORIGINAL!!!" 'Cambio 1, Línea agregada
End Sub
Ahora corremos el procedimiento "Probando_ImprimirElMensaje"y nos imprime en la ventana
Inmediato:
Texto original
Y ONO SOY EL TEXTO ORIGINAL!!!
¿Te diste cuenta de lo que paso?,
Lo que paso es que al cambiar el valor del parámetro en el procedimiento "ImprimirElMensaje"
(lo hace las líneas que agregamos), cambiamos directamente el valorde la variable "strTexto"
que se encuentra dentro del otro procedimiento "Probando_ImprimirElMensaje", variable que
nos fue pasada como parámetro.
A esto se le llama recibir un parámetro por Referencia, donde lo que estamos recibiendo es un
acceso directo hacia la variable original, por lo que cualquier cambio que se realice al parámetro
se esta realizando en la variable misma.
Nota:
Repasa este ejemplo tantas veces como sea necesario para que te quedeclaro
Continuamos...
Para declarar un parámetro porReferencia, debemos anteponerle ByRef:
Sub ImprimirElMensaje(ByRefTextoMensaje As String)
End Sub
En el ejemplo anterior se puede notar que en ningún momento declaramos el parámetro
con ByRef, esto es porqueal no colocarlenada, el sistema predeterminadamente toma/asume el
parámetro por Referencia
El otro tipo de parámetro que podemos definir es ByVal, que quieredecir "Por Valor":
Sub ImprimirElMensaje(ByVal TextoMensaje As String)
End Sub
Esto indica al sistema que solo recibimos el valorque viene en el parámetro, no la referencia. Si
hacemos un cambio en el parámetro no afectará al origen desde donde nos envían el valor.
Probemos...
Hagamos de nuevo una modificación en el primer procedimiento, declaremos el parámetro
como ByVal, nos quedaría así:
Sub ImprimirElMensaje(ByVal TextoMensaje As String) 'Cambio 2, declaración del parámetro
como ByVal
'Imprimir el texto que vieneen el parámetro
Debug.Print TextoMensaje
'Cambiando el valor del parámetro 'Cambio 1, Línea agregada
TextoMensaje = "Y ONO SOY EL TEXTO ORIGINAL!!!" 'Cambio 1, Línea agregada
End Sub
Ahora corremos el procedimiento "Probando_ImprimirElMensaje"y nos imprime en la ventana
Inmediato:
Texto original
Texto original
¿Viste?, el valor de la variable"strTexto"permaneció intacto, no se tuvo acceso a ella.
Procedimientos Que Devuelven Muchos Valores Aprovechado Los Parámetros Por
Referencia
Los parámetros por Referencia también los podemos usar para obtener muchos valores desde
un procedimiento. Copia y pega los siguientes procedimientos:
Sub DevolverNombres(ByRefPadre As String, ByRefMadre As
String, ByRef CantHermanos As Byte)
'Procedimiento que cargara valores a las variables querecibiremos como parámetros
Padre = "Pepe"
Madre = "María"
CantHermanos = 5
End Sub
Sub ImprimirNombres()
Dim strNombrePadre As String
Dim strNombreMadre As String
Dim bytNumeroHermanos As Byte
'llamar a la función que nos llenara los nombres en las variables
'que pasemos como parámetros
DevolverNombres strNombrePadre,strNombreMadre,bytNumeroHermanos
'Imprimir los valores de las variables
Debug.Print "Padre:" & strNombrePadre
Debug.Print "Madre:" & strNombreMadre
Debug.Print "Numero de hermanos:"& bytNumeroHermanos
End Sub
Ahora corre el procedimiento "ImprimirNombres"y mira el resultado en la ventana Inmediato.
¿Todo claro verdad?
También podemosrecibircomo parámetros a matrices y objetos, estos los explicaremos mas
adelante.
Llamando A Los Procedimientos Function (Funciones)
Tenemos algunas opciones para llamar a funciones, todo dependede que es lo que necesitamos
y como esta planteada la función. Copia y pega la siguiente función:
Function NotaAprobada(ByVal bytNota As Byte) As Boolean
'Si la nota es mayor a 69 entonces la función devolverá Verdadero, de lo contrario Falso
IfbytNota > 69 Then
NotaAprobada = True
End If
End Function
Nota:Como tip en esta función puedes verque si la nota no cumple la condición en ningún
momento se le asigna el valorFalso, esto es porque la función ya nacecon el valor
predeterminado Falso, y volvérselo a asignar seria redundante.
Para llamar a esta función a continuación unas opciones:
Recogiendo el valor de la función en una variable:
Dim blnAprobada As Boolean
blnAprobada = NotaAprobada(85)
IfblnAprobada Then
MsgBox "La nota fue aprobada"
Else
MsgBox "Nota perdida"
End If
En esta opción podemosnotar quepara que funcione, los parámetros de la función deben
quedar encerrados entre los paréntesis,si existen muchos parámetros quedaría así:
NombreVariable= NombreFuncion(UnParametro,OtroParametro, TercerParametro)
Esta opción nos sirve si el valor devuelto por la función va ha servirnos después (por eso
guardamos el valoren una variable). Si solo usaremos una vez el valor devuelto por la función,
podemos procesar de una vez el resultado:
If NotaAprobada(85) Then
MsgBox "La nota fue aprobada!"
Else
MsgBox "Nota perdida"
End If
En ocasiones tenemos que escribir procedimientos muy largos y no necesitamos que nos
devuelva un valor, solo necesitamos que se realicen muchas acciones, como no hay valor para
devolverpodemos declarar el procedimiento como Sub.
Algo muy común en programación es que estos procedimientos largos sean declarados
como Function y quedevuelvan un valor Boolean, el valor de verdadero se lo asignamos en la
ultima línea (ultima instrucción) y así sabremos que todo se ejecuto correctamente:
Function UnProcedimientoLargo(lngNumero As Long) as Boolean
'aquí muchas líneas, seguramente también abran muchas validaciones...
IfNoSeCumpleUnaValidacion then
Exit Function 'Esta instrucción sirvepara parar el procedimiento, ya no corren las demás
líneas
'Saliendo desde aquí la función devolverá Falso,que es el valorcon que se inicializo
End If
'...aquí mas líneas y validaciones
'la ultima línea:
UnProcedimientoLargo = True
End Function
Como el procedimiento lleva muchas líneas, en el transcurso de la mismas se van realizando
validaciones, si no se cumple alguna validación mejorse decide terminar el proceso antes de que
termine, lo cual dejaría la función con el valor falso.La función solo tomarael valor verdadero si
se llego al final, lo cual quiere decir que todo termino correcto.Sabiendo esto podemos llama a
la función de esta manera:
If UnProcedimientoLargo("valor parámetro") then
'Aquí entramos porque la función devolvió Verdadero, nos quedamos tranquilos y realizamos
lo que sea necesario...
Else
'Aquí entramos porque alguna validación fallo o puede ser que haya ocurrido un error.
Realizamos lo que sea necesario...
End If
Esto como comentaba es muy común y seguro lo has encontrado o lo encontraras
Si tienes una función como la anterior pero no te interesa saber el valor que esta devolviendo,
puedes usar Call para llamar al procedimiento, esta instrucción funciona tanto
para Sub y Function:
Call UnProcedimientoLargo("Valor del parámetro")
Call MostrarMensaje
Funciones Útiles y Predeterminadas
Existen muchas funciones queya nos da el sistema, funciones que regularmente necesitamos
todos. Como ya sabes como obtener datos de las funciones, ya puedes usar todas las que quieras,
solo te falta conocero investigar cuales tienes disponibles.Como ejemplo te doy algunas:
Ucase:Convierte una cadena a Mayúsculas
Left: Te devuelve un número de caracteres de una cadena, desde la izquierda
Split: Te convierte una cadena en una matriz
InStr:Te encuentra un texto dentro de otro texto
etc....
Parte III
T ipos De Módulos
Existen 3 tipos de módulos:
-Asociados
-Estándar
-De Clase
Módulo Asociado
Es aquel que esta ligado a un formulario, pertenece al formulario, se encuentra asociado.
Cuando intentamos escribir código por primera vez a un formulario se crea automáticamente
Módulo Estándar
Módulo independiente, lo creamos nosotros mismos cuando vamos a los objetos de
Access/Módulos/Nuevo. El modulo que hemos estado usando para los ejemplos es un modulo
estándar
Módulo De Clase
Módulo independiente que nos sirvepara crear nuestros propios objetos. Veremos mas detalles
cuando veamos objetos
Alcance De Las Variables
Las variable pueden tener alcances diferentes, esto quieredecirque podemos tener acceso a
ellas solo desde el procedimiento que las contiene, desde todos los procedimientos de un mismo
modulo o desde todos los módulos.
Si tu variable solo va a ser usada desde un procedimiento, entonces se declara dentro del
procedimiento (como lo hemos estado haciendo):
Dim strVariableAs String
Si deseas que otros procedimientos del mismo modulo tengan acceso a la variable, entonces
tendrás que declararla en la parte de arriba del modulo:
Option Compare Database
Option Explicit
Dim strVariableAs String
Procedimientos...
Las primeras dos líneas las puse solo para que se identifique la partede arriba del modulo
Para que se pueda tener acceso a una variabledesdecualquier lugar, debes declarar la variable
en un "Módulo estándar"y tienes que anteponeral nombrede la variable la palabra Public:
Option Compare Database
Option Explicit
Public strVariable As String
Private strOtraVariable As String
Procedimientos...
Puedes ver que también se ha declarado una variable como "Private", al ser declarada de esta
manera la variablesolo estarádisponiblepara los procedimientos del mismo modulo
Alcance De Los Procedimientos
Al igual que las variables, los procedimientos pueden ser declarados como Privatey
como Public:
Si quieres que tu procedimiento solo pueda correrse desde el mismo modulo lo podemos
declarar así:
Private Sub UnProceimiento()
Private Function UnProcedimiento() As Tipo
Si deseas que tu procedimiento pueda llamarsedesde cualquier lugar de tu aplicación debes
declararlo en un "Módulo Estandar"así:
Public Sub UnProcedimiento()
Public Function UnProcedimiento() as Tipo
El sistema también toma como públicos los procedimientos a los que no se les ha indicado su
alcance (como lo hemos venido haciendo):
Sub UnProcedimiento()
Function UnProcedimiento() as Tipo
Nota:
En los "Módulos Asociados", aunque declares variables o procedimientos
como Public (Públicos), siempre tendrán alcance solo para el modulo que los contiene
Procedimientos De Evento
Los procedimientos de evento van ligados a objetos como formularios o controles, se ejecutaran
automáticamentecuando ocurreel momento que están esperando, el momento parael que
fueron creados.
Tomemos por ejemplo un Botón en un formulario, a este botón le podemos agregar el evento "Al
hacer clic"esto quiere decir que cada vez que el usuario le haga clic en el botón, se correrá este
procedimiento. ¿Que acciones realizara?, pues las que tu quieras, las que tu le especifiques.
Los procedimientos de evento se escriben en ingles. Para el evento "Al hacer clic"de un botón
llamado "btnAbrirFormulario"seria:
Private Sub btnAbrirFormulario_Click()
'Aquí todas las instrucciones que quieras que se realice...
MsgBox "Acabas de hacerme clic"...
End Sub
Estos procedimientos están disponibles solo para el modulo (como yavimos anteriormente) y
los puedes llamar desde cualquier otro evento del mismo modulo si es necesario, lo llamaría
como lo haces normalmente con los procedimientos:
Call btnAbrirFormulario_Click()
Algunos procedimientos de evento solicitan parámetros o tienen parámetros donde vienen datos
que podemos usar. Lo mas fácil y recomendablepara crear estos eventos es de la forma que
haremos esta prueba:
Crea un nuevo formulario en la vista de diseño, dale guardar y ponle cualquier nombre. Crea un
nuevo control de Botón, si te sale el asistente dale cancelar, no necesitaremos al asistente porque
nosotros mismos crearemos eventos. Si el cuadro de propiedades no esta abierto dale doble clic
al botón para que aparezca,si la propiedades ya están abiertas solo dale un clic al botón para
seleccionarlo, en el cuadro de propiedades ve a la pestaña "Ev entos", busca por el evento "Al
hacer clic / On clic", pon el puntero del Mouse justo en el evento, ahora te aparece un pequeño
botón a la derecha, este pequeño botón tiene 3 puntos como titulo (...), dale un clic y te llevara a
la ventana VBA, con la novedad de que te agrego automáticamente el procedimiento de evento:
Sub NombreBoton_Click().
End Sub
Ahora puedes agregarle las líneas que desees,le agregaremos estas (agrégaselas manualmente):
Sub NombreBoton_Click().
MsgBox "Procedimiento Al Hacer Clic. "& "Me llamo:" & NombreBoton.Name
MsgBox "Fecha y hora actual:"& Now()
End Sub
Revisa bien el "NombreBoton".
Dale guardar, cierra la ventana VBA, cierra el formulario. Ahoraabre tu formulario
normalmentecon un doble clic y prueba el botón.
Como pudiste ver en el cuadro de propiedades, existen muchos eventos para el botón. Los tipos
de eventos pueden variar dependiendo del tipo de control, pero hay eventos comunes en los
diferentes controles.
Cuando finalices todo estearticulo te queda una buena tarea, revisar que otros procedimientos
de evento puedes aplicarlea tus controles, y en que momento se ejecutan.
Estructuras Type
Las estructuras Typeson un tipo de variablecreada porel programador (tu), son como un grupo
de variablesque se manejan juntas:
Public Type typMiFamilia
strNombrePersona As String
strNombrePadre As String
strNombreMadre As String
lngNumeroHermanos As Long
End Type
Estas solo se pueden declarar a nivel de modulo (en la parte superior de modulo) y también
pueden ser Private o Public (Si no se le coloca se asumen Public)
Un ejemplo de uso, copia y pega la estructura type typMiFamilia, luego escribeeste
procedimiento manualmente:
Sub Prueba_EstructuraType()
Dim UnaFamilia As typMiFamilia 'declaración de la variable
'llenar los datos de la estructura
UnaFamilia.strNombrePersona = "Mario Hernandez"
UnaFamilia.strNombreMadre = "María"
UnaFamilia.strNombrePadre = "Pepe"
UnaFamilia.lngNumeroHermanos = 3
'imprimir los datos de la estructura
Debug.Print UnaFamilia.strNombrePersona
Debug.Print UnaFamilia.strNombreMadre
Debug.Print UnaFamilia.strNombrePadre
Debug.Print UnaFamilia.lngNumeroHermanos
End Sub
También podemospedir a estas estructuras Type en parámetros de procedimientos,con lo que
nos ahorraríamos espacio en la declaración.En vez de poner muchas variables solo colocamos
una variable de tipo estructura Type
A este punto, para que te sea mas fácil el manejo de esta estructura y muc has cosas que veremos
adelante, tienes que aprender a usar el With
With (Con)
Nos sirve para "agarrar"un objeto y podertrabajar con sus elementos. Como ejemplo vamos a
escribir el mismo ejemplo de arribade las Estructuras Type, escríbelo a mano:
Sub Prueba_EstructuraType_ConWith()
Dim UnaFamilia As typMiFamilia 'declaración de la variable
'llenar los datos de la estructura
With UnaFamilia
.strNombrePersona = "Mario Hernandez"
.strNombreMadre= "María"
.strNombrePadre = "Pepe"
.lngNumeroHermanos = 3
'imprimir los datos de la estructura
Debug.Print .strNombrePersona
Debug.Print .strNombreMadre
Debug.Print .strNombrePadre
Debug.Print .lngNumeroHermanos
End With
End Sub
Usando la instrucción With podemos ahorrarnos bastante escritura y el código se ve mas limpio.
Matrices
Las matrices son un tipo de variable que te aceptan varios datos, puedes pensar en ellas como
filas y columnas en una hoja de Excel.En las matrices también se aplican las mismas reglas de
nombres y alcances de las demás variables, la diferencia es en como se declaran, que después del
nombre se les colocan paréntesis, dentro de los cuales se escribeel tamaño que tendrá la matriz:
Dim, Private o Public NombreMatriz(NumeroDeFilas, NumeroDeColumnas) As TipoDeDatos
Si tu matriz solo contendra una columna puedes declararla así:
Dim mtzProductos(3) As String 'Aquí solo estamosindicando el número de filas, el sistema
asume que es de solo 1 columna
La clave para manejar las matrices es saber que la primera fila o columna es la numero cero.En
la declaración anterior en realidad hay 4 filas. Veamos un ejemplo:
Sub PruebaMatriz()
Dim mtzProductos(3) As String 'declaración de la matriz (4 filas)
'cargar datos a la matriz
mtzProductos(0) = "Producto1"
mtzProductos(1) = "Producto2"
mtzProductos(2) = "Producto3"
mtzProductos(3) = "Producto4"
'Imprimir los datos de la matriz
Debug.Print mtzProductos(0)
Debug.Print mtzProductos(1)
Debug.Print mtzProductos(2)
Debug.Print mtzProductos(3)
End Sub
Se podría dar el caso que no conozcamos desde el inicio el tamaño que contendrá la matriz
porque será resultado de algo que todavía hay que calcular. En este caso podemos declarar una
matriz de longitud variable y en el camino la dimensionamos con la instrucción ReDim.
Ejemplo:
Sub PruebaMatrizDos()
Dim mtzProductos() As String 'declaración de la matriz con longitud variable (no se especifico
un tamaño)
'Dimensionar el tamaño de la matriz
ReDim mtzProductos(3)
'cargar datos a la matriz
mtzProductos(0) = "Producto1"
mtzProductos(1) = "Producto2"
mtzProductos(2) = "Producto3"
mtzProductos(3) = "Producto4"
Debug.Print mtzProductos(0)
Debug.Print mtzProductos(1)
Debug.Print mtzProductos(2)
Debug.Print mtzProductos(3)
End Sub
En algunas ocasiones nos pueden venir matrices llenas desde alguna función,en estos casos no
conocemos que tamaño tiene, paraconocer el limite podemos usar la función Ubound
Dim intLimite As Integer
intLimite = Ubound(mtzProductos)
Esta función también es útil cuando trabajamos con bucles, los cuales hacen mas fácil el llenado
de datos a la matriz, haremos un ejemplo de esto cuando aclaremos que son los bucles
Objetos
Por fin los objetos... auque parezca que este va ser un tema complicado en realidad es muy
sencillo.
Los objetos son los culpables de que veamos el código "complicado"y que muchas personas se
"decepcionen"al ver tantas líneas, pero todo esta en la perspectiva con la que miramos.
Los objetos están diseñados para facilitarnos la vida, realizarnos muchas acciones o
proporcionarnos datos.
Si alguien te pasa una fecha, con ella podemos devolver varios datos (En este momento se me
ocurren):
-Sacar los días transcurridos hasta el día de hoy
-Sacar los meses
-Sacar los años
-Cuantos domingos han transcurrido
-Que día fue esa fecha
Etc., etc., seguro a ti se te ocurren muchos mas datos para devolver, todo esto lo podemos
realizar con cálculos.
Entonces, nosotros podemos crear un objeto que, pasándole la Fecha deseada, nos devuelva los
datos anteriores. Todos los datos dependen de dicha fecha,si no proporcionamos la fecha al
objeto no obtendremos nada porque no hay punto de partida para realizar los cálculos.
En general eso son los objetos, estructuras que nos piden uno o mas datos que le sirven como
partida para saber que es lo que nos interesa, y con eso desencadenan una seriede acciones y
cálculos que nosotros podemos aprovechar. Existen miles y miles de objetos y nadie puede
conocerlos todos, lo único quesabemos es que un objeto nos pedirá ciertos datos y con esto le
podemos ordenar que ejecuteacciones o que nos devuelva datos.
¿Que acciones y quedatos nos proporciona un objeto?
Eso es específicamente diferente en cada objeto, dependede para que fue diseñado.
¿Quieres saber que hace un objeto?
Busca ayuda sobreel, solo así sabrás que puedes sacarle. Adelanteveremos como podemos
investigarlos
En general eso es mucho de lo que es la programación,usar objetos según nuestra necesidad.
¿Quieres manejar los registros/datos de una tabla?Usa el objeto Recordset
¿Quieres manejar formularios?Usa el objeto Form
¿Quieres manejar controles?Usa el objeto Control
Etc., etc....
El que puedas hacermuchas cosas por código depende de que tantos Objetos conozcas y que tan
a fondo los hayas usado, porque hay objetos que tienen una cantidad muy grande de cosas que
se pueden realizar, incluso hay objetos que contienen sub objetos, y estos pueden tener
otros sub objetos, etc.
Utilizar Los Objetos
Vamos a utilizar el ejemplo de la fecha que dimos anteriormente, asumamos que creamos un
objeto según las especificaciones que dimos, el objeto que creamos se llama "DatosDeFecha"
Para trabajar con el objeto, primero se debe declararuna variablecomo el tipo de objeto:
Dim objFecha as DatosDeFecha
Con esto el sistema ya sabe que es lo que va a contener tu variable,ahora, para empezara
utilizarla debemos de "Alistarla", esto se hace regularmentecon la instrucción SET, esto es mas
o menos como sacarleuna copiaal objeto, esta copia es la variable y es con la que trabajaremos:
Set objFecha = DatosDeFecha
'Ingresando los datos necesarios
objFecha.FechaDeseada = #01/01/1975#
'Imprimiendo los datos
Debug.Print objFecha.DiasTranascurridos
Debug.Print objFecha.MesesTranscurridos
Debug.Print objFecha.AñosTranscurridos
Debug.Print objFecha.CantidadDomingos
Debug.Print objFecha.NombreDia
'Al terminar de usarlo siempre hay que destruirlo
objFecha = Nothing
Para facilitar la escritura podemos trabajarel objeto con With (ya lo vimos),podría habersido
así:
With objFecha
'Ingresando los datos necesarios
.FechaDeseada = #01/01/1975#
'Imprimiendo los datos
Debug.Print .DiasTranascurridos
Debug.Print .MesesTranscurridos
Debug.Print .AñosTranscurridos
Debug.Print .CantidadDomingos
Debug.Print .NombreDia
End With
Los nombres pudieron haber estado en ingles (si fue un objeto elaborado en ingles), y al ver el
código nos hubieran parecido líneas raras, pero ahora sabemos que solo son datos que estamos
solicitando/obteniendo.
Nota:Si copias lo anteriorobtendrás error porque en tu sistema no existe ningún objeto llamado
"DatosDeFecha", solo lo estamos suponiendo para vercomo es que se usa.
Cuando escribes el nombredel objeto, mejor dicho,la variable declarada como el tipo de objeto
y después escribes el punto (.), se te desplegara la lista de propiedades y métodos que contieneel
objeto
Para dar un ejemplo con un objeto real, veamos un objeto Recordset, con el cual se pueden
manejar los registros de una tabla:
Sub PruebaObjetoRecordset()
'Declaracion de la variable...
'El Recordset es un objeto que esta contenido dentro de un objeto mayor que se llama DAO
Dim rst As DAO.Recordset
'La declaración también se pudo haber hecho así:
'Dim rst As Recordset
'Pero también existeel objeto ADO.Recordset, en algunas ocasiones necesitamos
'trabajar con ambos Recordset,¿Como sabe el sistema con cual es con el que deseamos trabajar?
'Por eso la declaración como la que realizamos
'Abrir el objeto,
'¿Donde están los datos que deseamos manejar?
'manejaremos la tabla clientes, solo le especificamos esto y el objeto se trae los registros...
Set rst = CurrentDb.TableDefs("Clientes")
'Aquí también puedes verque hay una sucesión de objetos
'CurrenteDb = Base de datos, esta contiene al objeto:
'TablaDefs = Colección de todas las tablas
'le especificamos que tomela tabla "Clientes"
'Con el objeto ya disponible, realizamos acciones con sus propiedades y métodos
rst.MoveLast 'ir al ultimo registro
rst.MoveFirst 'ir al primer registro
rst.AddNew 'iniciar un nuevo registro
rst!IdCliente = "CRZTUL" 'ingresando datos en un campo
rst.Update'grabar el registro
rst.Close 'este objeto requiere que lo cerremos
Set rst = Nothing 'destruyendo el objeto
End Sub
Aunque pareceun procedimiento largo y complicado, según lo que hemos explicado, se puede
ver que el objeto lo manejamos en general con:
Dim rst As DAO.Recordset 'declarar la variable
Set rst = CurrentDb.TableDefs("Clientes") 'Inicializar la variable de objeto
...
Set rst = Nothing 'destruir el objeto
Todo lo demás en el medio son puras propiedades y métodos propios del objeto
¿Entendiste?, ¿Difícil?, ¿O ya lo ves diferente?
Hay que tener claro que no todos los objetos se inicializan de la misma manera, hay que
investigarcomo se inicializa cada objeto, el objeto quete interesa.
En este ejemplo se crea un objeto nuevo,mas bien se crea una "Copia nueva"de un objeto
DAO.Recordset, que es la que se encuentra en la variable y es con la que trabajamos
Otra forma para un Recordset:
Dim rst As DAO.Recordset
Set rst = CurrentDb.OpenRecordset("SELECT * FROM Clientes;")
...
Set rst = Nothing
No todos los objetos tienen que crearse como nuevos, algunos podemos obtenerlos por
referencia, pero para haceresto se necesita que el objeto se encuentre abierto:
Un formulario:
Dim frm As Form
Set frm = Forms("Nombre formulario")
'Otra forma:
'Set frm = Forms!NombreFormulario
'Otra forma:
'Set frm = [Forms]![NombreFormulario]
...
Set frm = Nothing
Cuando tomamos un objeto porreferencia,al destruirlo con:
Set frm = Nothing
Realmente no estamos destruyendo el objeto abierto, solo destruimos la variable con la que
estamos teniendo acceso directo a el (referencia)
Un Control:
Dim ctr As Control
Set ctr = Forms!NombreFormulario!NombreControl
...
Set ctr = Nothing
Para usar un control Treeview (árbol) es necesario que primero se inserteel objeto ActiveXen el
formulario luego haces:
Dim objArbol As TreeView
Set objArbol = NombreDelControDeArbolInsertadoEnElFormulario.Object
Etc.,...
Bucles
Los bucles nos sirven para realizan una misma rutina un determinado numero de veces. La mas
simple es For..Next, copia-pega y corre el procedimiento siguiente:
Sub PruebaForNext()
'variable que nos servirá parael bucle
Dim i As Long
'Aquí le estamos diciendo:
'A la variable "i", iníciela con el valor1, termine el bucle cuando valga 5
'la variable quele asignamos predeterminadamente aumentara en 1 unidad en cada vuelta (en
este caso la variable i)
For i = 1 To 5
'imprimir el valor de la variable
Debug.Print "Valor de la variable:"& i
Next i 'indica dar la siguiente vuelta al bucle
End Sub
También tenemos otros tipos de bucles, en los cuales el objetivo no es ir cambiando de valor a la
variablecomo el For Next, el objetivo es cumplir con alguna condición, y hasta que se cumpla
deja de correr el bucle,veamos este ejemplo (copia-pega y corre):
Sub PruebaBucleConCondicion()
Dim i As Long 'variable para el bucle
'Esta es la condición:
'Mientras i sea menor a 10, siga con el bucle
While i < 10
'imprimir el valor de la variable
Debug.Print "Valor de la variable:"& i
'Este tipo de bucle no aumenta predeterminadamente ningún valora la variable,
'solo se esta preocupando por cumplirla condición inicial.
'Aquí nosotros le vamos a aumentar el valora la variable, que será
'igual al valor que ya tiene mas uno. De esta manera conseguiremos que en cada vuelta
'del bucle la variable aumentara de valor en 1 unidad
i = i + 1
'IMPORTANTE:
'Si no le aumentáramos esta unidad, la variable i se quedaría en cada
'vuelta con el valor inicial de cero (su valor de inicio), entonces
'nunca se cumpliría la condición inicial y el buclecorrería eternamente...
'trabaría el sistema, esto es lo que hay quecuidarcon los bucles con condiciones
Wend
End Sub
Lo prometido es deuda, aquí les pongo un bucle para llenar datos de a una matriz:
Sub PuebaMatrizConBucle()
Dim mtzNumeracion(9) As String 'matriz de 10 filas
Dim i As Long 'variable para correrel bucle
'Cargar los datos de la matriz...
'vamos desde 0 hasta el limite de la matriz
'¿Porque desde cero?, porque el primer elemento de las matrices es cero
For i = 0 To UBound(mtzNumeracion)
'cargar el numero
mtzNumeracion(i) = "Elemento numero:"& i
Next i
'Imprimir los datos de la matriz
For i = 0 To UBound(mtzNumeracion)
'imprimir en la ventana Inmediato
Debug.Print mtzNumeracion(i)
Next i
End Sub
Existen varios tipos de bucles (aquí solo vimos dos), dondese pueden definir diferentes criterios
para que el bucle siga dando vueltas en la misma rutina.
Colecciones
Las colecciones son objetos quepodemos compararcon matrices de una sola columna, la
ventaja es que son mas flexibles para agregary consultardatos, podemos ingresarles elementos
antes o después de alguna fila existente,también le podemos dar un código de identificación y
acceder a los elementos por este código, y no solo por el numero de fila como las matrices. La
primera fila inicia en uno.
Veamos un ejemplo (copia,pega y corre):
Sub PruebaColeccion()
Dim colPrueba As Collection
Dim strCodigo As String
Dim i As Long
'Inicializamosla variable para el objeto Collection
Set colPrueba = New Collection
'llenaremos 5 elementos porbucle
For i = 1 To 5
'El código en cada elemento es opcional pero se lo agregaremos para esteejemplo
strCodigo = "Código" & i
'Si solo agregamos elementos sin especificar la posición, el elemento se crea al final
colPrueba.Add "Elemento por bucle numero:"& i, strCodigo
Next
'ahora vamos a agregarun nuevo elemento, se lo agregaremos al inicio
colPrueba.Add "Agregado después del bucle", "CodigoDiferente", 1
'Imprimir los datos
'vamos desde el primerelemento hasta el ultimo contenido
For i = 1 To colPrueba.Count 'total de elementos contenidos
Debug.Print "Elemento número "& i & " = " & colPrueba(i)
Next i
'Imprimir un elemento llamándolo por el código
Debug.Print "Elemento llamado por su código (CodigoDiferente) = " &
colPrueba("CodigoDiferente")
Set colPrueba = Nothing 'destruyendo el objeto
End Sub
Instrucciones De Condición
Con estas instrucciones podemos ordenarleal sistema que evalúe resultados, y dependiendo de
lo que se obtenga que haga una cosa u otra. Entre estas tenemos:
IF... T HEN... ELSE
Que mas o menos quiere decir:
SI (Esta condición es verdadero) ENTONCES (Haga esto) SI NO SE CUMPLIO (Haga esto)
Lo usaríamos así:
SI (Esta condición es verdadero) ENTONCES
(Haga esto)
SI NO SE CUMPLIO
(Haga esto)
TERMINAR SI
Y a en líneas de código:
IF (Esta condición es verdadero) THEN
'aquí lo que quieres que se ejecute si la condición es verdadera
ELSE
'aquí lo que quieres que se ejecute si la condición es falsa
END IF
Sub PruebaIF()
If10 > 8 Then
Debug.Print "La condición SI se cumple"
'aquí también se pueden meterotros IF si fuera necesario
Else
Debug.Print "La condición NOse cumple"
'aquí también se pueden meterotros IF si fuera necesario
End If
End Sub
Hay ocasiones en deseamos hacer un análisis a un dato, y deseamos actuar de diferente manera
según sea el valor. Para esto podemos usar:
SELECT CASE
Un ejemplo lo muestramas claro:
Sub PruebaSelectCase()
Dim bytPrecio As Byte
bytPrecio = 15 'este valor lo puedes ir variando para hacerpruebas
'Segun el valor del precio imprimiremos una nota...
'Analizar el valor contenido en la variable"bytPrecio"
Select Case bytPrecio
Case 0 'si el precio es cero
Debug.Print "Es regalada"
Case 1 'si es igual a uno
Debug.Print "Es casi regalado"
Case 2, 3, 4 'si es igual a 2, 3 o 4
Debug.Print "Esta a buen precio"
Case Is < 10 'si es menor a 10
Debug.Print "Un precio justo"
Case Else 'cualquier otra posibilidad
Debug.Print "Precio fuera de rango, no compres"
End Select
End Sub
Enumerados
Un enumerado nos sirve para mostrar una lista que se nos desplega mientras estamos
escribiendo, esta lista tienevarias opciones donde debemos seleccionar solo un elemento,esto
nos facilita la escritura del código y nos limita las opciones a escogera solo valores validos.
Hagamos esta prueba, escribamos a mano en la ventana de inmediato:
docmd.selectobject acForm
Esta es una instrucción que le dice al sistema que seleccione un objeto de Access.
Te pudiste dar cuentaque cuando escribiste el espacio (después de docmd.selectobject) te
desplegó un lista donde aparecían los nombres de los objetos que podemos seleccionar, eso es
un enumerado, una lista que nos permite verque opciones tenemos con nombre y escoger el
elemento que nos interesa.
Un enumerado debe crearsea nivel de modulo. Creemos este enumerado:
'Las primeras dos líneas están puestas solo para que se vea que el enumerado esta a nivel de
modulo
Option Compare Database
Option Explicit
Enum enuMensaje
mBajo
mMedio
mAlto
End Enum
El primer elemento del enumerado toma el valor cero, el siguiente toma el valor del elemento
anterior +1 (en este caso seria uno), etc.Estos valores son predeterminados, pero si nosotros
deseamos podemos cambiarles el valor, lo haríamos así:
Enum enuMensaje
mBajo = -1
mMedio = 10
mAlto = 20
End Enum
Con esto ya podemos crear una variable y declararla como tipo "enuMensaje"en donde
necesitemos. Copia y pega esteprocedimiento:
Sub PruebaEnumerado(TipoMensaje As enuMensaje)
'Metemos al Select la variabledel parámetro y hacemos algo
'según sea el valor que venga
Select Case TipoMensaje
Case mBajo
Debug.Print "sin importancia"
Case mMedio
Debug.Print "Tomar en cuenta"
Case mAlto
Debug.Print "MENSAJE CRITICO!"
End Select
End Sub
Ahora escribe a mano esto en la ventana Inmediato:
PruebaEnumerado mBajo
Pulsas enter...
Prueba con las 3 opciones...
Control De Errores
Hay varias razones por las que puedeocurrir un error en un procedimiento, olvidamos poner un
valor necesario, asignamos valores que no corresponden, manejamos mal un objeto, etc.
Cuando ocurreun error, el sistema predeterminadamente se detiene, abre la ventana VBA y nos
lleva a la línea donde ocurrió el error, dicha línea también la pinta de amarrillo, de esta manera
podemos realizar los cambios quesean necesarios. ¿Pero que pasa si el errorocurre en una
aplicación que has hecho para otras personas?, ellos no tienen porque verel código.
Para evitar esto podemos controlar los errores con algunas rutinas, allí nosotros le diremos que
es lo que queremos que el sistema haga cuando ocurra un error.
Las rutinas de errores son muy importantes porquelos errores pueden ser inesperados, puede
ser que en tu computadora corra un procedimiento sin problemas, pero al llevar tu base de datos
a otra computadora con otras propiedades ocurra algún error, porel sistema operativo de otra
versión, Office de otra versión, librerías, dll, etc.
Empecemos porpasos,
GoT o (Ir Hacia) y Etiquetas De Línea
GoTo (Ir Hacia):Le indica al sistema que salte hacia una Etiqueta de Línea
Etiqueta De Línea: Es un nombre cualquierafinalizado con dos puntos (:)
Veamos un ejemplo, copia, pega y prueba este procedimiento:
Sub PruebaSaltoPorEtiquetas()
GoTo SoyEtiquetaDeLinea 'Ir hacia la etiqueta especificada
MsgBox "Mostrando el Primer mensaje"
SoyEtiquetaDeLinea: 'Etiqueta, puede tener cualquier nombre
MsgBox "Mostrando el Segundo mensaje"
End Sub
Como te pudiste dar cuenta al correr el procedimiento, el primer mensaje nunca se mostró,esto
es porque en la primera línea del procedimiento se le esta indicando con GoTo que se valla a la
etiqueta "SoyEtiquetaDeLinea"y con esto se esta saltando el primer mensaje
¿Claro?, veamos un segundo ejemplo,copia-pega y prueba el siguienteprocedimiento, sigue la
secuencia de saltos de línea:
Sub PruebaSaltoPorEtiquetasDos()
'Saltar hacia la etiqueta que esta al final del procedimiento
GoTo Etiqueta_Del_Final
Etiqueta_Del_Inicio:
MsgBox "Mostrando el Primer mensaje"
'Salir de procedimiento
Exit Sub
Etiqueta_Del_Final:
MsgBox "Mostrando el Segundo mensaje"
'Saltar/regresar hacia la etiqueta que se encuentraal inicio
GoTo Etiqueta_Del_Inicio
End Sub
En este procedimiento podemosobservar que en la primera línea se salta hacia una etiqueta al
final, de allí se hace otro salto hacia una etiqueta que se encuentra al inicio.
Importante:
Hay que tener mucho cuidado en los saltos hacia atrás, si te das cuenta en el ejemplo, al hacer el
salto hacia atrás hay un "Exit Sub" que sirve para salir del procedimiento, si no existiera, el
procedimiento correría infinitamente porque cada vez que llega al final vuelve a saltar hacia el
inicio
Objeto Err (Error)
Existe un objeto llamado Err (Error) que siempre esta presente, este objeto tienes varias
propiedades que predeterminadamente se encuentran vacías, cuando ocurre cualquier error el
sistema llena estas propiedades para que nosotros podamos consultarlas y saber que es lo que
ha ocurrido. Hagamos esta prueba, en la ventana Inmediato escribe:
? Err.Number
Pulsamos Enter, nos imprime el valor cero. Este valorquiere decir que no hay
ningún error disponible, no a ocurrido ningún error.
Todos los errores están identificados con un valor que es un numero entero.
Activar Una Rutina De Errores
Una rutina de error se activa con la sentencia OnError. Hay varias formas de manejar las rutinas
de error, vamos a analizar una de las mas comunes (si creas un control con el asistente Access
automáticamentete creauna rutina de error como esta):
Copia-pega y analiza este procedimiento,
Sub ComprendiendoUnaRutinaDeErrorComun()
'Las palabras "On Error"activan la rutina de error, la siguientelínea dice:
'Al ocurrirun error(en cualquierlugar) saltara la etiqueta "Tratamiento_Error"
On Error GoTo Tratamiento_Error
'Aquí el cuerpo de procedimiento...
Salir_Del_Procedimiento:
'Si no ocurre ningún errorllegamos a esta etiqueta limpiamente y salimos del procedimiento
(con Exit Sub), esto
'porque no necesitamos llegar a la parte donde se trata el error
'Al ocurrir un error, el sistema pasaraa las líneas del tratamiento del error, desde allí se
regresara
'a este punto (con la instrucción Resume)
'Podemos aprovechar este espacio para realizar algunas cosas como desvincular variables o
cerrar objetos,
'porque esas son cosas que necesitamos hacer antes de cerrarun procedimiento, haya erroro
no
'Aquí la líneas para resolvercualquier cosa antesde salir, porquesiempre se pasara por este
punto...
Exit Sub
Tratamiento_Error:
'Aquí se llega solo si ha ocurrido un error...
'Desplegar un mensaje con la descripción del error
MsgBox Err.Description
'La palabra Resume hace dos cosas:
'Elimina el error y hacer un salto hacia la etiqueta especificada
Resume Salir_Del_Procedimiento
End Sub
Otro metodo comun de manejar errores es con:
On Error Resume Next
Que es como decirle al sistema "Cuando ocurra un error, siga la ejecución del procedimiento en
la línea siguiente de donde se origino el error". Muy útil cuando trabajamos con objetos.
Con la primer rutina al ocurrir un errorel sistema va hacia la rutina del errorluego se sale del
procedimiento, pero a veces necesitamos que aunque ocurra un error el sistema siga ejecutando
las demás líneas del procedimiento, es cuando podemo s usar"On Error Resume Next"
Haremos un ejemplo, vamos a probar dos procedimientos quetienen un cuerpo idéntico pero
con diferente manejo de errores, copia-pega y corre:
Sub PruebaOnErrorGoTo()
On Error GoTo Tratamiento_Error
Dim rst As DAO.Recordset 'variable para manejar los datos/registros de una tabla
'Asignamos la tabla de donde agarraremos los datos/registros
'Aquí se originara un errorporque la tabla de nombre "Inexistente"no existe
Set rst = CurrentDb.TableDefs("Inexistente")
MsgBox "Este mensaje esta puesto después del error"
Salir_Del_Procedimiento:
Set rst = Nothing 'desvincular variable
Exit Sub
Tratamiento_Error:
MsgBox "Error ocurrido:"& Err.Description
Resume Salir_Del_Procedimiento
End Sub
Sub PruebaOnErrorResumeNext()
On Error Resume Next
Dim rst As DAO.Recordset 'variable para manejar los datos/registros de una tabla
'Asignamos la tabla de donde agarraremos los datos/registros
'Aquí se originara un errorporque la tabla de nombre "Inexistente"no existe
Set rst = CurrentDb.TableDefs("Inexistente")
MsgBox "Este mensaje esta puesto después del error"
Set rst = Nothing 'desvincular variable
End Sub
Corriendo el primerprocedimiento nos lanza un mensaje, el mensaje que indica el error que
acaba de ocurrir, este mensaje esta puesto en las líneas donde se trata el error.
Corriendo el segundo procedimiento, se generael mismo error pero el sistema no se detiene y
sigue con las líneas de código y nos muestra el mensaje que esta puesto en la línea debajo de
donde se origino el error.
Algunos Tips
Continuar Líneas Largas En La Siguiente Línea
Algunas líneas son tan largas que se salen del área de pantalla,para tenerlo todo a la vista
puedes cortar una línea escribiendo un espacio seguido de un guión bajo ( _):
Sub PruebaContinuandoLineas()
'Una línea larga:
'Aquí se encuentra una línea que puede llegara salirse de la pantalla porque al autor se le
ocurrio que debía hacer muchoscomentarios paradejar bien claro lo que tenia que decir
'La misma línea larga:
'Aquí se encuentra una línea que puede llegara salirse de la _
pantalla porqueal autor se le ocurrió que debía hacer muchos _
comentarios para dejarbien claro lo que tenia quedecir
MsgBox _
"Este es un mensaje donde se muestra como cortarlíneas"
End Sub
De esta manera lo puedes hacercon cualquier línea, en cualquier parte de la línea, media vez no
cortes ninguna palabrapor el medio porque así no funcionaria
Juntar Varias Líneas En Una Línea
Se puede juntar dos o mas líneas aunque no tengan ninguna relación,solo debes colocardos
puntos ( : ) al final de la línea:
Sub PruebaJuntandoLineas()
'Normal
Debug.Print "Mensaje Uno"
Debug.Print "Mensaje Dos"
MsgBox "Mensaje Tres"
Debug.Print "-------------------"
'Juntando líneas
Debug.Print "Mensaje Uno": Debug.Print "Mensaje Dos": MsgBox "Mensaje Tres"
End Sub
Objeto DoCmd
Esta es una objeto exclusivo de Access que te permite realizarmuchas acciones. Haz esta
prueba, escribe:
Docmd.
Al escribir el punto te apareceuna lista larga con cosas quepuedes realizar, allí tienes un bonito
tema para explorar. Si usas por ejemplo:
DoCmd.RunCommand "Parámetro"
Esta opción te permite realizar cualquier acción de los menús, como que dieras un clic en algún
elemento.En el parámetro opción te aparecerá un enumerado con todas las acciones de los
menús
ME (Palabra para referirse al formulariodel Módulo Asociado Actual)
Me es una palabra que solo puedes usaren los Módulos Asociados (Módulos que están ligados a
los formularios), e indica que vas a usar explícitamenteel objeto formulario al que pertenece el
modulo asociado en el que estas actualmente.
Para usar un objeto de formulario (como vimos antes) harías:
Dim frm as Form
Set frm = Forms!UnFormulario
frm.UnControl.Visible = True
Al escribir frm. se te desplega el listado de propiedades, métodos y sub objetos para el objeto
frm (Un objeto de tipo formulario)
Si estas en un modulo asociado y deseas trabajarcon el objeto formulario al que pertenece
harías:
Me.UnControl.Visible = True
Que seria como decir:
Con este formulario.UnControl.Visible = True
Estas haciendo referencia a un objeto formulario, el formulario actual.
Usar La Ayuda De Manera Fácil y Directa
Si estas observando un código y tienes algunaduda sobre algo queves, solo haz clic en la
palabra, pulsas la tecla F1 y se mostrara automáticamente la ayuda para ese tema, para la
palabra que seleccionaste con un clic. Haz la prueba, haz clic por ejemplo sobrela palabra
MsbBox (después pulsas F1)
¿Viste?, así podrás especializarte en el cualquier tema de los que hemos tocado aquí o en el que
desees, ahora que ya llegastea esta parte, ¡Eres libre para explorar!, bie nvenid@al mundo de la
programación...
Finalizando
El unico "Pero"de escribir artículos como estees que casi siempre se le ha ido por alto algún
tema y hay que estar actualizando... si alguien se da cuenta de algo porfavor me comunica, así
ayudamos a todos
En este articulo iba a explicarcomo se crea un objeto con un modulo de clase,pero al final me
pareció queesto ya seria un tema muy especifico, así que lo voy a escribir pero en un articulo
diferente
Saludos, Byron

Más contenido relacionado

La actualidad más candente

pasos para hacer una mini agenda en visual basic 6.0
pasos para hacer una mini agenda en visual basic 6.0pasos para hacer una mini agenda en visual basic 6.0
pasos para hacer una mini agenda en visual basic 6.0
yeimimorel
 
Pasos Para La Conecxion De Visual Con Access Importante 12
Pasos Para La Conecxion De Visual Con Access Importante 12Pasos Para La Conecxion De Visual Con Access Importante 12
Pasos Para La Conecxion De Visual Con Access Importante 12
guest035fce1
 

La actualidad más candente (20)

1 programa de sumar y restar
1 programa de sumar y restar1 programa de sumar y restar
1 programa de sumar y restar
 
revista base de datos y visual studio
revista base de datos y visual studiorevista base de datos y visual studio
revista base de datos y visual studio
 
20091223 Creacion De Bibliotecas Parametricas En Catia
20091223 Creacion De Bibliotecas Parametricas En Catia20091223 Creacion De Bibliotecas Parametricas En Catia
20091223 Creacion De Bibliotecas Parametricas En Catia
 
pasos para hacer una mini agenda en visual basic 6.0
pasos para hacer una mini agenda en visual basic 6.0pasos para hacer una mini agenda en visual basic 6.0
pasos para hacer una mini agenda en visual basic 6.0
 
Guia no2 ado.net
Guia no2 ado.netGuia no2 ado.net
Guia no2 ado.net
 
Jasreport
JasreportJasreport
Jasreport
 
CONTROLES COMUNES VISUAL BASIC
CONTROLES COMUNES VISUAL BASICCONTROLES COMUNES VISUAL BASIC
CONTROLES COMUNES VISUAL BASIC
 
95511389 visual-foxpro-trucos
95511389 visual-foxpro-trucos95511389 visual-foxpro-trucos
95511389 visual-foxpro-trucos
 
Practica susan
Practica  susanPractica  susan
Practica susan
 
Macros
MacrosMacros
Macros
 
Jueves
JuevesJueves
Jueves
 
Microsoft Excel Avanzado
Microsoft Excel AvanzadoMicrosoft Excel Avanzado
Microsoft Excel Avanzado
 
Curso de excel avanzado tema 6 macros
Curso de excel avanzado tema 6 macrosCurso de excel avanzado tema 6 macros
Curso de excel avanzado tema 6 macros
 
8
88
8
 
Curso taller vba macros
Curso taller vba macrosCurso taller vba macros
Curso taller vba macros
 
Fundamentos de visual basic
Fundamentos de visual basicFundamentos de visual basic
Fundamentos de visual basic
 
Creando macros
Creando macrosCreando macros
Creando macros
 
Caraline Cañas
Caraline CañasCaraline Cañas
Caraline Cañas
 
Guia para programar_vba_excel
Guia para programar_vba_excelGuia para programar_vba_excel
Guia para programar_vba_excel
 
Pasos Para La Conecxion De Visual Con Access Importante 12
Pasos Para La Conecxion De Visual Con Access Importante 12Pasos Para La Conecxion De Visual Con Access Importante 12
Pasos Para La Conecxion De Visual Con Access Importante 12
 

Similar a Aprender código vba

Java class library
Java class libraryJava class library
Java class library
LCA
 
Programacinconvisualbasicparaaplicacionesenexcelprogramacinpuraconexcel 12071...
Programacinconvisualbasicparaaplicacionesenexcelprogramacinpuraconexcel 12071...Programacinconvisualbasicparaaplicacionesenexcelprogramacinpuraconexcel 12071...
Programacinconvisualbasicparaaplicacionesenexcelprogramacinpuraconexcel 12071...
Fernando Velasquez
 
Programación con visual basic para aplicaciones en excel programación pura_c...
Programación con visual basic para aplicaciones en excel programación  pura_c...Programación con visual basic para aplicaciones en excel programación  pura_c...
Programación con visual basic para aplicaciones en excel programación pura_c...
Giovana Pinella
 

Similar a Aprender código vba (20)

Taller de macros
Taller de macrosTaller de macros
Taller de macros
 
Java class library
Java class libraryJava class library
Java class library
 
Taller macro
Taller macroTaller macro
Taller macro
 
Macros
MacrosMacros
Macros
 
Macros de excel
Macros de excelMacros de excel
Macros de excel
 
Programacinconvisualbasicparaaplicacionesenexcelprogramacinpuraconexcel 12071...
Programacinconvisualbasicparaaplicacionesenexcelprogramacinpuraconexcel 12071...Programacinconvisualbasicparaaplicacionesenexcelprogramacinpuraconexcel 12071...
Programacinconvisualbasicparaaplicacionesenexcelprogramacinpuraconexcel 12071...
 
Programación con visual basic para aplicaciones en excel programación pura_c...
Programación con visual basic para aplicaciones en excel programación  pura_c...Programación con visual basic para aplicaciones en excel programación  pura_c...
Programación con visual basic para aplicaciones en excel programación pura_c...
 
Tecno
TecnoTecno
Tecno
 
Juan david mosquera flor
Juan david mosquera florJuan david mosquera flor
Juan david mosquera flor
 
Trabajo de tecnologia(macro)
Trabajo de tecnologia(macro)Trabajo de tecnologia(macro)
Trabajo de tecnologia(macro)
 
Juan david mosquera flor
Juan david mosquera florJuan david mosquera flor
Juan david mosquera flor
 
Macro
MacroMacro
Macro
 
Microsoft Excel
Microsoft ExcelMicrosoft Excel
Microsoft Excel
 
Taller macro
Taller macroTaller macro
Taller macro
 
Tecnologia trabajo de macros
Tecnologia trabajo de macrosTecnologia trabajo de macros
Tecnologia trabajo de macros
 
word macro rueda
word macro ruedaword macro rueda
word macro rueda
 
TALLER MACRO RUEDA
TALLER MACRO RUEDATALLER MACRO RUEDA
TALLER MACRO RUEDA
 
Tecnologia trabajo de macros
Tecnologia trabajo de macrosTecnologia trabajo de macros
Tecnologia trabajo de macros
 
T
TT
T
 
Macros en Excel
Macros en ExcelMacros en Excel
Macros en Excel
 

Último

redes informaticas en una oficina administrativa
redes informaticas en una oficina administrativaredes informaticas en una oficina administrativa
redes informaticas en una oficina administrativa
nicho110
 

Último (12)

PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptxPROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
PROYECTO FINAL. Tutorial para publicar en SlideShare.pptx
 
Avances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvanaAvances tecnológicos del siglo XXI 10-07 eyvana
Avances tecnológicos del siglo XXI 10-07 eyvana
 
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptxEL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
EL CICLO PRÁCTICO DE UN MOTOR DE CUATRO TIEMPOS.pptx
 
Avances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estosAvances tecnológicos del siglo XXI y ejemplos de estos
Avances tecnológicos del siglo XXI y ejemplos de estos
 
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
Resistencia extrema al cobre por un consorcio bacteriano conformado por Sulfo...
 
redes informaticas en una oficina administrativa
redes informaticas en una oficina administrativaredes informaticas en una oficina administrativa
redes informaticas en una oficina administrativa
 
Buenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptxBuenos_Aires_Meetup_Redis_20240430_.pptx
Buenos_Aires_Meetup_Redis_20240430_.pptx
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNIT
 
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptxEVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
EVOLUCION DE LA TECNOLOGIA Y SUS ASPECTOSpptx
 
How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.How to use Redis with MuleSoft. A quick start presentation.
How to use Redis with MuleSoft. A quick start presentation.
 
Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21Innovaciones tecnologicas en el siglo 21
Innovaciones tecnologicas en el siglo 21
 
investigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXIinvestigación de los Avances tecnológicos del siglo XXI
investigación de los Avances tecnológicos del siglo XXI
 

Aprender código vba

  • 1. Aprender código VBA Introducción Manual de VBA (Visual Basic para Aplicaciones) para Microsoft Access Con este artículo pretendo quelas personas puedan inicializarse en la programación con código VBA y que aunque sean principiantespuedan interpretar cualquier código que se les presente. Para ello intentare usar el lenguaje más sencillo posible para que sea mas claro para todos. No pretendo enseñar todos los detalles, solo pretendo "Abrirles la puerta"para que vean este gran mundo, y con el camino indicado puedan descubrir muchas cosas por su cuenta ¿Porque leer este artículo? Porque intento que las personas aprendan todo de manera general en tiempo record Para continuar es necesario que el usuario haya hecho cosas sencillas en Access, como macros formularios, no es necesario saber mucho Tampoco es un articulo solo para principiantes,espero abarcarvarios puntos y al finalizar espero que todos estén preparados para el siguiente articulo (Aprendiendo Funciones API), así que es mejor que todos lo lean Importante: Conforme se vallan tocando los temas quizá quieras profundizar mas en algo e investigar al respecto,te sugiero que te aguantes las ganas, espera a leer/terminar todo el articulo.Esto es porque los temas los voy a tocarde manera básica,para que tengas el concepto general y puedas relacionarlo con los demás temas, de esta manera lograras entendertodo sin complicaciones. Luego de terminar este articulo y haberlo comprendido, ya podrás especializarte en cualquier tema o quizá ya empieces a generar tus códigos, y conforme vas avanzando se te irán presentando los temas para que profundices. Iniciamos... Parte I ¿Que son las macros? Las macros son objetos que nos permiten realizar diferentes acciones, si ves una macro en vista de diseño veras quehay un campo llamado "Acciones", campo quese puede desplegar y te aparece el listado de las opciones de lo que puedes realizar. En realidad estas acciones son procedimientos internos,líneas de código o instrucciones queel programa seguirá y ejecutara. ¿Cual es el límite de las Macros? Pues el total de acciones que te aparecen en la "Lista de las Acciones", aunque combinando diferentes Acciones se convierten en muchas posibilidades Nosotros podemos escribir directamenteestas acciones en procedimientos (líneas de código o instrucciones),tendremos a disposición todas las opciones que nos dan las macros y muchas mas, las posibilidades se hacen casi infinitas. Cuando nosotros empezamos a escribirlos procedimientos es cuando empezamos a sentir que tomamos el verdadero control de las cosas, una vez que has iniciado no vuelves atrás,las macros casi pasan al olvido porquete parecerán que se quedan muy cortas. Escribiendo tus procedimientos pasas de ser un usuario(a) a programador(a). ¿Interesante verdad?, bueno,estas a punto de se parte de todo eso...
  • 2. Para iniciar, crea una base de datos nueva que nos servirápara realizar pruebas, recuerda que no debes borrarnada de lo que vallamos realizando, porque vamos a ir reutilizando ejem plos Convirtiendo Macros a Procedimientos de Código Como mencionábamos antes, las macros son en realidad procedimientos de código, estos procedimientos se escriben en los objetos llamados "Módulos". Vamos a realizar lo siguiente: Creemos una nueva macro, en la lista de Acciones escogemos "Bip", le damos guardar, ahora nos pide un nombre para la macro, le ponemos como nombre "Bip" y por ultimo cerrar. Si corremos la macro (doble clic) nos dará un sonido (Es la acción que escogimos). Ahora démosle un clic secundario a la macro, en el menú contextual que se nos desplega escogemos la opción "Guardar como", nos aparecerá un formulario, allí le ponemos el nuevo nombre, pongámosle"Procedimiento de la macro Bip", el cuadro combinado de abajo que tiene como nombre "Como", lo desplegamos y escogemos la opción "Módulo", le damos Aceptar, ahora nos aparece un formulario con dos checks, desmarca los dos y pulsamos el botón "Convertir". Si se quedo en la ventana VBA vacía, dale cerrar(arriba en la "X") En la ventana principal de Access nos aparecen los diferentes objetos (Tablas, Consultas, Formularios, Informes, Páginas,Macros y Módulos),vamos a los objetos "Módulos"y nos aparece el modulo de la macro convertida, si le damos doble clic nos abrirá el modulo y podremos observar algo como esto: '------------------------------------------------------------ ' Bip ' '------------------------------------------------------------ Function Bip() Beep End Function Este es el procedimiento interno queesta corriendo la macro "Bip". Como Se Escriben Los Procedimientos Analicemos el procedimiento queacabamos de crear al convertirla macro: Las primeras líneas inician con un apostrofe ( ' ), esto le indica al sistema que no son líneas para ejecutar, simplemente son notas o apuntes quepodemos utilizarpara dar alguna descripción de lo que hará el procedimiento o notas personales,si las borráramos no pasaría nada, no influyen en la ejecución del procedimiento. Estas notas las podemos colocaren cualquier lugar, fuera o dentro del procedimiento. Las reconocemos fácilmenteporqueaparecen en el código en color verde El procedimiento en si contienelas 3 líneas: Línea 1: Function Bip() Es la declaración del procedimiento, donde la palabra "Function"esta indicando queinicia un procedimiento, la palabra"Bip" es el nombre del procedimiento.Los nombres no pueden contenerespacios en blanco y tampoco pueden tener nombres de palabras reservadas por el sistema. Por ultimo tenemos los paréntesis, todos los procedimientos deben terminarcon paréntesis. Hagamos lo siguiente, cambiémosle el nombre al procedimiento, cambiemos la palabra"Bip" por "EmitirSonido" Línea 2: Beep
  • 3. Es el cuerpo del procedimiento o las instrucciones (en realidad la palabra Beep es una instrucción quele ordenaal sistema que emita un sonido), en este caso el cuerpo del procedimiento es de solo una línea, pero puedeser cualquier cantidad Línea 3: End Function Aquí estamos indicando que termina el procedimiento Corriendo/Ejecutando Un Procedimiento Para que puedas correr/ejecutar/probarun procedimiento, haz clic en cualquiera de sus líneas, esto es para seleccionarel procedimiento (porquepuedes tenermuchos), luego tienes cualquiera de estas 3 opciones: 1. Ir al menú:Ejecutar/Ejecutar Sub/UserForm 2. Pulsar la tecla F5 3. O en la barra de herramientas pulsa el triangulo verde Haz la prueba con las 3 opciones,correel procedimiento anterior, ¿Todo correcto?, ok, continuamos... En el mismo modulo podemos escribir muchos procedimientos, pero mejor vamos a crear un nuevo modulo quenos servirá para realizarnuestras pruebas: Antes vamos a realizar un ajuste,no tienes que entenderlo ahora, te lo explicare mas adelante. Siempre en la ventana VBA vamos al menú: Herramientas/Opciones/Pestaña Editor/Requerir declaración de variables Este es un check que debes activar,le das aceptar. Démosle cerrara la ventana VBA, nos quedamos siempreen la ventana principal de Access en los objetos módulos, pulsemos "Nuevo", nos abre de nuevo la ventanaVBA en un modulo nuevo, pulsamos el botón de guardar, le ponemos como nombre "Mis primeras pruebas". En el modulo que acabas de crear te aparecen dos líneas inicialmente: Option Compare Database Option Explicit En este momento no les hagas caso,lo explicaremos mas adelante.Los procedimientos quese crean en el modulo deben quedar abajo de estas líneas. Ahora escribamos nuestro primerprocedimiento, copia y pegael procedimiento siguiente: Sub MiMensaje() MsgBox "Este es mi primer mensaje, voy muy bien!" End Sub Corre el procedimiento como lo hicistecon el anterior... ¿Que tal?, La instrucción MsgBox le dice al sistema que nos muestreun mensaje Aquí seguro que ya viste una diferencia, en el primer procedimiento lo declarábamos así: Function EmitirSonido() Y ahora lo estamos haciendo así: Sub MiMensaje() Exacto, existen dos tipos de procedimientos, Sub y Function. Con los dos podemos escribir cualquiertipo de líneas de código (instrucciones), una de las diferencias es que los procedimientos Function además nos pueden devolverun valor (mas adelante profundizaremos en el tema de devolución de valores). Seguimos con las pruebas, copia y pega estos procedimientos:
  • 4. Function TextoDelMensaje() TextoDelMensaje = "Y o soy el texto" End Function Sub MostrarMensaje() Msgbox TextoDelMensaje End Sub (Recuerda que para correr un procedimiento primero debes hacer clic sobrecualquiera de sus líneas para que el sistema sepa cual es el que estas seleccionando) Corre el procedimiento Function TextoDelMensaje()... parece queno pasa nada. Ahora corre el procedimiento Sub MostrarMensaje()... nos muestra un mensaje con el texto que esta escrito dentro del otro procedimiento Function. ¿Que es lo que esta pasando? Si ves el cuerpo del procedimiento Function,el procedimiento se esta asignando a si mismo un valor de texto, ahora solo hay que recogereste valor y hacer algo con el. Esta la forma en que los procedimientos Function devuelven un valor. En el cuerpo del procedimiento Sub: Msgbox TextoDelMensaje Primero le decimos al sistema que queremos que nos muestreun mensaje con la instrucción MsgBox, inmediatamentedespués la instrucción nos pide una cadena de texto para mostraren el mensaje, como cadena de texto estamos escribiendo el nombrede la Function,porque sabemos que esta nos esta devolviendo una cadena de texto. Cuando corrimos por primera vez la Function si realizo algo, se asigno su valor, pero ya hubo no nada más. Esto que acabamos de ver es lo mas básico y elemental en procedimientos, debes saberlo de memoria, igual que sabes cuanto es 1+1 Antes de continuar debemos aprender como usar la ventana de "Inmediato", que también nos sirve para realizar pruebas. Usando La Ventana Inmediato Estando siempre dentro de la ventana de VBA, podemos verla ventana de inmediato con cualquiera de estas opciones: 1. Ir al menú Ver/Ventana Inmediato 2. Pulsar la combinación de teclas Ctrl+G La ventana de Inmediato nos aparece en la parte inferior de la ventana VBA. Empecemos a utilizarla, en el procedimiento queescribimos anteriormente(el primero del modulo): Sub MiMensaje() MsgBox "Este es mi primer mensaje, voy muy bien!" End Sub Ahora cambiaremos MsgBox por Debug.Print, nos quedara así: Sub MiMensaje() Debug.Print "Este es mi primer mensaje, voy muy bien!" End Sub Corremos el procedimiento y podemos veren la ventana de inmediato que allí se escribió el mensaje. Ahora intentemos esto, directamente en la ventana de inmediato escribamos:
  • 5. Debug.Print 5 + 5 Y presionamos Enter, nos imprime(muestra en la ventanainmediato) el valor10 Ahora escribamos: Debug.Print TextoDelMensaje Y presionamos Enter Ahora escribamos: ? 5 + 5 Y presionamos Enter, nos volvió a imprimir el 10. El signo de interrogación es lo mismo que escribir Debug.Print,lo único es que puedes usarlo solo directamente en la Ventana Inmediato, no funciona dentro del código Por ultimo escribamos: MostrarMensaje Y presionamos Enter Te pudiste dar cuentaque esta es otra forma de correr un procedimiento. ¿Todo Correcto?, ¿Fácil no? Puedes borrarel texto de la ventana inmediato como has borrado cualquier texto, en cualquier momento, en el momento que gustes Utilizando Variables Las variables nos sirven para abrir un espacio de memoria donde podemos guardaralgún valor que utilizaremos después. Copia y pega los dos procedimientos siguientes, correlos y analiza lo que esta pasando: Sub PruebaVariableUno () Dim MiTotal 'declaración de la variable, siempre inicia con "Dim" mas el nombre de la variable MiTotal = 10 * 10 'Aquí le estamos asignando un valor de 100 a la variable Debug.Print MiTotal 'Mostramos el valorde la variable en la ventana inmediato MiTotal = 50 + 3 'Le estamos cambiando el valor a la variable Debug.Print MiTotal MiTotal = MiTotal + 10 'El valor de la variable es igual al valor que ya tiene,mas 10 Debug.Print MiTotal End Sub Sub PruebaVariableDos() Dim MiTotal 'declaración de la variable, siempre inicia con "Dim" mas el nombre de la variable Dim UnNumero MiTotal = 5 + 5 UnNumero = 5 + 5 Debug.Print MiTotal + UnNumero Debug.Print MiTotal * UnNumero Debug.Print MiTotal - UnNumero Debug.Print MiTotal / UnNumero End Sub T ipos De Variables Los diferentes tipos de variables abren diferentes espacios en memoria, algunas consumen más memoria que otras, porlo que para hacer más eficientetu aplicación debes ir aplicando a tus variables el tipo necesario. Entre los tipos de variables tenemos:
  • 6. Boolean (Falso/Verdadero) Byte (Bite) Integer (Entero) Long (Entero Largo) Currency (Moneda,acepta hasta 4 decimales) Single (Simple, acepta más decimales que el tipo Currency) Double (Doble, acepta mas decimales que el tipo Single) Date (Fecha y Hora) String (Cadena, Texto) Object (Objeto) Variant (Variante, acepta cualquier tipo de valor) Para conocer los rangos exactos de los valores que acepta cada tipo de variable consulta después la Ayuda de Access. Tomemos por ejemplo el tipo Byte, queacepta solo números enteros entre0 y 255: Sub MisPosiblesNietos() Dim MiNumeroDeHijos As Byte 'Así declaramos la variablecon su tipo especifico MiNumeroDeHijos = 5 Debug.Print "Mis posibles nietos:"& MiNumeroDeHijos * 3 End Sub En el procedimiento anterior declaramos la variable "MiNumeroDeHijos"como tipo Byte porquecreo quenadie puedetenermas de 255 hijos, esta variabletambién la pudimos declarar como tipo Integer, Long, Currency, Single, Double o Variant y funcionaria bien, pero seria un desperdicio de recursos del sistema Si en la variableanteriorhicieras esto: Dim MiNumeroDeHijos As Byte MiNumeroDeHijos = 100 * 3 Te Daria un error de desbordamiento, porquela variable tipo Byte solo aguanta valores hasta 255, si en realidad necesitaras hacer eso,debes declarar la variable con otro tipo, el que le sigue es el Entero (Integer): Dim MiNumeroDeHijos As Integer El tipo de variable Variantes muy especial, este tipo puede contener cualquiertipo de valor, numérico, texto u objetos. Si se declara una variabley no se especifica el tipo, el sistema la asume como tipo Variant. Dim UnaVariable 'Así queda como tipo Variant Es fácil no declarar cada variablecon un tipo especifico y que queden todas como Variant (porque acepta cualquier valor), pero como dijimos, es un desperdicio de recursos del sistema. Un buen programador declara bien todas sus variables,es mas, todos lo hacen y todos debemos hacerlo. Nombres De Las Variables Las variables te aceptan cualquier nombresiempre y cuando no se ingresen espacios intermedios, el nombre es muy importante porque puede ayudarte a entender tu propio código y te puede evitarponer demasiadasnotas.En un procedimiento corto es fácil seguir a las variables, pero cuando tienes procedimientosmuy largos y con muchas variables entonces ves la diferencia. Una regla general es que los primeros 3 caracteres del nombre te indiqueel tipo con el que esta declarada: Dim strDireccion as String 'tipo texto
  • 7. Dim lngCambios as Long 'tipo entero largo Veamos un ejemplo para que veas de lo que hablamos, ¿Cual de estos dos procedimientos entiendes mejor? Sub PruebaVariables() Dim c as String Dim d as String c = "PL0400" d = "Wire 800400" Debug.Print c & " " & d End Sub Sub PruebaVariables() Dim strCodigo as String Dim strDescripcion as String strCodigo = "PL0400" strDescripcion = "Wire 800400" Debug.Print strCodigo &" " & strDescripcion End Sub ¿Ves la diferencia? Estas reglas para nombrar variables también se aplican para los no mbres de procedimientos. Tampoco vallas a caer en nombres muy largos y muy descriptivos, porquecargas mucho visualmente tu código, te será más difícil a ti como programadorestar escribiendo nombres largos y no se ve muy estético: Dim sngPorcentajeDeDescuentoParaAplicarleAlProducto as Single Podría ser: Dim sngPorcDesc as Single Declarando Procedimientos Function (Funciones) Al igual que como vimos con las variables,los procedimientos Function que nos van a devolver un valor debemos declararlos con un tipo especifico de datos. ¿Recuerdas el primer procedimiento Function que escribimos y que nos devolvía un texto?, iba de esta manera: Function TextoDelMensaje() 'No le estamos indicando el tipo, así que toma el tipo Variant TextoDelMensaje = "Y o soy el texto" End Function Como esta Function nos devuelve un texto, lo correcto es que la declaremos así: Function TextoDelMensaje() As String 'Aquí le indicamos quetipo de valornos va a devolver TextoDelMensaje = "Y o soy el texto" End Function Function TuEdad() As Byte 'Aquí le indicamos que tipo de valor nos va a devolver TuEdad = 25 End Function Y así con cada Function dependiendo del valorque nos devolverá...
  • 8. Valores Iniciales De Las Variables Y De Los Procedimientos Function (Funciones) Las Variables y procedimientos Function nacen con un valor predeterminado, estevalorse los asigna el sistema en el momento que las crea en memoria. El valorinicial depende del tipo con el que han sido declarados: Tipo String (Texto), inicializan como una cadena vacía, igual a "" Tipo Numéricas, inicializan como cero Tipo Boolean, inicializan como Falso (False) Tipo Variant, inicializan como Empty (adelanteentraremos en detalles) Tipo Object, inicializan como Nothing (adelante entraremos en detalles) Si deseas conocer si una variable de tipo Variant se ha inicializado puedes hacer: Dim varVar As Variant IfIsEmpty(varVar) Then Debug.Print "La Variable Variant no a sido inicializada" End If Si deseas conocer si una variable de tipo Object(Objeto) se ha inicializado puedes hacer: Dim obj As Object Ifobj Is Nothing Then Debug.Print "El objeto no a sido inicializado" End If Parte II Para continuar es necesario que tengas bien comprendida la Parte I, de no ser así puede ser que vallas a confundirte, repasa lo que sea necesario Como ya estas bien claro con la Parte I... continuamos Procedimientos Con Parámetros Los parámetros son valores quenos piden los procedimientos para su correcto funcionamiento. Veamos un ejemplo (copia y pega): Sub LanzarMensaje(strMensaje As String) MsgBox strMensaje End Sub El parámetro aquí es "strMensaje"que como puedes ver,es como una variable que se encuentra dentro del paréntesis de declaración del procedimiento, se le debe especificar de que tipo será y para declararla NOusamos la palabra Dim. Para que este procedimiento pueda funcionar espera que le pasemos un valor de tipo texto en el parámetro ("strMensaje"), porqueeste texto será el que se mostrara en el mensaje. Llamemos a este procedimiento desde otro: Este procedimiento seria bueno queno lo copies y lo pegues, escríbelo a mano para que puedas ver como es que al ir llamando al otro procedimiento te va pidiendo su parámetro Sub PruebaMensaje() LanzarMensaje "Este es una prueba de mensaje" LanzarMensaje "Y a estoy entendiendo lo de parámetro de texto" LanzarMensaje "Con este texto ya es suficiente" End Sub Corre el procedimiento Sub PruebaMensaje()...
  • 9. Si llamáramos al procedimiento y no le pasamos el valoral parámetro así: Sub PruebaMensaje() LanzarMensaje End Sub Recibiríamos un errorque nos dice"El argumento no es opcional", lo cual quiere decir que obligatoriamente debemos especificar un valor para el parámetro o no se puede continuar Un procedimiento puede tener cualquier cantidad de parámetros,todos los que sean necesarios, solo deben declararse separados por coma: Sub UnProc (strAlgo As String, lngNumero As Long, intValorAs Integer) ... End Sub Parámetros Opcionales Estos son un tipo de parámetro que puede o no ser llenado porquees opcional, el procedimiento correrá de todas formas. Lo correcto es que al declarar una variable como opcional le asignemos de una vez el valor que tomara al no recibir un valor(copia y pega): Sub ImprimirTexto(Optional ElTexto As String = "No me ingresaron, soy una cadena automatica") Debug.Print ElTexto End Sub Ahora ve a la ventana Inmediato y escribe: ImprimirTexto "Esta cadena yo la escribí" Y pulsa enter. Ahora llamemos al mismo procedimiento pero no ingresemos valoren el parámetro, escribamos en la ventana Inmediato: ImprimirTexto Y pulsas enter, ¿Viste? A los parámetros declarados como opcionales se les coloca la palabra Optional al inicio de la declaración, un procedimiento puede tener varios parámetros,los parámetros opcionales siempre deben ser colocados de último Recepción De Valores En Los Parámetros Cuando llamamos a un procedimiento que nos pideun valoren un parámetro,podemos pasarle como valorel contenido de una variable. Veamos el ejemplo siguientepara que se vea mas claro: Copia-pega los siguientes procedimientos y analízalos: Sub ImprimirElMensaje(TextoMensaje As String) 'Imprimir el texto que vieneen el parámetro Debug.Print TextoMensaje End Sub Sub Probando_ImprimirElMensaje() Dim strTexto As String 'Le cargamos un valor a la variable strTexto = "Texto original"
  • 10. 'Llamamos al primer procedimiento, pasándole como parámetro la variable ImprimirElMensaje strTexto 'Imprimir el valorde la variable Debug.Print strTexto End Sub Corre el procedimiento "Probando_ImprimirElMensaje"y sin ningún problema nos imprimió el texto en la ventana de inmediato: Texto original Texto original Aquí viene lo bonito, ten mucho ojo con lo que vamos a realizar porque es muy importante. Ahora vamos a realizaruna modificación al primer procedimiento, vamos a agregarleun par de líneas. Nos quedaría así (Puedes borrar el procedimiento y sustituirlo por este): Sub ImprimirElMensaje(TextoMensaje As String) 'Imprimir el texto que vieneen el parámetro Debug.Print TextoMensaje 'Cambiando el valor del parámetro 'Cambio 1, Línea agregada TextoMensaje = "Y ONO SOY EL TEXTO ORIGINAL!!!" 'Cambio 1, Línea agregada End Sub Ahora corremos el procedimiento "Probando_ImprimirElMensaje"y nos imprime en la ventana Inmediato: Texto original Y ONO SOY EL TEXTO ORIGINAL!!! ¿Te diste cuenta de lo que paso?, Lo que paso es que al cambiar el valor del parámetro en el procedimiento "ImprimirElMensaje" (lo hace las líneas que agregamos), cambiamos directamente el valorde la variable "strTexto" que se encuentra dentro del otro procedimiento "Probando_ImprimirElMensaje", variable que nos fue pasada como parámetro. A esto se le llama recibir un parámetro por Referencia, donde lo que estamos recibiendo es un acceso directo hacia la variable original, por lo que cualquier cambio que se realice al parámetro se esta realizando en la variable misma. Nota: Repasa este ejemplo tantas veces como sea necesario para que te quedeclaro Continuamos... Para declarar un parámetro porReferencia, debemos anteponerle ByRef: Sub ImprimirElMensaje(ByRefTextoMensaje As String) End Sub En el ejemplo anterior se puede notar que en ningún momento declaramos el parámetro con ByRef, esto es porqueal no colocarlenada, el sistema predeterminadamente toma/asume el parámetro por Referencia El otro tipo de parámetro que podemos definir es ByVal, que quieredecir "Por Valor": Sub ImprimirElMensaje(ByVal TextoMensaje As String) End Sub Esto indica al sistema que solo recibimos el valorque viene en el parámetro, no la referencia. Si hacemos un cambio en el parámetro no afectará al origen desde donde nos envían el valor.
  • 11. Probemos... Hagamos de nuevo una modificación en el primer procedimiento, declaremos el parámetro como ByVal, nos quedaría así: Sub ImprimirElMensaje(ByVal TextoMensaje As String) 'Cambio 2, declaración del parámetro como ByVal 'Imprimir el texto que vieneen el parámetro Debug.Print TextoMensaje 'Cambiando el valor del parámetro 'Cambio 1, Línea agregada TextoMensaje = "Y ONO SOY EL TEXTO ORIGINAL!!!" 'Cambio 1, Línea agregada End Sub Ahora corremos el procedimiento "Probando_ImprimirElMensaje"y nos imprime en la ventana Inmediato: Texto original Texto original ¿Viste?, el valor de la variable"strTexto"permaneció intacto, no se tuvo acceso a ella. Procedimientos Que Devuelven Muchos Valores Aprovechado Los Parámetros Por Referencia Los parámetros por Referencia también los podemos usar para obtener muchos valores desde un procedimiento. Copia y pega los siguientes procedimientos: Sub DevolverNombres(ByRefPadre As String, ByRefMadre As String, ByRef CantHermanos As Byte) 'Procedimiento que cargara valores a las variables querecibiremos como parámetros Padre = "Pepe" Madre = "María" CantHermanos = 5 End Sub Sub ImprimirNombres() Dim strNombrePadre As String Dim strNombreMadre As String Dim bytNumeroHermanos As Byte 'llamar a la función que nos llenara los nombres en las variables 'que pasemos como parámetros DevolverNombres strNombrePadre,strNombreMadre,bytNumeroHermanos 'Imprimir los valores de las variables Debug.Print "Padre:" & strNombrePadre Debug.Print "Madre:" & strNombreMadre Debug.Print "Numero de hermanos:"& bytNumeroHermanos End Sub Ahora corre el procedimiento "ImprimirNombres"y mira el resultado en la ventana Inmediato. ¿Todo claro verdad? También podemosrecibircomo parámetros a matrices y objetos, estos los explicaremos mas adelante. Llamando A Los Procedimientos Function (Funciones)
  • 12. Tenemos algunas opciones para llamar a funciones, todo dependede que es lo que necesitamos y como esta planteada la función. Copia y pega la siguiente función: Function NotaAprobada(ByVal bytNota As Byte) As Boolean 'Si la nota es mayor a 69 entonces la función devolverá Verdadero, de lo contrario Falso IfbytNota > 69 Then NotaAprobada = True End If End Function Nota:Como tip en esta función puedes verque si la nota no cumple la condición en ningún momento se le asigna el valorFalso, esto es porque la función ya nacecon el valor predeterminado Falso, y volvérselo a asignar seria redundante. Para llamar a esta función a continuación unas opciones: Recogiendo el valor de la función en una variable: Dim blnAprobada As Boolean blnAprobada = NotaAprobada(85) IfblnAprobada Then MsgBox "La nota fue aprobada" Else MsgBox "Nota perdida" End If En esta opción podemosnotar quepara que funcione, los parámetros de la función deben quedar encerrados entre los paréntesis,si existen muchos parámetros quedaría así: NombreVariable= NombreFuncion(UnParametro,OtroParametro, TercerParametro) Esta opción nos sirve si el valor devuelto por la función va ha servirnos después (por eso guardamos el valoren una variable). Si solo usaremos una vez el valor devuelto por la función, podemos procesar de una vez el resultado: If NotaAprobada(85) Then MsgBox "La nota fue aprobada!" Else MsgBox "Nota perdida" End If En ocasiones tenemos que escribir procedimientos muy largos y no necesitamos que nos devuelva un valor, solo necesitamos que se realicen muchas acciones, como no hay valor para devolverpodemos declarar el procedimiento como Sub. Algo muy común en programación es que estos procedimientos largos sean declarados como Function y quedevuelvan un valor Boolean, el valor de verdadero se lo asignamos en la ultima línea (ultima instrucción) y así sabremos que todo se ejecuto correctamente: Function UnProcedimientoLargo(lngNumero As Long) as Boolean 'aquí muchas líneas, seguramente también abran muchas validaciones... IfNoSeCumpleUnaValidacion then Exit Function 'Esta instrucción sirvepara parar el procedimiento, ya no corren las demás líneas 'Saliendo desde aquí la función devolverá Falso,que es el valorcon que se inicializo End If '...aquí mas líneas y validaciones 'la ultima línea: UnProcedimientoLargo = True End Function
  • 13. Como el procedimiento lleva muchas líneas, en el transcurso de la mismas se van realizando validaciones, si no se cumple alguna validación mejorse decide terminar el proceso antes de que termine, lo cual dejaría la función con el valor falso.La función solo tomarael valor verdadero si se llego al final, lo cual quiere decir que todo termino correcto.Sabiendo esto podemos llama a la función de esta manera: If UnProcedimientoLargo("valor parámetro") then 'Aquí entramos porque la función devolvió Verdadero, nos quedamos tranquilos y realizamos lo que sea necesario... Else 'Aquí entramos porque alguna validación fallo o puede ser que haya ocurrido un error. Realizamos lo que sea necesario... End If Esto como comentaba es muy común y seguro lo has encontrado o lo encontraras Si tienes una función como la anterior pero no te interesa saber el valor que esta devolviendo, puedes usar Call para llamar al procedimiento, esta instrucción funciona tanto para Sub y Function: Call UnProcedimientoLargo("Valor del parámetro") Call MostrarMensaje Funciones Útiles y Predeterminadas Existen muchas funciones queya nos da el sistema, funciones que regularmente necesitamos todos. Como ya sabes como obtener datos de las funciones, ya puedes usar todas las que quieras, solo te falta conocero investigar cuales tienes disponibles.Como ejemplo te doy algunas: Ucase:Convierte una cadena a Mayúsculas Left: Te devuelve un número de caracteres de una cadena, desde la izquierda Split: Te convierte una cadena en una matriz InStr:Te encuentra un texto dentro de otro texto etc.... Parte III T ipos De Módulos Existen 3 tipos de módulos: -Asociados -Estándar -De Clase Módulo Asociado Es aquel que esta ligado a un formulario, pertenece al formulario, se encuentra asociado. Cuando intentamos escribir código por primera vez a un formulario se crea automáticamente Módulo Estándar Módulo independiente, lo creamos nosotros mismos cuando vamos a los objetos de Access/Módulos/Nuevo. El modulo que hemos estado usando para los ejemplos es un modulo estándar Módulo De Clase Módulo independiente que nos sirvepara crear nuestros propios objetos. Veremos mas detalles cuando veamos objetos Alcance De Las Variables
  • 14. Las variable pueden tener alcances diferentes, esto quieredecirque podemos tener acceso a ellas solo desde el procedimiento que las contiene, desde todos los procedimientos de un mismo modulo o desde todos los módulos. Si tu variable solo va a ser usada desde un procedimiento, entonces se declara dentro del procedimiento (como lo hemos estado haciendo): Dim strVariableAs String Si deseas que otros procedimientos del mismo modulo tengan acceso a la variable, entonces tendrás que declararla en la parte de arriba del modulo: Option Compare Database Option Explicit Dim strVariableAs String Procedimientos... Las primeras dos líneas las puse solo para que se identifique la partede arriba del modulo Para que se pueda tener acceso a una variabledesdecualquier lugar, debes declarar la variable en un "Módulo estándar"y tienes que anteponeral nombrede la variable la palabra Public: Option Compare Database Option Explicit Public strVariable As String Private strOtraVariable As String Procedimientos... Puedes ver que también se ha declarado una variable como "Private", al ser declarada de esta manera la variablesolo estarádisponiblepara los procedimientos del mismo modulo Alcance De Los Procedimientos Al igual que las variables, los procedimientos pueden ser declarados como Privatey como Public: Si quieres que tu procedimiento solo pueda correrse desde el mismo modulo lo podemos declarar así: Private Sub UnProceimiento() Private Function UnProcedimiento() As Tipo Si deseas que tu procedimiento pueda llamarsedesde cualquier lugar de tu aplicación debes declararlo en un "Módulo Estandar"así: Public Sub UnProcedimiento() Public Function UnProcedimiento() as Tipo El sistema también toma como públicos los procedimientos a los que no se les ha indicado su alcance (como lo hemos venido haciendo): Sub UnProcedimiento() Function UnProcedimiento() as Tipo Nota:
  • 15. En los "Módulos Asociados", aunque declares variables o procedimientos como Public (Públicos), siempre tendrán alcance solo para el modulo que los contiene Procedimientos De Evento Los procedimientos de evento van ligados a objetos como formularios o controles, se ejecutaran automáticamentecuando ocurreel momento que están esperando, el momento parael que fueron creados. Tomemos por ejemplo un Botón en un formulario, a este botón le podemos agregar el evento "Al hacer clic"esto quiere decir que cada vez que el usuario le haga clic en el botón, se correrá este procedimiento. ¿Que acciones realizara?, pues las que tu quieras, las que tu le especifiques. Los procedimientos de evento se escriben en ingles. Para el evento "Al hacer clic"de un botón llamado "btnAbrirFormulario"seria: Private Sub btnAbrirFormulario_Click() 'Aquí todas las instrucciones que quieras que se realice... MsgBox "Acabas de hacerme clic"... End Sub Estos procedimientos están disponibles solo para el modulo (como yavimos anteriormente) y los puedes llamar desde cualquier otro evento del mismo modulo si es necesario, lo llamaría como lo haces normalmente con los procedimientos: Call btnAbrirFormulario_Click() Algunos procedimientos de evento solicitan parámetros o tienen parámetros donde vienen datos que podemos usar. Lo mas fácil y recomendablepara crear estos eventos es de la forma que haremos esta prueba: Crea un nuevo formulario en la vista de diseño, dale guardar y ponle cualquier nombre. Crea un nuevo control de Botón, si te sale el asistente dale cancelar, no necesitaremos al asistente porque nosotros mismos crearemos eventos. Si el cuadro de propiedades no esta abierto dale doble clic al botón para que aparezca,si la propiedades ya están abiertas solo dale un clic al botón para seleccionarlo, en el cuadro de propiedades ve a la pestaña "Ev entos", busca por el evento "Al hacer clic / On clic", pon el puntero del Mouse justo en el evento, ahora te aparece un pequeño botón a la derecha, este pequeño botón tiene 3 puntos como titulo (...), dale un clic y te llevara a la ventana VBA, con la novedad de que te agrego automáticamente el procedimiento de evento: Sub NombreBoton_Click(). End Sub Ahora puedes agregarle las líneas que desees,le agregaremos estas (agrégaselas manualmente): Sub NombreBoton_Click(). MsgBox "Procedimiento Al Hacer Clic. "& "Me llamo:" & NombreBoton.Name MsgBox "Fecha y hora actual:"& Now() End Sub Revisa bien el "NombreBoton". Dale guardar, cierra la ventana VBA, cierra el formulario. Ahoraabre tu formulario normalmentecon un doble clic y prueba el botón. Como pudiste ver en el cuadro de propiedades, existen muchos eventos para el botón. Los tipos de eventos pueden variar dependiendo del tipo de control, pero hay eventos comunes en los diferentes controles. Cuando finalices todo estearticulo te queda una buena tarea, revisar que otros procedimientos de evento puedes aplicarlea tus controles, y en que momento se ejecutan.
  • 16. Estructuras Type Las estructuras Typeson un tipo de variablecreada porel programador (tu), son como un grupo de variablesque se manejan juntas: Public Type typMiFamilia strNombrePersona As String strNombrePadre As String strNombreMadre As String lngNumeroHermanos As Long End Type Estas solo se pueden declarar a nivel de modulo (en la parte superior de modulo) y también pueden ser Private o Public (Si no se le coloca se asumen Public) Un ejemplo de uso, copia y pega la estructura type typMiFamilia, luego escribeeste procedimiento manualmente: Sub Prueba_EstructuraType() Dim UnaFamilia As typMiFamilia 'declaración de la variable 'llenar los datos de la estructura UnaFamilia.strNombrePersona = "Mario Hernandez" UnaFamilia.strNombreMadre = "María" UnaFamilia.strNombrePadre = "Pepe" UnaFamilia.lngNumeroHermanos = 3 'imprimir los datos de la estructura Debug.Print UnaFamilia.strNombrePersona Debug.Print UnaFamilia.strNombreMadre Debug.Print UnaFamilia.strNombrePadre Debug.Print UnaFamilia.lngNumeroHermanos End Sub También podemospedir a estas estructuras Type en parámetros de procedimientos,con lo que nos ahorraríamos espacio en la declaración.En vez de poner muchas variables solo colocamos una variable de tipo estructura Type A este punto, para que te sea mas fácil el manejo de esta estructura y muc has cosas que veremos adelante, tienes que aprender a usar el With With (Con) Nos sirve para "agarrar"un objeto y podertrabajar con sus elementos. Como ejemplo vamos a escribir el mismo ejemplo de arribade las Estructuras Type, escríbelo a mano: Sub Prueba_EstructuraType_ConWith() Dim UnaFamilia As typMiFamilia 'declaración de la variable 'llenar los datos de la estructura With UnaFamilia .strNombrePersona = "Mario Hernandez" .strNombreMadre= "María" .strNombrePadre = "Pepe" .lngNumeroHermanos = 3 'imprimir los datos de la estructura Debug.Print .strNombrePersona Debug.Print .strNombreMadre Debug.Print .strNombrePadre Debug.Print .lngNumeroHermanos End With
  • 17. End Sub Usando la instrucción With podemos ahorrarnos bastante escritura y el código se ve mas limpio. Matrices Las matrices son un tipo de variable que te aceptan varios datos, puedes pensar en ellas como filas y columnas en una hoja de Excel.En las matrices también se aplican las mismas reglas de nombres y alcances de las demás variables, la diferencia es en como se declaran, que después del nombre se les colocan paréntesis, dentro de los cuales se escribeel tamaño que tendrá la matriz: Dim, Private o Public NombreMatriz(NumeroDeFilas, NumeroDeColumnas) As TipoDeDatos Si tu matriz solo contendra una columna puedes declararla así: Dim mtzProductos(3) As String 'Aquí solo estamosindicando el número de filas, el sistema asume que es de solo 1 columna La clave para manejar las matrices es saber que la primera fila o columna es la numero cero.En la declaración anterior en realidad hay 4 filas. Veamos un ejemplo: Sub PruebaMatriz() Dim mtzProductos(3) As String 'declaración de la matriz (4 filas) 'cargar datos a la matriz mtzProductos(0) = "Producto1" mtzProductos(1) = "Producto2" mtzProductos(2) = "Producto3" mtzProductos(3) = "Producto4" 'Imprimir los datos de la matriz Debug.Print mtzProductos(0) Debug.Print mtzProductos(1) Debug.Print mtzProductos(2) Debug.Print mtzProductos(3) End Sub Se podría dar el caso que no conozcamos desde el inicio el tamaño que contendrá la matriz porque será resultado de algo que todavía hay que calcular. En este caso podemos declarar una matriz de longitud variable y en el camino la dimensionamos con la instrucción ReDim. Ejemplo: Sub PruebaMatrizDos() Dim mtzProductos() As String 'declaración de la matriz con longitud variable (no se especifico un tamaño) 'Dimensionar el tamaño de la matriz ReDim mtzProductos(3) 'cargar datos a la matriz mtzProductos(0) = "Producto1" mtzProductos(1) = "Producto2" mtzProductos(2) = "Producto3" mtzProductos(3) = "Producto4" Debug.Print mtzProductos(0) Debug.Print mtzProductos(1) Debug.Print mtzProductos(2) Debug.Print mtzProductos(3) End Sub En algunas ocasiones nos pueden venir matrices llenas desde alguna función,en estos casos no conocemos que tamaño tiene, paraconocer el limite podemos usar la función Ubound Dim intLimite As Integer intLimite = Ubound(mtzProductos)
  • 18. Esta función también es útil cuando trabajamos con bucles, los cuales hacen mas fácil el llenado de datos a la matriz, haremos un ejemplo de esto cuando aclaremos que son los bucles Objetos Por fin los objetos... auque parezca que este va ser un tema complicado en realidad es muy sencillo. Los objetos son los culpables de que veamos el código "complicado"y que muchas personas se "decepcionen"al ver tantas líneas, pero todo esta en la perspectiva con la que miramos. Los objetos están diseñados para facilitarnos la vida, realizarnos muchas acciones o proporcionarnos datos. Si alguien te pasa una fecha, con ella podemos devolver varios datos (En este momento se me ocurren): -Sacar los días transcurridos hasta el día de hoy -Sacar los meses -Sacar los años -Cuantos domingos han transcurrido -Que día fue esa fecha Etc., etc., seguro a ti se te ocurren muchos mas datos para devolver, todo esto lo podemos realizar con cálculos. Entonces, nosotros podemos crear un objeto que, pasándole la Fecha deseada, nos devuelva los datos anteriores. Todos los datos dependen de dicha fecha,si no proporcionamos la fecha al objeto no obtendremos nada porque no hay punto de partida para realizar los cálculos. En general eso son los objetos, estructuras que nos piden uno o mas datos que le sirven como partida para saber que es lo que nos interesa, y con eso desencadenan una seriede acciones y cálculos que nosotros podemos aprovechar. Existen miles y miles de objetos y nadie puede conocerlos todos, lo único quesabemos es que un objeto nos pedirá ciertos datos y con esto le podemos ordenar que ejecuteacciones o que nos devuelva datos. ¿Que acciones y quedatos nos proporciona un objeto? Eso es específicamente diferente en cada objeto, dependede para que fue diseñado. ¿Quieres saber que hace un objeto? Busca ayuda sobreel, solo así sabrás que puedes sacarle. Adelanteveremos como podemos investigarlos En general eso es mucho de lo que es la programación,usar objetos según nuestra necesidad. ¿Quieres manejar los registros/datos de una tabla?Usa el objeto Recordset ¿Quieres manejar formularios?Usa el objeto Form ¿Quieres manejar controles?Usa el objeto Control Etc., etc.... El que puedas hacermuchas cosas por código depende de que tantos Objetos conozcas y que tan a fondo los hayas usado, porque hay objetos que tienen una cantidad muy grande de cosas que se pueden realizar, incluso hay objetos que contienen sub objetos, y estos pueden tener otros sub objetos, etc. Utilizar Los Objetos Vamos a utilizar el ejemplo de la fecha que dimos anteriormente, asumamos que creamos un objeto según las especificaciones que dimos, el objeto que creamos se llama "DatosDeFecha" Para trabajar con el objeto, primero se debe declararuna variablecomo el tipo de objeto: Dim objFecha as DatosDeFecha
  • 19. Con esto el sistema ya sabe que es lo que va a contener tu variable,ahora, para empezara utilizarla debemos de "Alistarla", esto se hace regularmentecon la instrucción SET, esto es mas o menos como sacarleuna copiaal objeto, esta copia es la variable y es con la que trabajaremos: Set objFecha = DatosDeFecha 'Ingresando los datos necesarios objFecha.FechaDeseada = #01/01/1975# 'Imprimiendo los datos Debug.Print objFecha.DiasTranascurridos Debug.Print objFecha.MesesTranscurridos Debug.Print objFecha.AñosTranscurridos Debug.Print objFecha.CantidadDomingos Debug.Print objFecha.NombreDia 'Al terminar de usarlo siempre hay que destruirlo objFecha = Nothing Para facilitar la escritura podemos trabajarel objeto con With (ya lo vimos),podría habersido así: With objFecha 'Ingresando los datos necesarios .FechaDeseada = #01/01/1975# 'Imprimiendo los datos Debug.Print .DiasTranascurridos Debug.Print .MesesTranscurridos Debug.Print .AñosTranscurridos Debug.Print .CantidadDomingos Debug.Print .NombreDia End With Los nombres pudieron haber estado en ingles (si fue un objeto elaborado en ingles), y al ver el código nos hubieran parecido líneas raras, pero ahora sabemos que solo son datos que estamos solicitando/obteniendo. Nota:Si copias lo anteriorobtendrás error porque en tu sistema no existe ningún objeto llamado "DatosDeFecha", solo lo estamos suponiendo para vercomo es que se usa. Cuando escribes el nombredel objeto, mejor dicho,la variable declarada como el tipo de objeto y después escribes el punto (.), se te desplegara la lista de propiedades y métodos que contieneel objeto Para dar un ejemplo con un objeto real, veamos un objeto Recordset, con el cual se pueden manejar los registros de una tabla: Sub PruebaObjetoRecordset() 'Declaracion de la variable... 'El Recordset es un objeto que esta contenido dentro de un objeto mayor que se llama DAO Dim rst As DAO.Recordset 'La declaración también se pudo haber hecho así: 'Dim rst As Recordset 'Pero también existeel objeto ADO.Recordset, en algunas ocasiones necesitamos 'trabajar con ambos Recordset,¿Como sabe el sistema con cual es con el que deseamos trabajar? 'Por eso la declaración como la que realizamos 'Abrir el objeto, '¿Donde están los datos que deseamos manejar? 'manejaremos la tabla clientes, solo le especificamos esto y el objeto se trae los registros...
  • 20. Set rst = CurrentDb.TableDefs("Clientes") 'Aquí también puedes verque hay una sucesión de objetos 'CurrenteDb = Base de datos, esta contiene al objeto: 'TablaDefs = Colección de todas las tablas 'le especificamos que tomela tabla "Clientes" 'Con el objeto ya disponible, realizamos acciones con sus propiedades y métodos rst.MoveLast 'ir al ultimo registro rst.MoveFirst 'ir al primer registro rst.AddNew 'iniciar un nuevo registro rst!IdCliente = "CRZTUL" 'ingresando datos en un campo rst.Update'grabar el registro rst.Close 'este objeto requiere que lo cerremos Set rst = Nothing 'destruyendo el objeto End Sub Aunque pareceun procedimiento largo y complicado, según lo que hemos explicado, se puede ver que el objeto lo manejamos en general con: Dim rst As DAO.Recordset 'declarar la variable Set rst = CurrentDb.TableDefs("Clientes") 'Inicializar la variable de objeto ... Set rst = Nothing 'destruir el objeto Todo lo demás en el medio son puras propiedades y métodos propios del objeto ¿Entendiste?, ¿Difícil?, ¿O ya lo ves diferente? Hay que tener claro que no todos los objetos se inicializan de la misma manera, hay que investigarcomo se inicializa cada objeto, el objeto quete interesa. En este ejemplo se crea un objeto nuevo,mas bien se crea una "Copia nueva"de un objeto DAO.Recordset, que es la que se encuentra en la variable y es con la que trabajamos Otra forma para un Recordset: Dim rst As DAO.Recordset Set rst = CurrentDb.OpenRecordset("SELECT * FROM Clientes;") ... Set rst = Nothing No todos los objetos tienen que crearse como nuevos, algunos podemos obtenerlos por referencia, pero para haceresto se necesita que el objeto se encuentre abierto: Un formulario: Dim frm As Form Set frm = Forms("Nombre formulario") 'Otra forma: 'Set frm = Forms!NombreFormulario 'Otra forma: 'Set frm = [Forms]![NombreFormulario] ... Set frm = Nothing Cuando tomamos un objeto porreferencia,al destruirlo con: Set frm = Nothing Realmente no estamos destruyendo el objeto abierto, solo destruimos la variable con la que estamos teniendo acceso directo a el (referencia)
  • 21. Un Control: Dim ctr As Control Set ctr = Forms!NombreFormulario!NombreControl ... Set ctr = Nothing Para usar un control Treeview (árbol) es necesario que primero se inserteel objeto ActiveXen el formulario luego haces: Dim objArbol As TreeView Set objArbol = NombreDelControDeArbolInsertadoEnElFormulario.Object Etc.,... Bucles Los bucles nos sirven para realizan una misma rutina un determinado numero de veces. La mas simple es For..Next, copia-pega y corre el procedimiento siguiente: Sub PruebaForNext() 'variable que nos servirá parael bucle Dim i As Long 'Aquí le estamos diciendo: 'A la variable "i", iníciela con el valor1, termine el bucle cuando valga 5 'la variable quele asignamos predeterminadamente aumentara en 1 unidad en cada vuelta (en este caso la variable i) For i = 1 To 5 'imprimir el valor de la variable Debug.Print "Valor de la variable:"& i Next i 'indica dar la siguiente vuelta al bucle End Sub También tenemos otros tipos de bucles, en los cuales el objetivo no es ir cambiando de valor a la variablecomo el For Next, el objetivo es cumplir con alguna condición, y hasta que se cumpla deja de correr el bucle,veamos este ejemplo (copia-pega y corre): Sub PruebaBucleConCondicion() Dim i As Long 'variable para el bucle 'Esta es la condición: 'Mientras i sea menor a 10, siga con el bucle While i < 10 'imprimir el valor de la variable Debug.Print "Valor de la variable:"& i 'Este tipo de bucle no aumenta predeterminadamente ningún valora la variable, 'solo se esta preocupando por cumplirla condición inicial. 'Aquí nosotros le vamos a aumentar el valora la variable, que será 'igual al valor que ya tiene mas uno. De esta manera conseguiremos que en cada vuelta 'del bucle la variable aumentara de valor en 1 unidad i = i + 1 'IMPORTANTE: 'Si no le aumentáramos esta unidad, la variable i se quedaría en cada 'vuelta con el valor inicial de cero (su valor de inicio), entonces 'nunca se cumpliría la condición inicial y el buclecorrería eternamente... 'trabaría el sistema, esto es lo que hay quecuidarcon los bucles con condiciones Wend End Sub
  • 22. Lo prometido es deuda, aquí les pongo un bucle para llenar datos de a una matriz: Sub PuebaMatrizConBucle() Dim mtzNumeracion(9) As String 'matriz de 10 filas Dim i As Long 'variable para correrel bucle 'Cargar los datos de la matriz... 'vamos desde 0 hasta el limite de la matriz '¿Porque desde cero?, porque el primer elemento de las matrices es cero For i = 0 To UBound(mtzNumeracion) 'cargar el numero mtzNumeracion(i) = "Elemento numero:"& i Next i 'Imprimir los datos de la matriz For i = 0 To UBound(mtzNumeracion) 'imprimir en la ventana Inmediato Debug.Print mtzNumeracion(i) Next i End Sub Existen varios tipos de bucles (aquí solo vimos dos), dondese pueden definir diferentes criterios para que el bucle siga dando vueltas en la misma rutina. Colecciones Las colecciones son objetos quepodemos compararcon matrices de una sola columna, la ventaja es que son mas flexibles para agregary consultardatos, podemos ingresarles elementos antes o después de alguna fila existente,también le podemos dar un código de identificación y acceder a los elementos por este código, y no solo por el numero de fila como las matrices. La primera fila inicia en uno. Veamos un ejemplo (copia,pega y corre): Sub PruebaColeccion() Dim colPrueba As Collection Dim strCodigo As String Dim i As Long 'Inicializamosla variable para el objeto Collection Set colPrueba = New Collection 'llenaremos 5 elementos porbucle For i = 1 To 5 'El código en cada elemento es opcional pero se lo agregaremos para esteejemplo strCodigo = "Código" & i 'Si solo agregamos elementos sin especificar la posición, el elemento se crea al final colPrueba.Add "Elemento por bucle numero:"& i, strCodigo Next 'ahora vamos a agregarun nuevo elemento, se lo agregaremos al inicio colPrueba.Add "Agregado después del bucle", "CodigoDiferente", 1 'Imprimir los datos 'vamos desde el primerelemento hasta el ultimo contenido For i = 1 To colPrueba.Count 'total de elementos contenidos Debug.Print "Elemento número "& i & " = " & colPrueba(i) Next i 'Imprimir un elemento llamándolo por el código Debug.Print "Elemento llamado por su código (CodigoDiferente) = " & colPrueba("CodigoDiferente") Set colPrueba = Nothing 'destruyendo el objeto End Sub
  • 23. Instrucciones De Condición Con estas instrucciones podemos ordenarleal sistema que evalúe resultados, y dependiendo de lo que se obtenga que haga una cosa u otra. Entre estas tenemos: IF... T HEN... ELSE Que mas o menos quiere decir: SI (Esta condición es verdadero) ENTONCES (Haga esto) SI NO SE CUMPLIO (Haga esto) Lo usaríamos así: SI (Esta condición es verdadero) ENTONCES (Haga esto) SI NO SE CUMPLIO (Haga esto) TERMINAR SI Y a en líneas de código: IF (Esta condición es verdadero) THEN 'aquí lo que quieres que se ejecute si la condición es verdadera ELSE 'aquí lo que quieres que se ejecute si la condición es falsa END IF Sub PruebaIF() If10 > 8 Then Debug.Print "La condición SI se cumple" 'aquí también se pueden meterotros IF si fuera necesario Else Debug.Print "La condición NOse cumple" 'aquí también se pueden meterotros IF si fuera necesario End If End Sub Hay ocasiones en deseamos hacer un análisis a un dato, y deseamos actuar de diferente manera según sea el valor. Para esto podemos usar: SELECT CASE Un ejemplo lo muestramas claro: Sub PruebaSelectCase() Dim bytPrecio As Byte bytPrecio = 15 'este valor lo puedes ir variando para hacerpruebas 'Segun el valor del precio imprimiremos una nota... 'Analizar el valor contenido en la variable"bytPrecio" Select Case bytPrecio Case 0 'si el precio es cero Debug.Print "Es regalada" Case 1 'si es igual a uno Debug.Print "Es casi regalado" Case 2, 3, 4 'si es igual a 2, 3 o 4 Debug.Print "Esta a buen precio" Case Is < 10 'si es menor a 10
  • 24. Debug.Print "Un precio justo" Case Else 'cualquier otra posibilidad Debug.Print "Precio fuera de rango, no compres" End Select End Sub Enumerados Un enumerado nos sirve para mostrar una lista que se nos desplega mientras estamos escribiendo, esta lista tienevarias opciones donde debemos seleccionar solo un elemento,esto nos facilita la escritura del código y nos limita las opciones a escogera solo valores validos. Hagamos esta prueba, escribamos a mano en la ventana de inmediato: docmd.selectobject acForm Esta es una instrucción que le dice al sistema que seleccione un objeto de Access. Te pudiste dar cuentaque cuando escribiste el espacio (después de docmd.selectobject) te desplegó un lista donde aparecían los nombres de los objetos que podemos seleccionar, eso es un enumerado, una lista que nos permite verque opciones tenemos con nombre y escoger el elemento que nos interesa. Un enumerado debe crearsea nivel de modulo. Creemos este enumerado: 'Las primeras dos líneas están puestas solo para que se vea que el enumerado esta a nivel de modulo Option Compare Database Option Explicit Enum enuMensaje mBajo mMedio mAlto End Enum El primer elemento del enumerado toma el valor cero, el siguiente toma el valor del elemento anterior +1 (en este caso seria uno), etc.Estos valores son predeterminados, pero si nosotros deseamos podemos cambiarles el valor, lo haríamos así: Enum enuMensaje mBajo = -1 mMedio = 10 mAlto = 20 End Enum Con esto ya podemos crear una variable y declararla como tipo "enuMensaje"en donde necesitemos. Copia y pega esteprocedimiento: Sub PruebaEnumerado(TipoMensaje As enuMensaje) 'Metemos al Select la variabledel parámetro y hacemos algo 'según sea el valor que venga Select Case TipoMensaje Case mBajo Debug.Print "sin importancia" Case mMedio Debug.Print "Tomar en cuenta" Case mAlto Debug.Print "MENSAJE CRITICO!" End Select End Sub Ahora escribe a mano esto en la ventana Inmediato:
  • 25. PruebaEnumerado mBajo Pulsas enter... Prueba con las 3 opciones... Control De Errores Hay varias razones por las que puedeocurrir un error en un procedimiento, olvidamos poner un valor necesario, asignamos valores que no corresponden, manejamos mal un objeto, etc. Cuando ocurreun error, el sistema predeterminadamente se detiene, abre la ventana VBA y nos lleva a la línea donde ocurrió el error, dicha línea también la pinta de amarrillo, de esta manera podemos realizar los cambios quesean necesarios. ¿Pero que pasa si el errorocurre en una aplicación que has hecho para otras personas?, ellos no tienen porque verel código. Para evitar esto podemos controlar los errores con algunas rutinas, allí nosotros le diremos que es lo que queremos que el sistema haga cuando ocurra un error. Las rutinas de errores son muy importantes porquelos errores pueden ser inesperados, puede ser que en tu computadora corra un procedimiento sin problemas, pero al llevar tu base de datos a otra computadora con otras propiedades ocurra algún error, porel sistema operativo de otra versión, Office de otra versión, librerías, dll, etc. Empecemos porpasos, GoT o (Ir Hacia) y Etiquetas De Línea GoTo (Ir Hacia):Le indica al sistema que salte hacia una Etiqueta de Línea Etiqueta De Línea: Es un nombre cualquierafinalizado con dos puntos (:) Veamos un ejemplo, copia, pega y prueba este procedimiento: Sub PruebaSaltoPorEtiquetas() GoTo SoyEtiquetaDeLinea 'Ir hacia la etiqueta especificada MsgBox "Mostrando el Primer mensaje" SoyEtiquetaDeLinea: 'Etiqueta, puede tener cualquier nombre MsgBox "Mostrando el Segundo mensaje" End Sub Como te pudiste dar cuenta al correr el procedimiento, el primer mensaje nunca se mostró,esto es porque en la primera línea del procedimiento se le esta indicando con GoTo que se valla a la etiqueta "SoyEtiquetaDeLinea"y con esto se esta saltando el primer mensaje ¿Claro?, veamos un segundo ejemplo,copia-pega y prueba el siguienteprocedimiento, sigue la secuencia de saltos de línea: Sub PruebaSaltoPorEtiquetasDos() 'Saltar hacia la etiqueta que esta al final del procedimiento GoTo Etiqueta_Del_Final Etiqueta_Del_Inicio: MsgBox "Mostrando el Primer mensaje" 'Salir de procedimiento Exit Sub Etiqueta_Del_Final: MsgBox "Mostrando el Segundo mensaje" 'Saltar/regresar hacia la etiqueta que se encuentraal inicio GoTo Etiqueta_Del_Inicio
  • 26. End Sub En este procedimiento podemosobservar que en la primera línea se salta hacia una etiqueta al final, de allí se hace otro salto hacia una etiqueta que se encuentra al inicio. Importante: Hay que tener mucho cuidado en los saltos hacia atrás, si te das cuenta en el ejemplo, al hacer el salto hacia atrás hay un "Exit Sub" que sirve para salir del procedimiento, si no existiera, el procedimiento correría infinitamente porque cada vez que llega al final vuelve a saltar hacia el inicio Objeto Err (Error) Existe un objeto llamado Err (Error) que siempre esta presente, este objeto tienes varias propiedades que predeterminadamente se encuentran vacías, cuando ocurre cualquier error el sistema llena estas propiedades para que nosotros podamos consultarlas y saber que es lo que ha ocurrido. Hagamos esta prueba, en la ventana Inmediato escribe: ? Err.Number Pulsamos Enter, nos imprime el valor cero. Este valorquiere decir que no hay ningún error disponible, no a ocurrido ningún error. Todos los errores están identificados con un valor que es un numero entero. Activar Una Rutina De Errores Una rutina de error se activa con la sentencia OnError. Hay varias formas de manejar las rutinas de error, vamos a analizar una de las mas comunes (si creas un control con el asistente Access automáticamentete creauna rutina de error como esta): Copia-pega y analiza este procedimiento, Sub ComprendiendoUnaRutinaDeErrorComun() 'Las palabras "On Error"activan la rutina de error, la siguientelínea dice: 'Al ocurrirun error(en cualquierlugar) saltara la etiqueta "Tratamiento_Error" On Error GoTo Tratamiento_Error 'Aquí el cuerpo de procedimiento... Salir_Del_Procedimiento: 'Si no ocurre ningún errorllegamos a esta etiqueta limpiamente y salimos del procedimiento (con Exit Sub), esto 'porque no necesitamos llegar a la parte donde se trata el error 'Al ocurrir un error, el sistema pasaraa las líneas del tratamiento del error, desde allí se regresara 'a este punto (con la instrucción Resume) 'Podemos aprovechar este espacio para realizar algunas cosas como desvincular variables o cerrar objetos, 'porque esas son cosas que necesitamos hacer antes de cerrarun procedimiento, haya erroro no 'Aquí la líneas para resolvercualquier cosa antesde salir, porquesiempre se pasara por este punto... Exit Sub Tratamiento_Error: 'Aquí se llega solo si ha ocurrido un error... 'Desplegar un mensaje con la descripción del error MsgBox Err.Description 'La palabra Resume hace dos cosas: 'Elimina el error y hacer un salto hacia la etiqueta especificada
  • 27. Resume Salir_Del_Procedimiento End Sub Otro metodo comun de manejar errores es con: On Error Resume Next Que es como decirle al sistema "Cuando ocurra un error, siga la ejecución del procedimiento en la línea siguiente de donde se origino el error". Muy útil cuando trabajamos con objetos. Con la primer rutina al ocurrir un errorel sistema va hacia la rutina del errorluego se sale del procedimiento, pero a veces necesitamos que aunque ocurra un error el sistema siga ejecutando las demás líneas del procedimiento, es cuando podemo s usar"On Error Resume Next" Haremos un ejemplo, vamos a probar dos procedimientos quetienen un cuerpo idéntico pero con diferente manejo de errores, copia-pega y corre: Sub PruebaOnErrorGoTo() On Error GoTo Tratamiento_Error Dim rst As DAO.Recordset 'variable para manejar los datos/registros de una tabla 'Asignamos la tabla de donde agarraremos los datos/registros 'Aquí se originara un errorporque la tabla de nombre "Inexistente"no existe Set rst = CurrentDb.TableDefs("Inexistente") MsgBox "Este mensaje esta puesto después del error" Salir_Del_Procedimiento: Set rst = Nothing 'desvincular variable Exit Sub Tratamiento_Error: MsgBox "Error ocurrido:"& Err.Description Resume Salir_Del_Procedimiento End Sub Sub PruebaOnErrorResumeNext() On Error Resume Next Dim rst As DAO.Recordset 'variable para manejar los datos/registros de una tabla 'Asignamos la tabla de donde agarraremos los datos/registros 'Aquí se originara un errorporque la tabla de nombre "Inexistente"no existe Set rst = CurrentDb.TableDefs("Inexistente") MsgBox "Este mensaje esta puesto después del error" Set rst = Nothing 'desvincular variable End Sub Corriendo el primerprocedimiento nos lanza un mensaje, el mensaje que indica el error que acaba de ocurrir, este mensaje esta puesto en las líneas donde se trata el error. Corriendo el segundo procedimiento, se generael mismo error pero el sistema no se detiene y sigue con las líneas de código y nos muestra el mensaje que esta puesto en la línea debajo de donde se origino el error. Algunos Tips
  • 28. Continuar Líneas Largas En La Siguiente Línea Algunas líneas son tan largas que se salen del área de pantalla,para tenerlo todo a la vista puedes cortar una línea escribiendo un espacio seguido de un guión bajo ( _): Sub PruebaContinuandoLineas() 'Una línea larga: 'Aquí se encuentra una línea que puede llegara salirse de la pantalla porque al autor se le ocurrio que debía hacer muchoscomentarios paradejar bien claro lo que tenia que decir 'La misma línea larga: 'Aquí se encuentra una línea que puede llegara salirse de la _ pantalla porqueal autor se le ocurrió que debía hacer muchos _ comentarios para dejarbien claro lo que tenia quedecir MsgBox _ "Este es un mensaje donde se muestra como cortarlíneas" End Sub De esta manera lo puedes hacercon cualquier línea, en cualquier parte de la línea, media vez no cortes ninguna palabrapor el medio porque así no funcionaria Juntar Varias Líneas En Una Línea Se puede juntar dos o mas líneas aunque no tengan ninguna relación,solo debes colocardos puntos ( : ) al final de la línea: Sub PruebaJuntandoLineas() 'Normal Debug.Print "Mensaje Uno" Debug.Print "Mensaje Dos" MsgBox "Mensaje Tres" Debug.Print "-------------------" 'Juntando líneas Debug.Print "Mensaje Uno": Debug.Print "Mensaje Dos": MsgBox "Mensaje Tres" End Sub Objeto DoCmd Esta es una objeto exclusivo de Access que te permite realizarmuchas acciones. Haz esta prueba, escribe: Docmd. Al escribir el punto te apareceuna lista larga con cosas quepuedes realizar, allí tienes un bonito tema para explorar. Si usas por ejemplo: DoCmd.RunCommand "Parámetro" Esta opción te permite realizar cualquier acción de los menús, como que dieras un clic en algún elemento.En el parámetro opción te aparecerá un enumerado con todas las acciones de los menús ME (Palabra para referirse al formulariodel Módulo Asociado Actual) Me es una palabra que solo puedes usaren los Módulos Asociados (Módulos que están ligados a los formularios), e indica que vas a usar explícitamenteel objeto formulario al que pertenece el modulo asociado en el que estas actualmente. Para usar un objeto de formulario (como vimos antes) harías:
  • 29. Dim frm as Form Set frm = Forms!UnFormulario frm.UnControl.Visible = True Al escribir frm. se te desplega el listado de propiedades, métodos y sub objetos para el objeto frm (Un objeto de tipo formulario) Si estas en un modulo asociado y deseas trabajarcon el objeto formulario al que pertenece harías: Me.UnControl.Visible = True Que seria como decir: Con este formulario.UnControl.Visible = True Estas haciendo referencia a un objeto formulario, el formulario actual. Usar La Ayuda De Manera Fácil y Directa Si estas observando un código y tienes algunaduda sobre algo queves, solo haz clic en la palabra, pulsas la tecla F1 y se mostrara automáticamente la ayuda para ese tema, para la palabra que seleccionaste con un clic. Haz la prueba, haz clic por ejemplo sobrela palabra MsbBox (después pulsas F1) ¿Viste?, así podrás especializarte en el cualquier tema de los que hemos tocado aquí o en el que desees, ahora que ya llegastea esta parte, ¡Eres libre para explorar!, bie nvenid@al mundo de la programación... Finalizando El unico "Pero"de escribir artículos como estees que casi siempre se le ha ido por alto algún tema y hay que estar actualizando... si alguien se da cuenta de algo porfavor me comunica, así ayudamos a todos En este articulo iba a explicarcomo se crea un objeto con un modulo de clase,pero al final me pareció queesto ya seria un tema muy especifico, así que lo voy a escribir pero en un articulo diferente Saludos, Byron