Sábado, 07-Sep-24, 7:09 PM
Le saludo Visitante | RSS
Menú del sitio
Búsqueda

byronlcl, Access y algunas cosillas...

Aprender código VBA en unas horas 3

Páginas de este artículo:  1  2  3

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 serie de acciones y cálculos que nosotros podemos aprovechar. Existen miles y miles de objetos y nadie puede conocerlos todos, lo único que sabemos es que un objeto nos pedirá ciertos datos y con esto le podemos ordenar que ejecute acciones o que nos devuelva datos.
 
¿Que acciones y que datos nos proporciona un objeto?
Eso es específicamente diferente en cada objeto, depende de para que fue diseñado.
 
¿Quieres saber que hace un objeto?
Busca ayuda sobre el, solo así sabrás que puedes sacarle. Adelante veremos 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 hacer muchas 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 declarar una variable como 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 empezar a utilizarla debemos de "Alistarla", esto se hace regularmente con la instrucción SET, esto es mas o menos como sacarle una copia al 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 trabajar el objeto con With (ya lo vimos), podría haber sido 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 anterior obtendrás error porque en tu sistema no existe ningún objeto llamado "DatosDeFecha", solo lo estamos suponiendo para ver como es que se usa.
 
Cuando escribes el nombre del 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 contiene el 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 existe el 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 ver que hay una sucesión de objetos
   'CurrenteDb = Base de datos, esta contiene al objeto:
   'TablaDefs = Colección de todas las tablas
   'le especificamos que tome la 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 parece un 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 investigar como se inicializa cada objeto, el objeto que te 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 hacer esto 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 por referencia, 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 inserte el objeto ActiveX en 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á para el bucle
Dim i As Long
 
   'Aquí le estamos diciendo:
   'A la variable "i", iníciela con el valor 1, termine el bucle cuando valga 5
   'la variable que le 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 variable como 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 valor a la variable,
      'solo se esta preocupando por cumplir la condición inicial.
      'Aquí nosotros le vamos a aumentar el valor a 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 bucle correría eternamente...
      'trabaría el sistema, esto es lo que hay que cuidar con 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 correr el 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), donde se pueden definir diferentes criterios para que el bucle siga dando vueltas en la misma rutina.
 
 
Colecciones
Las colecciones son objetos que podemos comparar con matrices de una sola columna, la ventaja es que son mas flexibles para agregar y consultar datos, 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
 
   'Inicializamos la variable para el objeto Collection
   Set colPrueba = New Collection
   'llenaremos 5 elementos por bucle
   For i = 1 To 5
      'El código en cada elemento es opcional pero se lo agregaremos para este ejemplo
      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 agregar un nuevo elemento, se lo agregaremos al inicio
   colPrueba.Add "Agregado después del bucle", "CodigoDiferente", 1
 
   'Imprimir los datos
   'vamos desde el primer elemento 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 ordenarle al sistema que evalúe resultados, y dependiendo de lo que se obtenga que haga una cosa u otra. Entre estas tenemos:
 
 
IF... THEN... 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
 
Ya 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()
   If 10 > 8 Then
      Debug.Print "La condición SI se cumple"
      'aquí también se pueden meter otros IF si fuera necesario
   Else
      Debug.Print "La condición NO se cumple"
      'aquí también se pueden meter otros 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 muestra mas claro:
 
Sub PruebaSelectCase()
Dim bytPrecio As Byte
 
   bytPrecio = 15 'este valor lo puedes ir variando para hacer pruebas
 
   '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 tiene varias opciones donde debemos seleccionar solo un elemento, esto nos facilita la escritura del código y nos limita las opciones a escoger a 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 cuenta que 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 ver que opciones tenemos con nombre y escoger el elemento que nos interesa.
Un enumerado debe crearse a 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 este procedimiento:
 
Sub PruebaEnumerado(TipoMensaje As enuMensaje)
   'Metemos al Select la variable del 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 puede ocurrir un error en un procedimiento, olvidamos poner un valor necesario, asignamos valores que no corresponden, manejamos mal un objeto, etc.
Cuando ocurre un 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 que sean necesarios. ¿Pero que pasa si el error ocurre en una aplicación que has hecho para otras personas?, ellos no tienen porque ver el 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 porque los 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, por el sistema operativo de otra versión, Office de otra versión, librerías, dll, etc.
 
Empecemos por pasos,
 
GoTo (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 cualquiera finalizado 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 siguiente procedimiento, 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 encuentra al inicio
    GoTo Etiqueta_Del_Inicio
End Sub
 
En este procedimiento podemos observar 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 valor quiere 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áticamente te crea una rutina de error como esta):
 
Copia-pega y analiza este procedimiento,
 
Sub ComprendiendoUnaRutinaDeErrorComun()
'Las palabras "On Error" activan la rutina de error, la siguiente línea dice:
'Al ocurrir un error (en cualquier lugar) saltar a la etiqueta "Tratamiento_Error"
On Error GoTo Tratamiento_Error
 
   'Aquí el cuerpo de procedimiento...
 
 
Salir_Del_Procedimiento:
   'Si no ocurre ningún error llegamos 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 pasara a 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 cerrar un procedimiento, haya error o no
 
   'Aquí la líneas para resolver cualquier cosa antes de salir, porque siempre 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 error el sistema va hacia la rutina del error luego 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 podemos usar "On Error Resume Next"
 
Haremos un ejemplo, vamos a probar dos procedimientos que tienen 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 error porque 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 error porque 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 primer procedimiento 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 genera el 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 llegar a salirse de la pantalla porque al autor se le ocurrio que debía hacer muchos comentarios para dejar bien claro lo que tenia que decir
 
   'La misma línea larga:
   'Aquí se encuentra una línea que puede llegar a salirse de la _
pantalla porque al autor se le ocurrió que debía hacer muchos _
comentarios para dejar bien claro lo que tenia que decir
 
   MsgBox _
   "Este es un mensaje donde se muestra como cortar líneas"
End Sub
 
De esta manera lo puedes hacer con cualquier línea, en cualquier parte de la línea, media vez no cortes ninguna palabra por 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 colocar dos 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 realizar muchas acciones. Haz esta prueba, escribe:
 
Docmd.
 
Al escribir el punto te aparece una lista larga con cosas que puedes 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 formulario del Módulo Asociado Actual)
Me es una palabra que solo puedes usar en los Módulos Asociados (Módulos que están ligados a los formularios), e indica que vas a usar explícitamente el 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 trabajar con 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 alguna duda sobre algo que ves, 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 sobre la 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 llegaste a esta parte, ¡Eres libre para explorar!, bienvenid@ al mundo de la programación...
 
 
Finalizando
El unico "Pero" de escribir artículos como este es que casi siempre se le ha ido por alto algún tema y hay que estar actualizando... si alguien se da cuenta de algo por favor me comunica, así ayudamos a todos
 
En este articulo iba a explicar como se crea un objeto con un modulo de clase, pero al final me pareció que esto ya seria un tema muy especifico, así que lo voy a escribir pero en un articulo diferente
 
Saludos, Byron