Bonjour à tous,

Pour des tables liées d'Access à SQL Server, au travers d'un DSN, j'avais besoin de modifier la base de données, l'utilisateur et le mot de passe conservés en mémoire (chaine de connexion stockée dans la table MSysObjects, champ Connect)

Ci-joint le code VBA qui a fonctionné chez moi, si ça peut servir à quelqu'un

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
Sub MAJUserMdp(NomDSN As String, NouvDatabase As String, NouvUser As String, NouvPwd As String)
Dim TDef As DAO.TableDef, ChaineConnect, i As Long, Places(1 To 4) As Long, NouvChaineConnect As String
    'Pour chaque table
    For Each TDef In CurrentDb.TableDefs
        'S'il y a une table source (table liée)
        If TDef.SourceTableName <> "" Then
            ChaineConnect = Split(TDef.Connect, ";")
            Places(1) = -1
            Places(2) = -1
            Places(3) = -1
            Places(4) = -1
            For i = LBound(ChaineConnect) To UBound(ChaineConnect)
                'Identifie places DSN, DATABASE, UID, PWD
                If UCase(ChaineConnect(i)) Like "DSN=*" Then
                    Places(1) = i
                ElseIf UCase(ChaineConnect(i)) Like "DATABASE=*" Then
                    Places(2) = i
                ElseIf UCase(ChaineConnect(i)) Like "UID=*" Then
                    Places(3) = i
                ElseIf UCase(ChaineConnect(i)) Like "PWD=*" Then
                    Places(4) = i
                End If
            Next i
            'Si tout trouvé
            If Places(1) >= 0 And Places(2) >= 0 And Places(3) >= 0 And Places(4) >= 0 Then
                'Si bon DSN, mise à jour chaine connection
                If UCase(ChaineConnect(Places(1))) = "DSN=" & UCase(NomDSN) Then
                    ChaineConnect(Places(2)) = "DATABASE=" & NouvDatabase
                    ChaineConnect(Places(3)) = "UID=" & NouvUser
                    ChaineConnect(Places(4)) = "PWD=" & NouvPwd
                    NouvChaineConnect = Join(ChaineConnect, ";")
                    TDef.Connect = NouvChaineConnect
                    TDef.RefreshLink
                End If
            End If
        End If
    Next TDef
    CurrentDb.TableDefs.Refresh
End Sub