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!
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.