Récupérez vos tables Access 2007 supprimées par erreur.

Publié le par Raymond

Vous avez la possibilité de récupérer une table que vous avez supprimée par erreur, bien sûr, sous certaines conditions.

Si ces conditions sont respectées :
- La base de données n'a pas été fermée depuis que la table a été supprimée,
- La base de données n'a pas été compactée depuis que la table a été supprimée,
- Les tables ont été supprimés en utilisant l'interface utilisateur Access uniquement (hors VBA, requêtes, etc…),
- La table ne contient aucune pièce jointe ou champ multivaleurs,

Alors, votre table a des chances d’être restaurée dans un bon état, tout en sachant bien que cette restauration peut ne pas réussir.

Si l’option « compacter à la fermeture » est positionnée et si vous fermez la base, la table sera irrécupérable car le changement de l’option ne prend effet qu’à la prochaine ouverture de la base. Si cette option n'était pas positionnée, une fermeture ne devrait pas empêcher une bonne restauration.

La table restaurée sera nommée sous un nom unique déterminé par Access (du genre CLP309541) et vous devrez immédiatement la renommer pour éviter qu’une deuxième restauration ne vienne la détruire. Tant que la base ne sera pas compactée, la table supprimée peut rester présente et dans l’état où elle était lors de sa suppression.

La restauration des tables sera réalisée par une procédure VBA que vous trouverez ci-dessous. Cette restauration devant intervenir dès que vous vous apercevez de la suppression, les conditions d’utilisation de la base feront peut-être que vous ne pourrez pas envisager la restauration. Vous devrez déterminer si ce code spécial doit être inclus dans votre base.

Si la table possède des champs pièce Jointe et MultiValeurs, la procédure actuelle ne peut pas restaurer la table. Mais vous pouvez tenter une opération en modifiant la requête, en indiquant tous les champs et non un astérisque, et en n’indiquant pas les champs pièce Jointe et multivaleurs. Les champs indiqués devraient être restaurés normalement.
Vous devez également essayer, sur une copie de base, d’afficher les tables system et de renommer la table refusée dans la table MSysObjects pour qu’elle puisse s’afficher dans la fenêtre. Si vous pouvez récupérer cette table, un code VBA spécifique à écrire vous permettra de restaurer l’ensemble de votre table quels que soient les types de champs. Mais attention, cette opération ne peut être conduite que par un spécialiste Access et toute mauvaise manipulation peut détruire l'ensemble de la base.


Procédure de restauration.
Placez ce code dans un module standard, que vous pourrez exécuter à partir d'un formulaire ou dans la fenêtre exécution. 

Option Compare Database
Option Explicit

Public Sub RestaurerTablesSupprimées()
    On Error GoTo ErrTables
    DoCmd.SetWarnings False
    Dim Db As DAO.Database
    Dim Tbl As String
    Dim strSQL As String
    Dim I As Integer
    Dim TblRestaurées As Integer
    Set Db = CurrentDb()
    For I = 0 To Db.TableDefs.Count - 1
        Tbl = Db.TableDefs(I).Name
        If Left(Tbl, 4) = "~tmp" Then
            strSQL = "SELECT DISTINCTROW [" & Tbl & "].* INTO " & Mid(Tbl, 5) & " FROM [" & Tbl & "];"
            If MsgBox("Voulez-vous restaurer la table " & Mid(Tbl, 5) & " ?", vbYesNo, "Restauration") = vbYes Then
                DoCmd.RunSQL strSQL
                RefreshDatabaseWindow
                TblRestaurées = TblRestaurées + 1
                DoEvents
                MsgBox "Une table a été restaurée sous le nom '" & Mid(Tbl, 5) & "'", vbOKOnly, "Restauration"
            End If
        End If
    Next I
    MsgBox "Restauration terminée, " & TblRestaurées & IIf(TblRestaurées > 1, " Tables restaurées.", " Table restaurée."), vbOKOnly
ExitSub:
    DoCmd.SetWarnings True
    Set Db = Nothing
    Exit Sub
ErrTables:
    MsgBox Err.Description
    Resume ExitSub
End Sub

Publié dans Astuces

Pour être informé des derniers articles, inscrivez vous :
Commenter cet article
A
M'a sauvé la vie... en tous cas, plusieurs heures de travail perdues, et miraculeusement récupérées. Merci
Répondre