Access

Cómo crear un archivo MDE/ACCDE compilado de usar VBA

Si eres como yo, siempre estás buscando formas de racionalizar y simplificar tu trabajo. Con ese fin, hace mucho tiempo comencé a desarrollar una rutina para tomar bases de datos que desarrollo y ‘configurarlas’ para su implementación. ¿Qué tipo de cosa hace mi código?

  • Agrega una contraseña (si corresponde)
  • Deshabilita cosas como el cambio de paso, las teclas especiales, …
  • Realiza una copia de seguridad
  • Crea una versión compilada del DB (MDE/ACCDE)

Es ese último punto que pensé en compartir contigo hoy.

¿Qué es una versión compilada (MDE/ACCDE)?

Un MDE/ACCDE es una versión compilada de una base de datos de acceso que ofrece seguridad y protección mejoradas para el diseño de su aplicación.

Un MDB se compila en un MDE y un ACCDB se compila en un ACCDE.

¿Por qué los desarrolladores los usan?

Hay varias razones por las cuales es posible que desee distribuir un MDE/ACCDE a sus usuarios en lugar del archivo MDB/ACCDB sin procesar. Estos incluyen:

  • Protección del diseño

    Los archivos MDE/ACCDE evitan que los usuarios visiten o modifiquen formularios, informes y módulos en la vista de diseño, protegiendo su propiedad intelectual.

  • Seguridad del código

    El código VBA en estos archivos se compila y no se puede ver o editar, manteniendo su lógica de programación segura.

  • Actuación

    Bases de datos compiladas puede Corre más rápido que sus homólogos editables.

  • Integridad de datos

    Si bien los usuarios aún pueden interactuar con la base de datos a través de formularios e informes, no pueden alterar accidentalmente o intencionalmente el diseño de la aplicación.

  • Tamaño de archivo reducido

    El proceso de compilación a menudo da como resultado un tamaño de archivo más pequeño, que puede ser beneficioso para la distribución y el almacenamiento.

¡Es importante tener en cuenta la ausencia de cualquier protección para tablas y consultas! Estos permanecen accesibles para sus usuarios y, como tal, es importante tomar otras medidas para protegerlos (ocultar el panel de navegación es un excelente enfoque para este fin).

Entonces, mientras que los archivos MDE/ACCDE ofrecen ciertos beneficios de seguridad, deben ser parte de una estrategia de seguridad mucho mayor.

¡Mantenga su MDB/ACCDB original!

¡Importante!
Recuerda siempre que ‘típicamente‘Posible revertir un formato MDE/ACCDE al formato MDB/ACCDB (a menos que emplee una empresa que ofrezca el servicio para realizar ingeniería inversa de archivos MDE/ACCDE). Por lo tanto, es fundamental retener siempre el archivo MDB/ACCDB original para futuras necesidades de desarrollo.

Uso de VBA para crear un MDE/ACCDE compilado

Para crear la versión compilada de una base de datos, el corazón del código gira en torno al uso de la función syscmd indocumentada, específicamente utilizando la 603 acsyscmdaction. La sintaxis de función básica es:

SysCmd(AcSysCmdAction, (Argument2), (Argument3))

En el caso de crear archivos MDE/ACCDE:

  • Acsyscmdaction => 603 => Crear archivo MDE/ACCDE
  • Argumento2 => Ingrese la ruta y el nombre del archivo DB para convertir
  • Argumento3 => Salida MDE/ACCDE Ruta y nombre del archivo

Entonces, de hecho, para el comando 603 podemos compararlo con:

SysCmd(603, sInputDbFile, sOutputCompiledFile)

Un ejemplo concreto es:

Dim oAccess               As Access.Application
Const msoAutomationSecurityLow = 1    ' Microsoft Office XX.0 Object Library -> MsoAutomationSecurity

Set oAccess = New Access.Application
oAccess.AutomationSecurity = msoAutomationSecurityLow
oAccess.SysCmd(603, "C:\Databases\Inventory\Inventory_V3.007.accdb", "C:\Databases\Inventory\Inventory_V3.007.accde")
Set oAccess = Nothing

Ahora, con ese conocimiento en la mano, ahora podemos ir y crear funciones de envoltura simples para realizar la conversión.

Creación de un MDE/ACCDE compilado de la base de datos actual

Si está buscando generar una versión compilada de la base de datos actual en la que trabaja y desea hacerlo a través del código, puede lograrlo con un procedimiento como:

'---------------------------------------------------------------------------------------
' Procedure : CurrentDb_MakeACCDE
' Author    : Daniel Pineault, CARDA Consultants Inc.
' Website   : 
' Purpose   : Creates an mde/accde of the current db
' Copyright : The following is release as Attribution-ShareAlike 4.0 International
'             (CC BY-SA 4.0) - 
' Req'd Refs: Late Binding  -> none required
'
' Usage:
' ~~~~~~
' ? CurrentDb_MakeACCDE
'   Returns -> True/False
'
' Revision History:
' Rev       Date(yyyy-mm-dd)        Description
' **************************************************************************************
' 1         2015-10-09              Initial Release
' 2         2025-02-21              Update Error Handler and Header
'---------------------------------------------------------------------------------------
Function CurrentDb_MakeACCDE() As Boolean
    Dim oAccess               As Access.Application
    Dim oFSO                  As Object
    Dim sDbFullName           As String
    Dim sWorkingDirectory     As String
    Dim sDbFileName           As String
    Dim sDbFileExtension      As String
    Dim sDbTempCopy           As String
    Const msoAutomationSecurityLow = 1    ' Microsoft Office XX.0 Object Library -> MsoAutomationSecurity

    On Error GoTo Error_Handler

    sDbFullName = CurrentProject.FullName
    sWorkingDirectory = CurrentProject.Path
    sDbFileName = CurrentProject.Name
    sDbFileExtension = Right(sDbFileName, Len(sDbFileName) - InStrRev(sDbFileName, "."))
    sDbTempCopy = sWorkingDirectory & "\" & Left(sDbFileName, Len(sDbFileName) - 6) & "-Temp.accdb"

    ' Cleanup/Delete any Existing Temp Copies
    If Dir(sDbTempCopy) <> "" Then Kill sDbTempCopy

    ' Make a Copy of the Current Db to be Converted
    If Dir(sDbTempCopy) = "" Then
        Set oFSO = CreateObject("Scripting.FileSystemObject")
        oFSO.CopyFile sDbFullName, sDbTempCopy, True
        'FileCopy sDbFullName, sDbTempCopy 'Permission Denied. => Must use FSO!!!
        DoEvents
    End If

    ' Convert the Copied Db into an mde/accde
    Set oAccess = New Access.Application
    oAccess.AutomationSecurity = msoAutomationSecurityLow
    If sDbFileExtension = "accdb" Then
        oAccess.SysCmd 603, sDbTempCopy, sWorkingDirectory & "\" & Left(sDbFileName, Len(sDbFileName) - 9) & ".accde"
    ElseIf sDbFileExtension = "mdb" Then
        oAccess.SysCmd 603, sDbTempCopy, sWorkingDirectory & "\" & Left(sDbFileName, Len(sDbFileName) - 9) & ".mde"
    End If
    DoEvents

    ' Cleanup/Delete any Existing Temp Copies
    If Dir(sDbTempCopy) <> "" Then Kill sDbTempCopy

    CurrentDb_MakeACCDE = True

Error_Handler_Exit:
    On Error Resume Next
    Set oFSO = Nothing
    Set oAccess = Nothing
    Exit Function

Error_Handler:
    MsgBox "The following error has occurred" & vbCrLf & vbCrLf & _
           "Error Source: CurrentDb_MakeACCDE" & vbCrLf & _
           "Error Number: " & Err.Number & vbCrLf & _
           "Error Description: " & Err.Description & _
           Switch(Erl = 0, "", Erl <> 0, vbCrLf & "Line No: " & Erl) _
           , vbOKOnly + vbCritical, "An Error has Occurred!"
    Resume Error_Handler_Exit
End Function

que luego simplemente ejecuta con una sola línea de código como:

Call CurrentDb_MakeACCDE

O

If CurrentDb_MakeACCDE Then
    Debug.Print "MDE/ACCDE created successfully"
Else
    Debug.Print "MDE/ACCDE NOT created successfully"
End if

Creación de un MDE/ACCDE compilado de otra base de datos

Por otro lado, si desea crear versiones compiladas de otros archivos de base de datos, con un ajuste menor al código anterior, podemos hacerlo con algo más como:

'---------------------------------------------------------------------------------------
' Procedure : MakeACCDE
' Author    : Daniel Pineault, CARDA Consultants Inc.
' Website   : 
' Purpose   : Creates an mde/accde of the specified db
' Copyright : The following is release as Attribution-ShareAlike 4.0 International
'             (CC BY-SA 4.0) - 
' Req'd Refs: Late Binding  -> none required
'
' Input Variables:
' ~~~~~~~~~~~~~~~~
' sFile     : Fully qualified path and filename of the mdb/accdb to create an mde/accde
'               of.
'
' Usage:
' ~~~~~~
' ? MakeACCDE("C:\Database\Inventory\Inventory_V3.007.accdb")
'   Returns -> True/False
'
' Revision History:
' Rev       Date(yyyy-mm-dd)        Description
' **************************************************************************************
' 1         2015-10-09              Initial Release
' 2         2025-02-21              Update Error Handler and Header
'---------------------------------------------------------------------------------------
Function MakeACCDE(ByVal sFile As String) As Boolean
    Dim oAccess               As Access.Application
    Dim oFSO                  As Object
    Dim sDbFullName           As String
    Dim sWorkingDirectory     As String
    Dim sDbFileName           As String
    Dim sDbFileExtension      As String
    Dim sDbTempCopy           As String
    Const msoAutomationSecurityLow = 1    ' Microsoft Office XX.0 Object Library -> MsoAutomationSecurity

    On Error GoTo Error_Handler

    sDbFullName = sFile
    sWorkingDirectory = Left(sFile, InStrRev(sFile, "\"))
    sDbFileName = Mid(sFile, InStrRev(sFile, "\") + 1)
    sDbFileExtension = Right(sDbFileName, Len(sDbFileName) - InStrRev(sDbFileName, "."))
    sDbTempCopy = sWorkingDirectory & "\" & Left(sDbFileName, Len(sDbFileName) - 6) & "-Temp.accdb"

    ' Cleanup/Delete any Existing Temp Copies
    If Dir(sDbTempCopy) <> "" Then Kill sDbTempCopy

    ' Make a Copy of the Current Db to be Converted
    ' FileCopy could be used in this instance, if the file is not in use.
    If Dir(sDbTempCopy) = "" Then
        Set oFSO = CreateObject("Scripting.FileSystemObject")
        oFSO.CopyFile sDbFullName, sDbTempCopy, True
        'FileCopy sDbFullName, sDbTempCopy 'Permission Denied. => Must use FSO!!!
        DoEvents
    End If

    ' Convert the Copied Db into an mde/accde
    Set oAccess = New Access.Application
    oAccess.AutomationSecurity = msoAutomationSecurityLow
    If sDbFileExtension = "accdb" Then
        oAccess.SysCmd 603, sDbTempCopy, sWorkingDirectory & "\" & Left(sDbFileName, Len(sDbFileName) - 9) & ".accde"
    ElseIf sDbFileExtension = "mdb" Then
        oAccess.SysCmd 603, sDbTempCopy, sWorkingDirectory & "\" & Left(sDbFileName, Len(sDbFileName) - 9) & ".mde"
    End If
    DoEvents

    ' Cleanup/Delete any Existing Temp Copies
    If Dir(sDbTempCopy) <> "" Then Kill sDbTempCopy

    MakeACCDE = True

Error_Handler_Exit:
    On Error Resume Next
    Set oFSO = Nothing
    Set oAccess = Nothing
    Exit Function

Error_Handler:
    MsgBox "The following error has occurred" & vbCrLf & vbCrLf & _
           "Error Source: MakeACCDE" & vbCrLf & _
           "Error Number: " & Err.Number & vbCrLf & _
           "Error Description: " & Err.Description & _
           Switch(Erl = 0, "", Erl <> 0, vbCrLf & "Line No: " & Erl) _
           , vbOKOnly + vbCritical, "An Error has Occurred!"
    Resume Error_Handler_Exit
End Function

Una vez más, se puede usar haciendo:

Call CurrentDb_MakeACCDE

O

If MakeACCDE Then
    Debug.Print "MDE/ACCDE created successfully"
Else
    Debug.Print "MDE/ACCDE NOT created successfully"
End if

Y allí lo tiene, 2 rutinas diferentes para compilar sus bases de datos a través del código VBA.

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba