Le compactage ne peut être executé dans la base en cours car l'opération consiste a fermer et enregistrer la base en l'enregistrant sous le même nom.
Il faut donc lancer l'opération depuis une autre base.
Si tu tiens à ce que l'action se lance à l'ouverture de ta base, tu peux faire un code autoexec du genre : à l'ouverture inscrit la date du jour dans une table "T", puis compte le nombre de date du jour dans la table "T". Si il y en a moins de 2, alors ouvre base de données "B2.mdb" et ferme la base en cours.
Et tu place en autoexec dans "B2.mdb" le code suivant :
Sub cmdCompacter_Click()
If IsBaseOpen(NomBaseAcompacter) = True Then: Exit Sub
Dim NomBase
NomBase = "C:\Mes documents\Base.MDB"
Dim NomBaseTmp
NomBaseTmp = "C:\Mes documents\BaseTmp.MDB"
DBEngine.CompactDatabase NomBase, NomBaseTmp '1. Compactage dans une nouvelle base
Kill NomBase '2. Suppression de la base originale
Name NomBaseTmp As NomBase '3. Renommer base compactée avec nom de la base originale
End Sub
Function IsBaseOpen(strBase As String) As Boolean
On Error Resume Next
Dim objAccess As Object
Set objAccess = GetObject(strBase)
If Err.Number <> 0 Then BaseOpen = False
If Err.Number = 0 Then BaseOpen = True
Set objAccess = Nothing
End Function