IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBA Access Discussion :

Comment lier une base à une autre sans spécifier son chemin d'accès mais seulement son nom


Sujet :

VBA Access

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 40
    Points : 14
    Points
    14
    Par défaut Comment lier une base à une autre sans spécifier son chemin d'accès mais seulement son nom
    Bonjour tout le monde,

    En supposant que mes 2 bases sont enregistrées dans le même dossier, je recherche le moyen (si bien sûr c'est possible) de lier une base A à une base B, sans avoir à spécifier le chemin d'accès complet, mais seulement en donnat le nom de la base A.
    Mon but est de pouvoir copier les 2 bases sur un autre PC, et de ne pas avoir à chaque fois à relier les 2 bases (vu que le chemin d'accès diffère) pour pouvoir les utiliser.

    Je vous remercie par avance pour votre aide

  2. #2
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 040
    Points
    16 040
    Par défaut
    Bonjour,

    Tu peux prendre connaissance de ce tutoriel, cela devrait répondre à ton besoin : Liaisons dynamiques pour bases fractionnées.

    Domi2
    Vous avez des montres, nous avons le temps ! (citation attribuée à L.-S. Senghor)

    Ici, on ne perd pas de temps ! On en passe...


    Access : créer des codes-barres 128 en VBA
    Access : les commandes intégrées des menus

    Ce message (ou un autre) vous a aidé ? Votez pour lui avec

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 40
    Points : 14
    Points
    14
    Par défaut
    merci beaucoup pour ta réponse Domi2

    vu le but de mon projet (utiliser SQL et QBE sur 2 tables liées), je n'ai pas réellement besoin d'une gestion aussi performante des bases liées. De plus, je ne connais pas VBA, et le temps me manque pour apprendre ce langage...
    En fait, j'ai pu lire qu'on pouvait utiliser les chemins relatifs au lieu de ceux absolus pour lier 2 bases :
    - en ouvrant la feuille Propriété de la Requête
    - avant d'effectuer le choix de la table on modifie le champ Base source
    et il était dit qu'il fallait faire attention à la valeur du Dossier de la base de données par défaut qui est implicitement pris en compte.

    J'ai donc enregistré mes 2 bases (Base1 et Base2) dans le même dossier. Puis pour créer une requête dans Base1 (en utilisant des tables de Base2) j'ai tapé "Base2" dans l'attribut Base source de la feuille de propriétés, mais cela ne marche pas...
    j'ai aussi essayé "Base2.accdb"... (je suis sous Access 2007)

    Je vous remercie par avance pour votre aide

  4. #4
    Rédacteur/Modérateur
    Avatar de Jeannot45
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2004
    Messages
    3 871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2004
    Messages : 3 871
    Points : 8 489
    Points
    8 489
    Par défaut


    Un manière simple d'éviter d'entrer dans un développement VBA, c'est de faire sur le second PC une arborescence identique que celle du PC sur lequel tu développes.

    Imaginons que sur ton poste, tu développes la base BASE1 avec des tables liées issues de la BASE2. Tes bases sont stockées dans le même répertoire :

    C:\Mes Documents\Developpez

    Ainsi la première fois que tu recopies tes bases sur le second PC tu crées la même arborescence.
    Tu ne devrais pas avoir de problème par la suite.
    Jeannot

    Liens Office indispensables à visiter: Cours (Tutos), F.A.Q., Sources VBA

    Ne posez pas de questions par MP, je n'ai pas le temps d'y répondre

  5. #5
    Membre expérimenté Avatar de RobiPMS
    Homme Profil pro
    Conseiller psycho-pédagogique
    Inscrit en
    Octobre 2007
    Messages
    827
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Conseiller psycho-pédagogique
    Secteur : Enseignement

    Informations forums :
    Inscription : Octobre 2007
    Messages : 827
    Points : 1 506
    Points
    1 506
    Par défaut
    Bonjour.
    Sans apprendre tout VBA , voici quelque chose qui me semble répondre à ta demande.
    D'abord, la fonction qui récupère le chemin du répertoire courant:
    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
    Public Function ParentDir(ByVal str As String) As String
    ' Fonction qui permet de récupérer le répertoire courant de la base de donnée
        Dim i As Integer
     
         ' repère le dernier "\"
        If Right(str, 1) = "\" Then str = Left(str, Len(str) - 1)
     
         ' maintenant regarde le précédent
        For i = Len(str) To 1 Step -1
            If Mid(str, i, 1) = "\" Then
                Debug.Print "Fichier " & Right(str, Len(str) - i)
                str = Left(str, i)
                GoTo fin01
            End If
        Next i
     
    fin01:
            Debug.Print "Répertoire " & str
            ParentDir = str
     
    End Function
    Ensuite une fonction qui établit la liaison vers deux tables (dans cet exemple) d'une autre base située dans le même répertoire (que j'ai appelée Nom_de_la_base.accdb). Dans cet exemple, j'ai utilisé le même nom pour la table-source et pour sa liaison (table liée). Toujours dans cet exemple, j'ai déclenché la procédure sur l'ouverture d'un formulaire. Bien entendu tu peux aussi la déclencher avec un bouton dans un formulaire.
    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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    Private Sub Form_Open(Cancel As Integer)
    On Error GoTo Err_Form_Open
     
    ' * Effacement des tables liées présentes
        DoCmd.SetWarnings False
        DoCmd.DeleteObject acTable, "Table1"
        DoCmd.DeleteObject acTable, "Table2"
        DoCmd.SetWarnings True
     
    ' * Liaison avec les tables 
        Dim strMotPasse As String
        Dim strCheminBd As String
        Dim strNomTable As String
        Dim strConnect As String
        Dim oDb As DAO.Database
        Dim oTbl As DAO.TableDef
     
      ' Définit mot passe, nom table, chemin base de données
        strMotPasse = ""
        strCheminBd = ParentDir(Application.CurrentDb.Name) & "Nom_de_la_base.accdb"
     
        Set oDb = CurrentDb      ' Instancie l'objet Database
     
        strConnect = "MS Access;pwd=" & strMotPasse & ";DATABASE=" & strCheminBd       ' Définit la chaine de connexion permettant la liaison
     
      ' Crée un lien vers la table 'Table1' de Donnees
        strNomTable = "Table1"
        Set oTbl = oDb.CreateTableDef(strNomTable)
        With oTbl
            .Connect = strConnect
            .SourceTableName = "Table1"
        End With
      ' Ajoute la table à la base de données
        oDb.TableDefs.Append oTbl: oDb.TableDefs.Refresh
     
      ' Crée un lien vers la table 'Table2'
        strNomTable = "Table2"
        Set oTbl = oDb.CreateTableDef(strNomTable)
        With oTbl
            .Connect = strConnect
            .SourceTableName = "Table2"
        End With
      ' Ajoute la table à la base de données
        oDb.TableDefs.Append oTbl: oDb.TableDefs.Refresh
     
        MsgBox "Tous les liens ont été actualisés.", vbInformation
     
    Exit_Form_Open:
        Exit Sub
    Err_Form_Open:
        MsgBox Err.Description
        Resume Exit_Form_Open
    End Sub
    J'espère que ça correspond à ce que tu cherches...
    Cordialement
    N'oubliez pas de tagguer la discussion comme résolue si vous avez été aidé!
    Plus haut monte le singe, plus il montre son cul (Montaigne)
    Je ne réponds pas aux messages personnels concernant des questions discutées dans le forum.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 40
    Points : 14
    Points
    14
    Par défaut
    merci pour ta réponse Jeannot45, en fait le "deuxième pc" je ne le connais pas et je n'y ai pas accès d'où le fait que je ne puisse pas créer le même chemin.

    RobiPMS je te remercie pour ton aide
    je rencontre quelques difficultées pour mettre en place le code :
    j'ai ouvert mon formulaire : Feuille de Propriétés-> Evènement->sur activation->générateur de code
    puis j'ai copié tes 2 fonctions dans :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub Form_Current()
    ...
    End Sub
    mais rien ne se passe quand j'ouvre le formulaire.

    je ne sais pas si j'ai fait n'importe quoi...
    merci par avance pour votre aide

  7. #7
    Expert éminent sénior
    Avatar de Domi2
    Homme Profil pro
    Gestionnaire
    Inscrit en
    Juin 2006
    Messages
    7 194
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : Suisse

    Informations professionnelles :
    Activité : Gestionnaire
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2006
    Messages : 7 194
    Points : 16 040
    Points
    16 040
    Par défaut
    Bonjour,

    La première fonction, tu dois la copier dans un module de code standard et non dans le module du formulaire.

    Et la deuxième procédure, tu dois la copier non pas dans l'événement Sur activation, Form_Current, mais dans l'événement Sur ouverture, Form_Open.

    Ca devrait aller mieux.

    Domi2
    Vous avez des montres, nous avons le temps ! (citation attribuée à L.-S. Senghor)

    Ici, on ne perd pas de temps ! On en passe...


    Access : créer des codes-barres 128 en VBA
    Access : les commandes intégrées des menus

    Ce message (ou un autre) vous a aidé ? Votez pour lui avec

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 40
    Points : 14
    Points
    14
    Par défaut
    merci Domi2

    j'ai fais les changements adéquats, mais il ne se passe toujours rien.
    j'ai juste enregistré les 2 fonctions aux bons endroits (je ne pense pas avoir fait d'erreur sur les noms des tables et des bases, car j'ai repris les mêmes que dans le code de RobiPMS pour éviter des erreurs et tester le code),
    mais y a-t-il une manip générale essentielle ou des changements importants à faire dans le code VBA pour que ça fonctionne ?

    merci pour votre aide

  9. #9
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    1 186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 186
    Points : 2 502
    Points
    2 502
    Par défaut
    Bonjour,

    y a-t-il une manip générale essentielle ou des changements importants à faire
    L'exécution des macros peut être bloqué par le niveau de sécurité configuré.

    Sinon pour la demande initiale d'avoir le même chemin pour chaque base, quelque soit le PC,
    il est également possible d'utiliser les liens symbolique vers un dossier.
    lien symbolique.

    Avec des liens symboliques ou des jonctions de partitions, il est même possible
    de faire pointer un lien vers une autre partition, sans qu'un programme ne soit perturbé.

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 40
    Points : 14
    Points
    14
    Par défaut
    merci pour ta réponse BlueMonkey

    au niveau des liens symboliques (à moins d'avoir mal compris), si je change de répertoire mes 2 bases, alors je dois recréer le lien symbolique non?

    et en enregistrant mes 2 bases sur un autre pc, je dois créer le lien symbolique aussi sur le 2ème pc ?

  11. #11
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    1 186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 186
    Points : 2 502
    Points
    2 502
    Par défaut
    si je change de répertoire mes 2 bases, alors je dois recréer le lien symbolique non?
    C'est exact.

    En enregistrant mes 2 bases sur un autre pc, je dois créer le lien symbolique aussi sur le 2ème pc
    Si la base n'est pas dans le répertoire attendu par le lien, oui.

    Il faut bien voir que les liens permette juste de rendre transparent le fait qu'on travaille,
    sur dans un répertoire ou un autre. Rien de plus.

    exemple : on travaille sur plusieurs version d'une base ou d'un logiciel.
    Pour passer d'une version à l'autre, il suffit de changer le lien symbolique pour pointer sur la version souhaitée.

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 40
    Points : 14
    Points
    14
    Par défaut
    d'accord merci BlueMonkey

    je vais peut-être me répéter, mais mon but est de remettre mes 2 bases liées à une personne, et qu'une fois qu'elle les aura enregistrées sur son pc qu'elle n'ait pas à relier les 2 tables de mes 2 bases pour executer les requêtes.
    donc le mieux c'est peut-être le code VBA, mais je n'arrive pas à le faire fonctionner... et si j'ai bien compris je n'ai rien à faire de plus que d'enregistrer les 2 fonctions de RobiPMS ?

    en enlevant la sécurité : Access m'affiche le formulaire que j'ai mis par défaut à l'ouverture de ma base. Je l'ai donc fermé, ainsi que celui sur ma table1. Puis en voulant rouvrir le formulaire de table1 j'ai le message suivant :
    "Le moteur de bases de données n'a pas pu verrouiller la table "Table1" car elle est déjà utilisée par une autre personne ou un autre processus."

    serait-ce la source du problème?

    merci par avance pour votre aide

  13. #13
    Membre émérite
    Homme Profil pro
    Inscrit en
    Décembre 2011
    Messages
    1 186
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 1 186
    Points : 2 502
    Points
    2 502
    Par défaut
    "Le moteur de bases de données n'a pas pu verrouiller la table "Table1" car elle est déjà utilisée par une autre personne ou un autre processus."
    Pour ce type de problème, essaye de sortir d'Access, puis de relancer.
    Si ça ne fonctionne pas. Essaye en fermant la session Windows.

    Enfin si rien de cela fonctionne, essaye un compactage (réparation induite )

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 40
    Points : 14
    Points
    14
    Par défaut
    merci BlueMonkey!
    je crois que je m'embourbe dans ce code VBA, que je n'ai peut-être pas assez adapté.
    De plus, j'ai retrouvé de la doc sur ma 1ère méthode dont le but est que les tables de Base2 n'apparaissent pas dans Base1 (ce qui n'était pas le cas car j'utilisais l'importation sous Access) :
    mettre dans "Base source" de la feuille de propriétés d'une requête le nom de ma 2ème base, et il faut (ce que je n'avais pas fait) pour utiliser les champs faire précéder leur nom par le nom de la 2ème base (dans le code SQL) :
    exemple : Base2.Table1.Prenom

    néanmoins le fichier doit se trouver dans C:\Users\sophie\documents
    donc je le mets à cet endroit, mais quand j'execute Access me dit :
    "Fichier C:\Users\sophie\documents\Base2.mdb introuvable"

    je pense que tout cela est due à l'extension... mais pourquoi veut-il un ".mdb" (extension anglaise?) au lieu d'un ".accdb"? que puis-je faire (j'arrive pas à changer cette extension)?

    merci par avance pour votre aide

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 40
    Points : 14
    Points
    14
    Par défaut
    Bonjour,
    je viens de trouver que l'extension ".mdb" correspond à Access 2002-2003, j'ai donc enregistré ma 2ème base en Access 2002-2003.

    Quand j'exécute ma requête dans Base1 utilisant une table de Base2 ça fonctionne. Néanmoins Base2 doit contenir un mot de passe à l'ouverture, et quand j'en mets un, la requête dans Base1 ne fonctionne plus : j'ai le message "Mot de passe non valide", alors qu'on ne m'a demandé à aucun moment d'entrer le mot de passe de la 2ème base pour exécuter ma requête.
    Auriez vous une idée ? merci par avance

    je demande aussi si passer d'Access 2007 à 2002-2003 implique d'importantes pertes de fonctionnalité de ma base ?

  16. #16
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2011
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 16
    Points : 9
    Points
    9
    Par défaut Merci !
    un grand merci à RobiPMS !!!
    cela a fonctionné du premier coup et c'est d'une simplicité impressionnante !! génial !

Discussions similaires

  1. Comment attacher une base de données sans son fichier log
    Par callo dans le forum MS SQL Server
    Réponses: 16
    Dernier message: 05/06/2014, 11h03
  2. [AC-2003] Comment lier un projet à une base de données
    Par cedill23 dans le forum VBA Access
    Réponses: 3
    Dernier message: 15/07/2009, 12h01
  3. Comment lier application avec une base distante
    Par Duke_MBA dans le forum VB.NET
    Réponses: 12
    Dernier message: 24/11/2008, 07h44
  4. Comment lier un treeview à une base de données ?
    Par Fngonka dans le forum ASP.NET
    Réponses: 5
    Dernier message: 22/05/2008, 16h33
  5. Réponses: 5
    Dernier message: 24/03/2007, 15h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo