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
| Option Compare Database
Option Explicit
Const conNomApp = "Nom de l'application"
Public Sub ChoisirBase_Click()
'Détruire les liaisons vers les tables de la base contenant les données, ouvir une boîte de dialogue
'pour sélectionner une base de données, puis créer les liaisons des tables
Dim strMotPasse As String
Dim strCheminBd As String
Dim strConnect As String
Dim strNomsTables() As String
Dim strTemp As String
Dim i As Integer
Dim oDb As DAO.Database
Dim oDbSource As DAO.Database
Dim oTbl As DAO.TableDef
Dim oTblSource As DAO.TableDef
Dim fd As FileDialog
Dim Title As String
Dim FileDialogSelectedItems As String
Dim Reponse As Byte
Dim Cancel As Byte
'Sélection d'une base
'Ouvrir une boîte de dialogue pour sélectionner une base
Set fd = Application.FileDialog(msoFileDialogOpen)
'Déclarer une variable pour contenir le chemin
'de chaque objet sélectionné. Même si le chemin est une chaîne (String),
'la variable doit être Variant parce que la routine For Each ... Next
'fonctionne uniquement avec Variants et Objects.
Dim vrtSelectedItem As Variant
choix:
'Utiliser un bloc With...End With pour référencer l'objet FileDialog.
With fd
'Utiliser la méthode Show pour afficher la boîte de dialogue de sélection de fichier
'et retourner l'action de l'utilisateur.
'L'utilisateur a cliqué sur le bouton d'action, affichage de la boite de dialogue
.Title = "Choisissez la base contenant les données à utiliser" 'personnalise le titre de la boite de dialogue
If .Show = -1 Then
'L'utilisateur a cliqué sur Annuler
If Cancel = True Then
Exit Sub
Else
'Destruction des anciennes liaisons des tables
Dim BD As DAO.Database
Set BD = CurrentDb
Dim tb As DAO.TableDef
Dim Sauv As String
For Each tb In BD.TableDefs
If Left(tb.Name, 4) <> "MSys" Then
If Len(tb.Connect) > 0 Then
DoCmd.RunSQL "DROP TABLE [" & tb.Name & "] ;"
Debug.Print "effacement de " & tb.Name & " -=#=> " & tb.Connect
End If
End If
Next tb
End If
'Vérifier toutes les chaînes dans la collection FileDialogSelectedItems
For Each vrtSelectedItem In .SelectedItems
'vrtSelectedItem est une chaîne qui contient le chemin de chaque objet sélectionné
'Création d'une message box qui affiche le chemin sélectionné
Reponse = MsgBox("La base sélectionnée est : " & vrtSelectedItem, vbOKOnly, conNomApp)
If Reponse = 7 Then
GoTo choix
End If
FileDialogSelectedItems = vrtSelectedItem
Next vrtSelectedItem
'L'utilisateur clique sur annuler
Else
End If
End With
'Création des nouvelles liaisons des tables
'Définir mot passe et chemin base de données
strMotPasse = "pass"
strCheminBd = FileDialogSelectedItems
If IsNull(strCheminBd) Or strCheminBd = "" Then
Exit Sub
End If
'Définir la chaine de connexion permettant la liaison des tables
strConnect = "MS Access;pwd=" & strMotPasse & ";DATABASE=" & strCheminBd
'Instancie l'objet Database de la base courante
Set oDb = CurrentDb
'Instancie l'objet Database de la base protégée
Set oDbSource = DBEngine.OpenDatabase(strCheminBd, True, True, strConnect)
'Parcours l'ensemble des tables de la base de données protégée
'et stocke leur nom
For Each oTblSource In oDbSource.TableDefs
'ignore les tables system
If (oTblSource.Attributes And dbSystemObject) = 0 Then
strTemp = strTemp & oTblSource.Name & "|"
End If
Next
'Ferme la base de données sources (impératif pour la liaison)
oDbSource.Close: Set oDbSource = Nothing
'parcours le tableau de noms de tables
strNomsTables = Split(Left(strTemp, Len(strTemp) - 1), "|")
For i = 0 To UBound(strNomsTables)
'Crée une nouvelle table dans la base de données courante
Set oTbl = oDb.CreateTableDef(strNomsTables(i))
'Lie les deux tables
oTbl.Connect = strConnect
oTbl.SourceTableName = strNomsTables(i)
'Ajoute la table à la base de données
oDb.TableDefs.Append oTbl
Next i
'Rafraîchit la liste des tables
oDb.TableDefs.Refresh
End Sub |
Partager