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 :

Comparer 2 tables et les mettre à jour


Sujet :

VBA Access

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    46
    Détails du profil
    Informations personnelles :
    Âge : 81
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 46
    Points : 17
    Points
    17
    Par défaut Comparer 2 tables et les mettre à jour
    Bonjour,

    J'ai réalisé une base de données pour une association de près de 2000 membres. Cette base comporte une vingtaine de champs. l'adhésion à cette association ce faisait par courrier. Depuis quelques temps, l'adhésion peut se faire par CB.
    Aujourd'hui, nous avons donc 2 bases avec les mêmes champs. mais avec des étiquettes différentes selon la provenance par exemple "I_Nom" (base Internet) et "Nom" (base access) etc
    J'ai préparé un formulaire avec sous formulaire mettant les 2 bases en correspondances à partir d'une requête de comparaison (mail, ou nom+prénom+ville)
    Je souhaterait faire une procédure événementielle sur chargement qui mettrait en gars les différences dans les champs La mise à jour se faisant alors ensuite par un double clics
    Existe-t-il une méthode en VBA de comparaison de tous les champs ? Et quelle est la syntaxe du code qui doit désigner le Sous Formulaire ?
    Merci

  2. #2
    Membre expérimenté
    Avatar de Papy Turbo
    Homme Profil pro
    Développeur Office/VBA
    Inscrit en
    Mars 2004
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Office/VBA
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 822
    Points : 1 709
    Points
    1 709
    Par défaut
    Bonjour, Phyl,

    a priori, ce que tu décris fera
    - une comparaison entre 2 enregistrements (pas d'un coup sur toute la table, donc pas au chargement), à déclencher dans Form_Current (sur Activation), ou sur résultat d'une recherche (par nom, mail???). Bref, lors de l'affichage côte à côte des 2 enregistrements,
    - il te faudra, dans le code, comparer champ par champ, et mettre en gras les contrôles que tu veux (txtXXXX.FontBold = True/False),
    - mise à jour à définir : tu veux garder une seule table ?, laquelle... ?
    En tout cas, oui, le double clic peut très bien copier un contrôle dans l'autre.

    Quant à la syntaxe, il doit y avoir des articles là dessus, mais c'est simple.
    Par exemple, un double clic sur un contrôle du sous-form. de gauche (text box du champ I_nom, par exemple, que tu auras nommé "txtI_Nom") peut le copier dans le même champ à droite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub txtI_Nom_DoubleClick()
        Me.Parent.SousFormDroite!txtNom = txtI_Nom
    End Sub

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    46
    Détails du profil
    Informations personnelles :
    Âge : 81
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 46
    Points : 17
    Points
    17
    Par défaut
    Merci Papy Turbo,

    Si je comprends bien, la comparaison des champs devra se faire avec une fonction "If" "Then" pour chaque champs au démarrage du formulaire.

    Je vais essayer cela, je note surtout ce qui me manquait utiliser la syntaxe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me.Parent.SousFormDroite!txtNom = txtI_Nom
    Perso je mettais le nom du formulaire sous la forme [SousFormDroite]

  4. #4
    Membre expérimenté
    Avatar de Papy Turbo
    Homme Profil pro
    Développeur Office/VBA
    Inscrit en
    Mars 2004
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Office/VBA
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 822
    Points : 1 709
    Points
    1 709
    Par défaut
    - Oui, pour "If ... Then ..."
    - Non, pour "au démarrage". Tu dois le faire pour chaque couple d'enregistrements -> Form_Current par exemple.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    46
    Détails du profil
    Informations personnelles :
    Âge : 81
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 46
    Points : 17
    Points
    17
    Par défaut
    J'ai mis ce code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Private Sub Form_Current()
     
    ' Première vérification Uid.
    If Me![I_Uid] <> Me.[Import SF Membres]![Uid] Then
        Me![I_Uid].FontBold = True
        Me![I_Uid].ForeColor = 255 
    End If
    End Sub
    Le codage avec un point sans [] me donnait une erreur, avec celui ci-dessus, je n'ai pas d'erreur, mais cela ne fonctionne pas !
    Merci de ton aide

  6. #6
    Membre expérimenté
    Avatar de Papy Turbo
    Homme Profil pro
    Développeur Office/VBA
    Inscrit en
    Mars 2004
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Office/VBA
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 822
    Points : 1 709
    Points
    1 709
    Par défaut
    Qu'est-ce qui ne fonctionne pas ?
    - Message d'erreur : merci de le copier exactement,
    - ça ne passe pas en gras ?
    - autre ?

    A priori, vu que tu as gardé les noms des champs, je te conseille de renommer chaque contrôle avec "txt" en tête du nom, comme l'exemple + haut, si tu ne l'as pas encore fait. Idem, pour tous autres contrôles : "lbl" pour les labels, ... Tu choisis tes préfixes, mais il en faut !
    Ça te prendra 2 minutes, et tu n'auras plus de micmac entre les champs ([I_uid]) et les contrôles auxquels ils sont liés ([txtI_uid]).
    Les 2 ont bien sûr la même valeur, donc tu peux comparer aussi bien les champs que les contrôles, dans le "If ... Then".
    Mais va essayer de mettre un champ en gras !

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    46
    Détails du profil
    Informations personnelles :
    Âge : 81
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 46
    Points : 17
    Points
    17
    Par défaut
    Je viens d'essayer avec cette fois l'erreur suivante :

    Erreur d’exécution '2465'
    Microsoft Access ne trouve pas le champ "txtI_Uid" auquel il est fait référence dans votre expression.

    Faut-il changer chaque contrôle dans la table, puis les requêtes et les formulaires ?

  8. #8
    Membre expérimenté
    Avatar de Papy Turbo
    Homme Profil pro
    Développeur Office/VBA
    Inscrit en
    Mars 2004
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Office/VBA
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 822
    Points : 1 709
    Points
    1 709
    Par défaut
    Citation Envoyé par Phyl Voir le message
    Faut-il changer chaque contrôle dans la table, puis les requêtes et les formulaires ?
    Il n'y a aucun contrôle, ni dans la table, ni dans les requêtes : seulement des champs.
    Dans les formulaires et les états, il y a des contrôles (textbox, label, listes, boutons de commande, bascule, radio...).
    À chaque contrôle, tu peux affecter un champ provenant du recordset (table ou requête) qui est la source du formulaire.
    Il faut clairement distinguer l'un de l'autre, même s'ils ont la même valeur et que le VBA d'Access permet souvent d'utiliser aussi bien l'un que l'autre.

    Quand on dit "renommer les contrôles", il faut changer leurs noms parmi leurs propriétés, en mode création du formulaire.
    Puis mettre les mêmes noms dans le code VBA...

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    46
    Détails du profil
    Informations personnelles :
    Âge : 81
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 46
    Points : 17
    Points
    17
    Par défaut
    Bon, je n'y arrive pas, j'ai tout revu et relu tes messages très explicite.

    Je connais biens les noms des différentes données : table champ, étiquette pour avoir fait plusieurs procédure et macro sur cette base. J'ai refait mon formulaire avec des noms de champs différents selon que l'on est sur la table (ou requête) d'Importation ou bien sur la table des Membres.
    Quand je vais dans la propriété du champ, je vois bien la rubrique "source de contrôle" mais j'ai une liste déroulante qui me permet de choisir le champ en relation.
    Si je nomme ce contrôle txtxxxx il me donne erreur et ne le trouve pas.

    J'ai toujours mon code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub Form_Current()
    ' Première vérification Uid.
    If Me!I_Uid <> Me.Parent.Import_SF_Membres!Uid Then
        Me!I_Uid.FontBold = True
        Me!I_Uid.ForeColor = 255  
    End If
    End Sub
    Quand je pointe ma souris sur Me!I_Uid il me donne bien le bon renseignement en revanche sur "Parent" il m'indique une erreur ???

    En revanche, le double click fonctionne bien avec le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Private Sub ID_DblClick(Cancel As Integer)
    Me.Import_SF_Membres!Uid = Me!I_Uid
    End Sub
    Merci de ta grande patience

  10. #10
    Membre expérimenté
    Avatar de Papy Turbo
    Homme Profil pro
    Développeur Office/VBA
    Inscrit en
    Mars 2004
    Messages
    822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Office/VBA
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2004
    Messages : 822
    Points : 1 709
    Points
    1 709
    Par défaut
    Bonjour, Phyl.
    Juste encore un poil, on y arrive.
    Citation Envoyé par Phyl Voir le message
    J'ai refait mon formulaire avec des noms de champs différents selon que l'on est sur la table (ou requête) d'Importation ou bien sur la table des Membres.
    On n'a pas besoin de toucher aux noms des champs, dans les tables ou les requêtes. Ils peuvent être différends d'une table à l'autre, mais ça n'a aucune influence sur tes 2 sous-formulaires. Donc, on les oublie pour l'instant : on va juste les utiliser avec leurs noms existants.
    Citation Envoyé par Phyl Voir le message
    Quand je vais dans la propriété du champ (non), je vois bien la rubrique "source de contrôle" mais j'ai une liste déroulante qui me permet de choisir le champ (oui) en relation.
    - il ne s'agit pas ici des propriétés du champ (dont les propriétés sont dans les tables ou les requêtes), mais du contrôle.
    - la liste déroulante "Source du contrôle" permet de choisir le champ de table à afficher/modifier dans ce contrôle, par exemple I_Uid.
    Jusqu'ici tout va bien.
    Citation Envoyé par Phyl Voir le message
    Si je nomme ce contrôle txtxxxx il me donne erreur et ne le trouve pas.
    Aïe, aïe, aïe
    1- ce n'est pas le contrôle que tu es en train de renommer. Pour renommer le contrôle, il faut aller dans l'onglet Autres, propriété Nom -> le nom que tu lui donnes (txtI_Uid, par exemple) apparaîtra alors dans le titre de la boîte de propriétés.
    2- bien sûr, si tu indiques, comme Source du contrôle un nom de champ qui n'appartient pas à la table (ou requête), il ne peut pas le trouver.

    Dans ton code VBA (ou tes macros), il faudra bien sûr corriger le nom du contrôle, tel que tu l'as indiqué en 1-, ci-dessus.

    C'est sûr que j'apprécie particulièrement Access, mais je hais cordialement le développeur MS qui a décidé, quant on fait glisser un champ sur un formulaire, de créer automatiquement un contrôle portant le même nom !

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    46
    Détails du profil
    Informations personnelles :
    Âge : 81
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 46
    Points : 17
    Points
    17
    Par défaut
    J'y suis arrivé.

    J'avais fait cette base dans les années 2000, sous Access XP. Elle comporte de nombreuses tables, requêtes et aussi des macros et modules. Autodidacte, je m'étais fait aidé par ce forum déjà.
    En fait je ne connaissais pas cet onglet "Autres" dans propriété. Existait-il ? Lorsque j'ai conçu le formulaire de comparaison complété par un sous formulaire je l'avais fait à partir d'une requête. Puis pour simplifier, j'ai lié le formulaire et le sous formulaire directement aux tables.
    Grâce à toi, je suis allé voir l'onglet "Autres" et ..... le nom faisait toujours référence à la requête. Mon codage était donc faux.

    Access ne pouvait trouver un nom qui n'avais aucun lien.

    Le pb est donc résolu et j'ai suivi ton conseil de lbl, et txt.

    Merci beaucoup de ta patience et de tes explications.
    J'aurais en revanche encore besoin certainement du forum. j'espère t'avoir alors en suivi.

    PS : Comment préciser dans le code VBA : Si le champ est vide ou différent Then?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comparé 2 tables, consulter les écarts.
    Par kocipia dans le forum Access
    Réponses: 1
    Dernier message: 28/04/2015, 19h06
  2. Réponses: 5
    Dernier message: 04/04/2010, 00h14
  3. Réponses: 10
    Dernier message: 13/08/2009, 13h51
  4. [SQL] Modifier une table HTML et mettre à jour la base
    Par bart64 dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 11/11/2007, 18h06
  5. Comparer fichiers A et B, mettre à jour B
    Par kafifi dans le forum Langage
    Réponses: 6
    Dernier message: 24/06/2006, 14h11

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