1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192
| Public Function Clonage(myoldpath As String, myoldname As String)
Dim DaoDB As DAO.Database
Dim oTable As DAO.TableDef
Dim oQuery As DAO.QueryDef
Dim oForm As Object
Dim oReport As Object
Dim oMacro As Object
Dim oModule As Object
Dim oref As Object
Dim oOldRef As Object
Dim Bfound As Boolean
Dim ThisRel As DAO.Relation
Dim ThisField As DAO.Field
Dim Cr As String, i As Integer, cnt As Integer
Dim j As Integer
'Instance pour la nouvelle base
Dim MyNewAccess As Access.Application
'Instance pour l'ancienne base
Dim MyOldAccess As Access.Application
'Création de la nouvelle base via DAO
Set DaoDB = DAO.DBEngine.CreateDatabase(myoldpath & "Temp.mdb", dbLangGeneral)
'Fermeture de la session DAO
DaoDB.Close
Set DaoDB = Nothing
Set MyNewAccess = New Access.Application
Set MyOldAccess = New Access.Application
With MyNewAccess
'Ouverture de la nouvelle base dans une instance
.OpenCurrentDatabase (myoldpath & "Temp.mdb")
'Ouverture de l'ancienne base dans une autre instance
MyOldAccess.OpenCurrentDatabase (myoldpath & myoldname)
'On importe dans la nouvelle base toutes les tables sauf
'les tables système
For Each oTable In MyOldAccess.CurrentDb.TableDefs
If (oTable.Attributes And DAO.dbSystemObject) = False Then
.DoCmd.TransferDatabase acImport, "Microsoft Access", myoldpath _
& myoldname, acTable, oTable.Name, oTable.Name
End If
Next oTable
'On importe dans la nouvelle base toutes les requêtes
For Each oQuery In MyOldAccess.CurrentDb.QueryDefs
.DoCmd.TransferDatabase acImport, "Microsoft Access", myoldpath _
& myoldname, acQuery, oQuery.Name, oQuery.Name
Next oQuery
'On importe dans la nouvelle base tous les formulaires
For Each oForm In MyOldAccess.CurrentProject.AllForms
.DoCmd.TransferDatabase acImport, "Microsoft Access", myoldpath _
& myoldname, acForm, oForm.Name, oForm.Name
Next oForm
'On importe dans la nouvelle base tous les états
For Each oReport In MyOldAccess.CurrentProject.AllReports
.DoCmd.TransferDatabase acImport, "Microsoft Access", myoldpath _
& myoldname, acReport, oReport.Name, oReport.Name
Next oReport
'On importe dans la nouvelle base toutes les macros
For Each oMacro In MyOldAccess.CurrentProject.AllMacros
.DoCmd.TransferDatabase acImport, "Microsoft Access", myoldpath _
& myoldname, acMacro, oMacro.Name, oMacro.Name
Next oMacro
'On importe dans la nouvelle base tous les modules
For Each oModule In MyOldAccess.CurrentProject.AllModules
.DoCmd.TransferDatabase acImport, "Microsoft Access", myoldpath _
& myoldname, acModule, oModule.Name, oModule.Name
Next oModule
'Appel de la procédure d'effacement des références dans
'la nouvelle base
DeleteRefs MyNewAccess
' Parcours de toutes les références de l'ancienne base et ajout
'des absentes dans la nouvelle base
For Each oOldRef In MyOldAccess.References
For Each oref In MyNewAccess.References
If oref.FullPath = oOldRef.FullPath Then
Bfound = True
Exit For
Else
Bfound = False
End If
Next oref
If Bfound = False Then
.References.AddFromFile oOldRef.FullPath
End If
Next oOldRef
'On importe les tables comportant les spécifications
' d'importation/exportation
On Error GoTo Err_Vide
.DoCmd.TransferDatabase acImport, "Microsoft Access", myoldpath _
& myoldname, acTable, "MSysIMEXColumns", "MSysIMEXColumns"
.DoCmd.TransferDatabase acImport, "Microsoft Access", myoldpath _
& myoldname, acTable, "MSysIMEXSpecs", "MSysIMEXSpecs"
'On importe toutes les relations entre les tables
' Parcours de toutes les références de l'ancienne base
For i = 0 To MyOldAccess.CurrentDb.Relations.Count - 1
' Creation de 'ThisRel' avec les valeurs de 'ThatRel'.
Set ThisRel = MyNewAccess.CurrentDb.CreateRelation _
(MyOldAccess.CurrentDb.Relations(i).Name, _
MyOldAccess.CurrentDb.Relations(i).Table, _
MyOldAccess.CurrentDb.Relations(i).ForeignTable, _
MyOldAccess.CurrentDb.Relations(i).Attributes)
' Parcours des champs de la relation
For j = 0 To MyOldAccess.CurrentDb.Relations(i).Fields.Count - 1
' Creation de 'ThisField' avec les valeurs de 'ThatField'.
Set ThisField = ThisRel.CreateField _
(MyOldAccess.CurrentDb.Relations(i).Fields(j).Name)
ThisField.ForeignName = _
MyOldAccess.CurrentDb.Relations(i).Fields(j).ForeignName
ThisRel.Fields.Append ThisField
Next j
MyNewAccess.CurrentDb.Relations.Append ThisRel
Next i
'Fermeture de l'instance s'occupant de la nouvelle base
.Application.Quit
' Fermeture de l'instance s'occupant de l'ancienne base
MyOldAccess.Application.Quit
End With
Set MyNewAccess = Nothing
Set MyOldAccess = Nothing
MsgBox "Done"
'Si la table spécifiée n'existe pas, on passe
Err_Vide:
If Err.Number = 3011 Then
Resume Next
End If
End Function
Public Sub DeleteRefs(MyNewAccess As Access.Application)
Dim oref As Object
On Error GoTo Err_Traitement
'Effacement de toutes les références
For Each oref In MyNewAccess.References
MyNewAccess.References.Remove oref
Next oref
Exit Sub
'Si l'erreur "Vous ne pouvez pas enlever une référence par défaut..."
'apparaît, on sort de la boucle
Err_Traitement:
If Err.Number = 57101 Then
Resume Next
Else
MsgBox Err.Description, vbCritical
End If
End Sub
Public Function Replace(myoldpath, myoldname)
' On copie l'ancienne base en "Corrupted.old" et on l'efface
FileCopy myoldpath & myoldname, myoldpath & "Corrupted.old"
Kill myoldpath & myoldname
' On copie la nouvelle base sous le nom de l'ancienne et on efface
'la Temp.mdb
FileCopy myoldpath & "Temp.mdb", myoldpath & myoldname
Kill myoldpath & "Temp.mdb"
End Function |
Partager