Вы находитесь на странице: 1из 9

CODIGOS Y TRUCOS DE ACCESS 97/2000

* Cdigo muy sencillo que permite a un campo de lista desplegable abrirse al recibir el enfoque. 1.- Agregar el siguiente cdigo a la propiedad Al Recibir el Enfoque de un cuadro combinado: Private Sub Cuadro_Prueba_GotFocus() SendKeys {F4} End Sub * Cdigo que permite verificar si (en este caso) un producto ya ha sido capturado, y no deja continuar hasta que esto se corrija. 1.- Agregar al evento Despus de Actualizar de el campo Producto, el siguiente cdigo: Private Sub Producto_AfterUpdate() If (Not IsNull(DlookUp([Producto],ejercicio1,[Producto] = & Producto & ))) Then Msgbox Este producto ya existe, VbCritical Cancel = True Producto.Undo End If End Sub * Cdigo que permite verificar si el Cdigo Postal y el Telfono pertenecen a un pas especfico. 1.- Agregar el siguiente cdigo al evento Antes de Actualizar del formulario: Private Sub Form_BeforeUpdate(Cancel As Integer) Select Case Pas Case Francia, Italia, Espaa If Len(CP) <> 5 Or Len(Telfono) <> 8 Then MsgBox CP Telfono Incorrecto, VbCritical Cancel = True End If Case Australia, Singapur, Alemania If Len(CP) <> 4 Or Len(Telfono) <> 6 Then MsgBox CP Telfono Incorrecto, VbCritical Cancel = True End If End Select End Sub * Macro que permite compactar la base de datos desde un botn. 1.- Crea una nueva macro: - En la primera lnea, buscar la accin CuadroMsj y escogerla, establecer el mensaje en las propiedades La base de datos se compactar en este momento (Sin las comillas), tipo Aviso y Ttulo AVISO. - En la siguiente lnea, agregar la accin Enviar Teclas y escribir en la opcin Pulsaciones de Teclas los siguientes caracteres: %Huo , y esperar en No. 2.- Agregar la macro al evento Al Hacer Clic de cualquier botn, o agrgalo a cualquier evento que quieras, por ejemplo, al cerrar un formulario. * Cdigo para crear un relojito en un formulario cualquiera. 1.- Insertar una etiqueta en un formulario y escribirle en el Ttulo ( Caption) Espere.... (Sin comillas). Como nombre de la etiqueta ponemos Relojin. 2.- Establecer en las propiedades del formulario, en el evento Intervalo del Cronmetro el nmero 1000, y en el cdigo del evento Al Cronmetro, escribimos el siguiente cdigo:

Private Sub Form_Timer() Relojito.Caption = Time End Sub * Variante del ejercicio anterior pero que cierra la base de datos a una hora determinada (hacemos los mismos pasos que el anterior, slo que el cdigo cambia). Private Sub Form_Timer() Relojito.Caption = Time If Relojito.Caption = 15:00:00 p.m. Then Msgbox Es hora de retirarse DoCmd.Quit End If End Sub * Cdigo que permite aumentar o disminuir fechas usando las techas + y del teclado numrico. Este cdigo puede aplicarse a cualquier campo que tenga un dato que se pueda aumentar o disminuir, como una edad, un ao, etc. 1.- Agregar el siguiente cdigo a la propiedad Al Bajar una Tecla, del campo que se va a utilizar (este campo de preferencia debe de tener un valor predeterminado): Private Sub fecha_KeyDown(KeyCode As Integer, Schift As Integer) Select Case KeyCode Case vbKeyAdd Tambin puedes usar 107,187 Screen.ActiveControl = Screen.ActiveControl +1 SendKeys {Esc} Case vbKeySubtract Tambin puedes usar 109,189 Screen.ActiveControl = Screen.ActiveControl -1 SendKeys {Esc} End Select End Sub * Podemos crear una simple rutina de respaldo de datos que se ejecute al pulsar un botn, a determinada hora o en cualquier evento. Esta es una rutina que recomiendo pero es muy simple, y es una simple sugerencia. 1.- Creas una macro con el nombre RespaldarDatos y agregamos las siguientes lneas de acciones: - En la primera lnea agregamos una accin de CuadroMsj, con el mensaje Se van a respaldar os datos, ttulo RESPALDO DE DATOS. - En la segunda lnea(y las que se deseen, dependiendo de los objetos a respaldar) agregar la accin Copiar Objeto con los siguientes parmetros: o Base de datos de Destino.- Es la base que va a contener el respaldo, y debemos escribir la ruta completa. o Nombre Nuevo.- Se especfica siempre y cuando el objeto a copiar tendr un nombre diferente al actual, si no se deja en blanco. o Tipo del Objeto de Origen.- Aqu vamos a indicar si vamos a copiar una tabla, un formulario, consulta, etc. o Nombre del Objeto de Origen.- Nombre del objeto a copiar. 2.- Una vez que tengas la macro la puedes asignar a un botn, a un evento, o programarlo con el relojito que vimos anteriormente para que se ejecute a determinada hora. Eso ya queda a su imaginacin y necesidad. * Cdigo para mandar un informe por E-Mail como archivo adjunto, el cual puedes asignar a un botn a cualquier evento que quieras: Private Sub Informe_Mail_Clic() Dim Documento as String Documento = PruebaInforme

DoCmd.SendObject acReport, Documento, acFormatXLS End Sub Nota:- La instruccin acFormatXLS convierte el informe a una hoja de excel; la instruccin acFormatHTML convierte el informa a una pgina Web, la instruccin acFormatTXT convierte el reporte a texto. * Las siguientes son las constantes de cdigo de teclas que se pueden usar en el cdigo de VBA:

vbKey0 vbKey1 vbKey2 vbKey3 vbKey4 vbKey5 vbKey6 vbKey7 vbKey8 vbKey9 vbKeyA vbKeyAdd vbKeyB vbKeyBack vbKeyC vbKeyCancel vbKeyCapital vbKeyClear vbKeyControl vbKeyD vbKeyDecimal vbKeyDelete vbKeyDivide vbKeyDown vbKeyE vbKeyEnd

vbKeyF5 vbKeyF6 vbKeyF7 vbKeyF8 vbKeyF9 vbKeyF10 vbKeyF11 vbKeyF12 vbKeyF13 vbKeyF14 vbKeyF15 vbKeyF16 vbKeyG vbKeyH vbKeyHelp vbKeyHome vbKeyI vbKeyInsert vbKeyJ vbKeyK vbKeyL vbKeyLButton vbKeyLeft vbKeyM vbKeyMButton vbKeyMenu

vbKeyNumpad4 vbKeyNumpad5 vbKeyNumpad6 vbKeyNumpad7 vbKeyNumpad8 vbKeyNumpad9 vbKeyO vbKeyP vbKeyPageDown vbKeyPageUp vbKeyPause vbKeyPrint vbKeyQ vbKeyR vbKeyRButton vbKeyReturn vbKeyRight vbKeyS vbKeySelect vbKeySeparator vbKeyShift vbKeySnapshot vbKeySpace vbKeySubtract vbKeyT vbKeyTab

vbKeyEscape vbKeyExecute vbKeyF vbKeyF1 vbKeyF2 vbKeyF3 vbKeyF4

vbKeyMultiply vbKeyN vbKeyNumlock vbKeyNumpad0 vbKeyNumpad1 vbKeyNumpad2 vbKeyNumpad3

vbKeyU vbKeyUp vbKeyV vbKeyW vbKeyX vbKeyY vbKeyZ

* Cdigo que permite bloquear el uso de maysculas, trabaja como funcin. Declare Function GetKeyboardState Lib user32 (pbKeyState As Byte) As Long Declare Function SetKeyboardState Lib user32 (lppbKeyState As Byte) As Long Function chgKeyStatus(codigo) Dim k(255) As Byte, l As Long L = GetKeyboardState(k(0)) If k(codigo) = 0 Then K(codigo) = 1 Else K(codigo) = 0 End If L = SetKeyboardState(k(0)) End Function Function Activar_Desactivar_Mayscula() Dim x X = chgKeyStatus(&H14) &H14 Maysuculas &H90 Bloq Num End Function * Bueno, no todo el mundo sabe como dar de alta un driver ODBC, para conectar bases de datos con ese origen, as que aqu va una pequea explicacin de cmo dar de alta uno (me refiero especficamente al driver de Access). 1.- Ir al Panel de Control de Windows, abrimos el icono Fuente de Datos ODBC, y nos situamos en la pestaa DSN de Sistema. 2.- Pulsamos el botn Agregar para aadir una nueva fuente de datos, lo cual nos lleva a la pantalla de controladores. 3.- en esta ventana elegimos el driver adecuado para la tecnologa de la base de datos que queremos tratar (en este caso, Microsoft Access Driver), y pulsamos finalizar. 4.- La siguiente pantalla nos pide los siguientes datos: - Nombre de Origen de Datos:- Es el alias de nuestra base de datos, as nos referiremos a la BD. - Descripcin:- Una pequea descripcin de la BD - Base de Datos:- Es la ruta de la BD, podemos usar el botn Seleccionar para buscar la ruta de nuestra BD. 5.- Una vez hecho esto, pulsamos el botn Aceptar y listo, tenemos un driver ODBC para usar.

Nota.- Si el sistema operativo es Win NT y declaramos una base de datos ACCESS, debemos tener en cuenta que Access crea en el mismo directorio un archivo con extensin .ldb. Debes de dar los suficientes permisos de lectura a los usuarios para manipular este directorio. * Este cdigo permite ver mensajes personalizados en la barra de estado de Access cuando el ratn se mueve sobre un control en un formulario. 1.- Estas dos rutinas deben estar en un mdulo de manera que sean accesibles globalmente: Global StatusCalled Global CurrentStatusMsg Sub StatusBarMsg(StatusMsg) If StatusMsg <> CurrentStatusMsg Then Dim ss As Variant ss = SysCmd (SYSCMD_SETSTATUS,StatusMsg) StatusCalled = True CurrentStatusMsg = StatusMsg End If End Sub Sub ClearStatusBarMsg() If StatusCalled Then Dim ss As Variant Ss = SysCmd(SYSCMD_CLEARSTATUS) StatusCalled = False CurrentStatusMsg = End If End Sub 2.- el siguiente cdigo se debe aadir al evento MouseMove del control sobre el que deseamos visualizar el mensaje en la barra de estado: Sub CmdButton_MouseMove (Button As Integer, Schift As Integer, x As Single, y As Single) StatusBarMsg Mi mensaje personalizado End Sub 3.- El siguiente cdigo se debe aadir al fondo del formulario para que borre el mensaje cuando el ratn se mueva: Sub Detail0_MouseMove (Button As Integer, Schift As Integer, x As Single, y As Single) ClearStatusBarMsg End Sub * La propiedad Tag de los controles de formularios e informes no es manejada por Access para nada, esa la deben de usar los programadores. Si la usamos, podemos hacer algunas cosas de manera muy sencilla. Por ejemplo, supongamos que un formulario dispone de dos grupos de controles de manera que cuando un grupo est activo el otro no puede ser visible y viceversa. Una manera tradicional de realizarlo sera meter en el evento OnOpen del formulario el siguiente cdigo: If Opcin = 1 Then Me.Control1.Visible Me.Control2.Visible Me.Control3.Visible Me.Control4.Visible Else Me.Control1.Visible = = = = True True False False

= False

End If

Me.Control2.Visible = False Me.Control3.Visible = True Me.Control4.Visible = True

Este cdigo funciona a la perfeccin, pero si modificamos el formulario y metemos ms controles debemos de cambiar el cdigo. Pero si usamos la propiedad Tag y metemos en esta propiedad de cada control, bien Opcin1 bien Opcin2, dependiendo a que conjunto de controles pertenezca, el cdigo que haramos sera el siguiente, y no tendramos que modificarlos, sino poner Opcin1 u Opcin2 a los nuevos controles: Dim frm as Form Frm = me If Opcin = 1 Then For I = 0 to frm.Count 1 If frm(I).tag = Opcin1 Then frm(1).visible = True If frm(I).tag = Opcin2 Then frm.visible = False Next I Else For I = 0 to frm.Count 1 If frm(I).tag = Opcin1 Then frm(1).visible = False If frm(I).tag = Opcin2 Then frm.visible = True Next I End If * Este cdigo permite cerrar Windows desde Access. Es una funcin. Private Declare Function apiExitWindowsEx Lib user32 Alias ExitWindowsEx_ (ByVal uFlags As Long, ByValdwReserved As Long) As Long Public Const EWX_FORCE = 4 Forza a terminar procesos que no respondan Public Const EWX_LOGOFF = 0 Termina los procesos y se desconecta Public Const EWX_SHUTDOWN = 1 Apaga la mquina Public Const EWX_REBOOT = 2 Reinicia el sistema (Opcional) Function fTerminateWin(lngExitVal As Long) fTerminateWin = apiExitWindowsEx(lngExitVal,0) End Function * Podemos abrir una plantilla de Word mediante cdigo. Necesitamos especificar una valor para el argumento de la plantilla de el mtodo Add de la coleccin Documents. Si la plantilla est guardada en la ruta de plantillas original, podemos usarla como constante predefinida, sino, tendremos que especificar la ruta completa de la plantilla. Private objWord As Word.Application Private Sub Command1_Clic() Const conPLANTILLA = \Plantillas\miplantilla.dot Set objWord = New Word.Application With objWord .Visible = Treu .WindowState = wdWindowStateMaximize .Documents.Add Template:=.Options.DefaultFilePath(wdUserTemplatesPath)& conPLANTILLA)

End With End Sub P).- Con este cdigo podemos cerrar automticamente un informe si no hay datos en el informe. Debes de colocar este cdigo en el evento OnNoData. Private Sub_Informe_NoData(Cancel As Integer) MsgBox No hay datos. Esto se cerrar Cancel = True End Sub Pero si abres el informe desde cdigo de un formulario, necesitas el manejo de errores: Private Sub PruebaVaco_Clic() On Error Resume Next Docmd.OpneReport InformePrueba, acViewPreview If Err = 2501 Then Err.Clear End Sub * Este cdigo permite calcular los das laborales entre dos fechas. Es otra funcin. Function DiasLab(FechaInicio As Variant,fechaFin As Variant) As Integer Dim semanas as Variant Dim fecha As Variant Dim dias As Integer FechaInicio = DateValue(FechaInicio) FechaFin = DateValue(FechaFin) Semanas = DateDiff(w,FechaInicio,FechaFin) Fecha = DateAdd(ww, semanas, FechaInicio) Dias = 0 Do While fecha < FechaFin If Format(fecha,ddd)<> Sun And Format(fecha,ddd)<> 2Sar2 Then Dias = dias +1 End If Fecha = DateAdd(d, 1, fecha) Loop DiasLab = semanas * 5x + dias End Function * Con este cdigo, evitamos que se almacene un registro por la causa que nosotros deseemos. Vamos a usar el evento Antes de Actualizar para que pregunte si queremos guardar, y en caso de que no podamos llevar a cabo un deshacer y no se almacene el dato. Private Sub Form_BeforeUpdate(Cancel As Integer) Dim strMsg As String strMsg = "El Dato ha cambiado." strMsg = strMsg & "@Deseas guardar los datos? strMsg = strMsg & "@Presiona Si para guardar No para eliminar" If MsgBox(strMsg, vbQuestion + vbYesNo, "Guardar Registro?") = vbYes Then Else DoCmd.RunCommand acCmdUndo End If End Sub

* Tal vez esto ya lo saban, pero se los recuerdo. Una manera de introducir la fecha y la hora actuales al momento de capturar en tablas formularios, pueden usar lo siguiente: - Presionas Ctrl-; (punto y coma) para la fecha actual - Presiona Ctrl-: (dos puntos) para la hora actual * Una manera de desactivar las teclas para que el usuario no las use en un formulario, es creando una macro, de la siguiente manera: 1.- Crea una macro llamada TeclasdeAccin 2.- Elige Nombres de Macro del men Ver para abrir la columna Nombres de Macro, si es que no est presente ya. 3.- Asigna los nombres de macro usando el cdigo EnviarTeclas de la tecla que deseas desactivar 4.- Agrega la accin EnviarTeclas y dejas vaca la opcin Comentarios 5.- Cierras y guardas la macro. 6.- Guardas y cierras la base de datos. La prxima vez que abras la base de datos, Access activa la macro y listo. Por ejemplo, a mi me interesa que mis usuarios no usen la tecla F1, as que hago lo siguiente: Creo la macro llamada TeclasdeAccin, tecleo {F1} en la columna nombre de macro y elijo EnviarTeclas en la columna de acciones. Dejo vaca la opcin Comentarios. La siguiente vez que abra la base de datos, Access usa esta macro cada vez que oprima la tecla F1, como la opcin comentarios est vaca, Access no hace nada. * Algo que puede ser muy til, pero que no todo mundo usa, es el hecho de ocultar algunas tablas para que no puedan ser vistas. Esto puedes ser muy fcil simplemente nombrando a la tabla pero que inicie con Usys; por ejemplo, si queremos ocultar la tabla Salarios, la nombramos como Usyssalarios. Esto hace que Access la considere como objeto del sistema y se oculta. Si despus la queremos ver, vamos al men Herramientas Opciones, pestaa Ver y activamos la opcin Objetos de Sistema. * Alguna vez me pas que tena una base de datos protegida con contrasea para que nadie accesara a ver mis datos(segn yo). Pero un da al monitorear mi red, descubr que una persona se estaba conectando a mi mquina sin tener autorizacin, as que revis que pasaba y result que mediante una pantalla creada en Visual Basic se vinculaba con mis tablas y poda ver todos mis datos. Lo que tuve que hacer para evitar esto fue codificar (cifrar) mi BD. Esto permite que la BD se guarde con un formato en cdigo que slo puede leerse desde Access. Para hacer esto debes de: 1.- Cerrar la base de datos a codificar 2.- Ir al men Herramientas, Seguridad y despus (Cifrar) Codificar Decodificar, segn sea el caso 3.- Escoge la base de datos a codificar 4.- Especificas un nombre para la base codificada y la guardas La base de datos va a trabajar un poco ms lenta que una normal, pero ganamos en seguridad. Este cdigo lo he usado varias veces, se trata de meter en un cuadro combinado ( cuadro de lista) los nombres de todos los formularios que voy creando, para que al abrir la lista y escoger uno, se abra ese formulario, es muy sencillo y puede serles til. Aqu van las instrucciones: 1.- Primero, coloca un cuadro combinado en tu formulario, y lo nombras ListadeFormularios en su propiedad Nombre (Botn derecho sobre el cuadro, y Propiedades, pestaa Otras). 2.- En la pestaa Datos, selecciona Lista de Valores para la propiedad Tipo de Origen de la Fila. 3.- En la pestaa eventos, en la propiedad Al Entrar, vamos a meter el siguiente cdigo: Private Sub ListadeFormularios_Enter() Dim miDB As Database Dim contenedor As Container Dim I As Integer Dim Lista As String Set miDB = DBEngine.WorkSpaces(0).Databases(0) Set contenedor = miDB.Containers(Forms) Lista =

For I = 0 To contenedor.Documents.Count 1 Lista = Lista & contenedor.Documentos(I).Name & ; Next I Me![ListadeFormularios].RowSource = Left(Lista, Len(Lista) 1) End Sub 4.- Una vez hecho esto, en la propiedad Despus de Actualizar del mismo cuadro combinado, metemos el siguiente cdigo. Private Sub Listadeformularios() Docmd.OpenForm Me![ListadeFormularios] End Sub Ok, est listo para trabajar.

Вам также может понравиться