** NORMAS DEL FORO **
Inicio del foro Inicio del foro > Access y VBA > Access y VBA
  Mensajes nuevos Mensajes nuevos RSS - Crear mde o accde desde vba
  Preguntas frecuentes Preguntas frecuentes  Buscar en el foro   Eventos   Registro Registro  Iniciar sesion Iniciar sesion

Crear mde o accde desde vba

 Responder Responder
Autor
Mensaje
rokoko Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 16/Febrero/2008
Localización: Pamplona
Estado: Sin conexión
Puntos: 1826
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita rokoko Cita  ResponderRespuesta Enlace directo a este mensaje Tema: Crear mde o accde desde vba
    Enviado: 07/Febrero/2019 a las 13:25
Tengo este codigo que he encontrado y que funciona, pero si hay algun error de compilacion no la crea y tampoco suelta ningun error. Me gustaria poder controlar ese posible error de compilacion.

Conoceis otra forma de poder hacerlo, no he encontrado mucha info de esto.

Saludos

Public Function MakeACCDE(InPath As String, OutPath As String)
'Valido para mde y accde, nos crea mde o accde
Dim app As New Access.Application

app.AutomationSecurity = 1 'msoAutomationSecurityLow

app.SysCmd 603, InPath, OutPath

Set app = Nothing

End Function





Editado por rokoko - 07/Febrero/2019 a las 21:53
Arriba
javier.mil Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 10/Agosto/2005
Localización: España
Estado: Sin conexión
Puntos: 4275
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita javier.mil Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 07/Febrero/2019 a las 15:12
Buenas ,
Prueba con este código

Public Function funEstaCompilada(PonRutaBase As String, Optional PonPassword As String) As Boolean
'---------------------------------------------------------------------------------------
' Procedimiento: funEstaCompilada
' Fecha        : 10/10/2006 15:19
' Autor        : Javier Gomez ("Javier.Mil")
' Email        : accessdemo@hotmail.com
' WEB          : www.accessdemo.info
' Proposito    : Comprueba si la Base esta compilada
'---------------------------------------------------------------------------------------
    On Error GoTo Err_Local

    Const cAperturaExclusiva As Boolean = True
    Dim accAppNew As New Access.Application
    Dim obj As Object


    DoEvents
    Access.Application.DoCmd.Hourglass True
    funEstaCompilada = False
    SysCmd acSysCmdSetStatus, "Compilando . . ."


    If Len(Dir$(PonRutaBase, vbArchive)) = 0 Then
        MsgBox "Error,  No existe el fichero", vbExclamation, "Fichero"
        GoTo Exit_Local
    End If


    If Len(Trim(PonPassword)) > 0 Then
        accAppNew.OpenCurrentDatabase PonRutaBase, cAperturaExclusiva, PonPassword
    Else
        accAppNew.OpenCurrentDatabase PonRutaBase, cAperturaExclusiva
    End If
    accAppNew.Visible = False


    If accAppNew.IsCompiled = True Then
        funEstaCompilada = True
    Else
        funEstaCompilada = False
        accAppNew.DoCmd.RunCommand acCmdCompileAndSaveAllModules
        funEstaCompilada = True
    End If


Close_Local:
    On Error Resume Next

    accAppNew.CloseCurrentDatabase
    accAppNew.Quit
    Set accAppNew = Nothing

Exit_Local:
    On Error GoTo 0
    Exit Function

Err_Local:
    funEstaCompilada = False
    MsgBox Err.Description, vbCritical, "Error N°:  " & Err.Number
    Resume Exit_Local

End Function


 



Editado por javier.mil - 07/Febrero/2019 a las 15:13
Arriba
rokoko Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 16/Febrero/2008
Localización: Pamplona
Estado: Sin conexión
Puntos: 1826
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita rokoko Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 07/Febrero/2019 a las 17:24
De algo no me estoy enterando, o no lo aplico bien o quizas no funcione, no se

Estoy haciendo pruebas con una base datos, que si compilo se que da error de compilacion
Lo aplico asi para probar,  entiendo que si es False no esta compilada, pero me salta el msgbox de compilado y se queda el raton pensando y abajo en access un mensaje de Compilando...como si quedase un proceso colgado, me imagino que por estas lineas, pero al saltar el msgbox de compilado me deja descolocado.Ermm
DoEvents
    Access.Application.DoCmd.Hourglass True
    funEstaCompilada = False
    SysCmd acSysCmdSetStatus, "Compilando . . ."

If funEstaCompilada("C:\Users\mons22\Desktop\a\Gestion.mdb") = False Then
     MsgBox "Sin compilar"
     Else
     MsgBox "Compilada"
     End If


Editado por rokoko - 07/Febrero/2019 a las 17:24
Arriba
javier.mil Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 10/Agosto/2005
Localización: España
Estado: Sin conexión
Puntos: 4275
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita javier.mil Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 07/Febrero/2019 a las 20:50
Buenas,

Si analizas un poco el código veras que tal como esta  el código casi siempre dará como resultado Compilada = True , ya que con la instrucción
accAppNew.DoCmd.RunCommand acCmdCompileAndSaveAllModules
lo que hace es compilar y guardar  a menos de que se produzca un error durante el proceso de compilación y en ese caso daría como resultado Compilada = False

    If accAppNew.IsCompiled = True Then
        funEstaCompilada = True
    Else
        funEstaCompilada = False
        accAppNew.DoCmd.RunCommand acCmdCompileAndSaveAllModules
        funEstaCompilada = True
    End If


por lo tanto deberías modificar la lineas de arriba y dejarlas asi

    If accAppNew.IsCompiled = True Then
        funEstaCompilada = True
    Else
        funEstaCompilada = False
    End If
Arriba
javier.mil Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 10/Agosto/2005
Localización: España
Estado: Sin conexión
Puntos: 4275
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita javier.mil Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 07/Febrero/2019 a las 20:55
Por ciento creo que deberías modificar el TITULO de este hilo

donde pone

mde o sccde


deberia poner

mde o accde

Arriba
rokoko Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 16/Febrero/2008
Localización: Pamplona
Estado: Sin conexión
Puntos: 1826
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita rokoko Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 07/Febrero/2019 a las 22:48
He corregido el titulo, tendria los dedos espesos jiji

Respecto al codigo, me funciona con unas bases de datos y con otras no, aun sabiendo que estan compiladas y sin errores, me dice no compilado.
De hecho si pongo el codigo original las compila sin problemas, es raro, seguire probando a ver....
Arriba
javier.mil Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 10/Agosto/2005
Localización: España
Estado: Sin conexión
Puntos: 4275
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita javier.mil Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 08/Febrero/2019 a las 09:35
Que versiones de Access funciona y que Versiones No funciona ?
Arriba
rokoko Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 16/Febrero/2008
Localización: Pamplona
Estado: Sin conexión
Puntos: 1826
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita rokoko Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 08/Febrero/2019 a las 20:35
En access 2003 me esta funcionando bien. Donde no iba fino era en access 2013, pero mañana probare otra vez a ver.

Lo que si hace al pasarle la funcion es como querer abrir la base de datos, te pregunta si quieres abrirla, se abre el formulario de inicio, pero luego se cierra. Funcionar funciona en 2003, pero no queda muy transparente.

Saludos
Arriba
javier.mil Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 10/Agosto/2005
Localización: España
Estado: Sin conexión
Puntos: 4275
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita javier.mil Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 12/Febrero/2019 a las 11:06
Hola

Varias cosas:
- No entiendo cuando dices que en Access 2003 No queda muy transparente , puedes explicarlo mejor ?
- No entiendo cuando dices que en Access 2013 No iba muy fino , puedes explicarlo mejor ?

Te aconsejo que inicies una Aplicación desde cero sin código alguno y que luego copies y pegues el siguiente código, y luego lo vuelvas a probar ..........
en teoría debería ir bien en cualquier versión de Access ........



Private Function funTets()
    MsgBox "Esta Compilada= " & funEstaCompilada(Application.CurrentProject.Path & "/" & "PonAquiElNombre.accdb")
End Function



Public Function funEstaCompilada(PonRutaBase As String, Optional PonPassword As Variant) As Boolean
'---------------------------------------------------------------------------------------
' Procedimiento: funEstaCompilada
' Fecha        : 10/10/2006 15:19
' Modificacion : 12/02/2019 10:52
' Autor        : Javier Gomez ("Javier.Mil")
' Email        : accessdemo@hotmail.com
' WEB          : www.accessdemo.info
' Proposito    : Comprueba si la Base esta compilada (True = Si esta compilada y False = No esta compilada)
'---------------------------------------------------------------------------------------
    On Error GoTo Err_Local

    Const cAperturaExclusiva As Boolean = True
    Dim accAppNew As New Access.Application
    Dim obj As Object


    DoEvents

    Rem Comprueba si la Base Existe
    If Len(Dir$(PonRutaBase, vbArchive)) = 0 Then
        MsgBox "Error,  No existe el fichero", vbExclamation, "Fichero"
        GoTo Exit_Local
    End If


    If IsMissing(PonPassword) = False Then
        accAppNew.OpenCurrentDatabase PonRutaBase, cAperturaExclusiva, PonPassword
    Else
        accAppNew.OpenCurrentDatabase PonRutaBase, cAperturaExclusiva
    End If
    accAppNew.Visible = False


    If accAppNew.IsCompiled = True Then
        funEstaCompilada = True
    Else
        funEstaCompilada = False
    End If


Close_Local:
    On Error Resume Next
    accAppNew.CloseCurrentDatabase
    accAppNew.Quit
    Set accAppNew = Nothing


Exit_Local:
    On Error GoTo 0
    Exit Function


Err_Local:
    funEstaCompilada = False
    MsgBox Err.Description, vbCritical, "Error N°:  " & Err.Number
    Resume Exit_Local

End Function





Arriba
rokoko Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 16/Febrero/2008
Localización: Pamplona
Estado: Sin conexión
Puntos: 1826
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita rokoko Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 12/Febrero/2019 a las 12:54
Aun tengo que probarlo mas, en cuanto a que no era transparente queria decir que al pasarle la funcion es como si quisiera abrir la base de datos, me pide abrirla, se empieza a abrir el formulario que tengo de inicio. En principio eso no seria problema.

Y en cuato que en access 2013 no funcionaba bien es porque me decia que no estaba compilada cuando si lo estaba y si errores. En access 2003 no pasaba.

Pero lo tengo que probar a fondo y bien, a ver si saco un rato..

Saludos y gracias
Arriba
rokoko Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 16/Febrero/2008
Localización: Pamplona
Estado: Sin conexión
Puntos: 1826
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita rokoko Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 12/Febrero/2019 a las 18:09
A ver vamos por partes

Estoy haciendo pruebas con varias bases de datos en access 2013. mdb y accdb

1-unas compiladas
2-unas sin compilar y sin fallos en vba
3-otras sin compilar y con fallos en vba

Mi idea es verificar su compilacion, si esta compilada que cree mde o accde, si no lo esta que compile y cree mde o accde, pero si intenta compilar y no puede que salte error diciendo que no se puede crear mde o accde por error en compilacion

opcion 1 si esta compilada sale verdadero, perfecto
opcion 2 si esta sin compilar sale falso, perfecto

para la opcion 3 le he añadido el codigo original esperando que salte el error al no poder compilar, pero no salta.....sale false al principio como tiene que ser
accAppNew.DoCmd.RunCommand acCmdCompileAndSaveAllModules
funEstaCompilada = True
Luego dice verdadero porque lo hemos puesto en true, pero no es real, no se a podido compilar y no salta error.

ahora solo he añadido, dice false como es logico y  tampoco salra error al no poder compilar
accAppNew.DoCmd.RunCommand acCmdCompileAndSaveAllModules

Al llegar a esta ultima linea y no poder compilar deberia de saltar un error no????




Arriba
javier.mil Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 10/Agosto/2005
Localización: España
Estado: Sin conexión
Puntos: 4275
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita javier.mil Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 12/Febrero/2019 a las 22:50
Publicado originalmente por rokoko rokoko escribió:


............... Al llegar a esta ultima linea y no poder compilar deberia de saltar un error no????




En teoría  (No lo he probado)  creo que podrías  "atrapar el error " con la siguiente linea de código:

DoCmd.RunCommand acCmdMakeMDEFile

Al intentar crear la MDE o ACCDE te debería salta el error. ......... solo tendrías que capturarlo y darle las instrucciones.........


Otra opción que podrías probar es con  SysCmd 603 (funciona desde las primeras versiones de Access hasta Access 2016)

    Dim appAccess As Access.Application
    Set appAccess = New Access.Application
    appAccess.SysCmd 603, PonAquiNombreMDB, PonAquiNombreMDE
    appAccess.Quit acQuitSaveNone
    Set appAccess = Nothing


Lógicamente en ambos casos tendrás que poner un On Error GoTo



En resumen para poder crear una MDE o ACCDE No es necesario que la base este compilada pero si que obligado para crear el MDE o ACCDE que este libre de errores  , osea que en teoría debería funcionar lo que pretendes.


 



Editado por javier.mil - 12/Febrero/2019 a las 22:54
Arriba
rokoko Ver desplegable
Colaborador
Colaborador
Avatar

Unido: 16/Febrero/2008
Localización: Pamplona
Estado: Sin conexión
Puntos: 1826
Opciones de entrada Opciones de entrada   Gracias (0) Gracias(0)   Cita rokoko Cita  ResponderRespuesta Enlace directo a este mensaje Enviado: 13/Febrero/2019 a las 18:39
Despues de probar varias cosas lo que me a funcionado bien es esta forma.
Le paso la funcion 2 veces
La 1º tiene esta linea de mas accAppNew.DoCmd.RunCommand acCmdCompileAndSaveAllModules si esta sin compilar la compila si puede.

La 2º sin esa linea y si sigue sin compilar es que hay errores en codigo vba y detengo codigo y lanzo un aviso.

Se puede cerrar. Mucha gracias!!!

Por cierto, en centro de confianza en access 2013 me la estaba jugando, le he dado permisos a la carpeta donde estan las bases de datos y bien.

Queda asi

   If funEstaCompilada(varCarpetaTrabajo & "\" & varNombreBD) = False Then
    'No hago nada simplemente le paso la funcion y si no esta compilada la compila si puede.
    End If
   
   
  
    If funEstaCompilada2(varCarpetaTrabajo & "\" & varNombreBD) = False Then
   MsgBox "No es posible crear mde o accde, errores en codigo vba(No a sido posible compilar). Abre la base de datos y desde el editor de vba compila para ver los errores.", vbExclamation
    Exit Sub
    Else
    'No hago nada y sigue corriendo codigo
    End If



Editado por rokoko - 13/Febrero/2019 a las 18:45
Arriba
 Responder Responder
  Compartir tema   

Ir al foro Permisos de foro Ver desplegable