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 :

Automatiser Requete Ajout VBA ACCESS (sql)


Sujet :

VBA Access

  1. #1
    Membre habitué
    Homme Profil pro
    Gestionnaire base des données
    Inscrit en
    Août 2021
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Gestionnaire base des données
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2021
    Messages : 9
    Par défaut Automatiser Requete Ajout VBA ACCESS (sql)
    Bonjour,

    Je suis nouveau dans le forum et surtout je viens de débuter avec VBA ACCESS (ne m'en tenez pas rigueur).
    En fait, ça fait 2 semaines que je cherche une solution ou du moins des pistes pour pouvoir automatiser une tache qui me parait très complexe. Et j'espère que quelqu'un pourra m'aider.

    Mon problème est le suivant : je souhaite automatiser une requête ajout en VBA ACCESS (je ne sais pas, si c'est faisable déjà...), de la manière suivante:

    J'ai deux tables. Une Table qui se nomme ("ENTREE") contenant des données brutes que je souhaite ajouter à la table "TRAVAIL", suivant certains critères. La table source "ENTREE", contient 59 Champs (de Champ1 à Champ59).


    Et cet ajout des données de la table source ("ENTREE") à la table destination ("TRAVAIL"), doit se faire en faisant correspondre (à partir du deuxième champ) les données du deuxième champ de la table source "ENTREE", aux données du premier champ de la table de destination "TRAVAIL" ainsi de suite, peu importe le nom du Champ. J'insiste sur le fait qu'il faut correspondre à partir du deuxième champ, car les noms des champs ne sont pas les memes pour chaque mois. Raison pour laquelle, c'est tres long à faire à la main...
    ensuite, dans la boucle, je souhaite que la macro vba n'ajoute pas (ou ne tient pas compte) les champs où les enregistrements sont vides, mais en suivant toujours l'ordre des champs (champ2 ajouter à champ1, champ2 à champ3 etc..), et je mets un critère au champ1 = 2


    J'ai essayé d'écrire un code mais rien ne marche. Voici donc mon code VBA ACCESS:

    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
    'Déclaration des variables
     
    Dim lignesEntree, lignesTravail As Recordset, BaseMapping As DAO.Database, _
    i As Integer, RequeteSQL As QueryDef, requete As String, valeur As Byte, _
    MaTable As DAO.TableDef, MesChamps As DAO.Field
     
    Set BaseMapping = Application.CurrentDb 'Ma base
    Set TblSource = BaseMapping.TableDefs("ENTREE") 'Table source
    Set TblDestination = BaseMapping.TableDefs("TRAVAIL") 'Table destination
     
    'Les entêtes du champ
     Set MesChamps = TblSource.Fields ("Champ1", "Champ2", "Champ3", "Champ4", "Champ5", "Champ6", "Champ7", "Champ8", "Champ9", _
                                     Champ10", "Champ11", "Champ12", "Champ13", "Champ14", "Champ15", "Champ16", "Champ17", _
                                     Champ18", "Champ19", "Champ20", "Champ21", "Champ22", "Champ23", "Champ24", "Champ25", _
                                     Champ26", "Champ27", "Champ28", "Champ29", "Champ30", "Champ31", "Champ32", "Champ33", _
                                     Champ34", "Champ35", "Champ36", "Champ37", "Champ38", "Champ39", "Champ40", "Champ41", _
                                     Champ42", "Champ43", "Champ44", "Champ45", "Champ46", "Champ47", "Champ48", "Champ49", _
                                     Champ50", "Champ51", "Champ52", "Champ53", "Champ54", "Champ55", "Champ56", "Champ57", _
                                     Champ58", "Champ59")
     
     
    'TblDestination.Fields.Append MesChamps
     
     
     Set lignesEntree = BaseMapping.OpenRecordset("SELECT * FROM ENTREE WHERE Champ1=" & Chr(34) & "2" & Chr(34), dbOpenDynaset)
     Set lignesTravail = BaseMapping.OpenRecordset("TRAVAIL")
     
    With MesChamps
     
    'Stocker les champs vides
     
    For Each MesChamps In MaTable.Fields
     
    If MesChamps.Name <> "Champ1" Then
       MesChamps <> "Champ55" Or _
       MesChamps <> "Champ56" Or _
       MesChamps <> "Champ57" Or _
       MesChamps <> "Champ58" Or _
       MesChamps <> "ID" Then
     
    If lignesEntree <> "" Then
     
    requete = "INSERT INTO TblDestination * MesChamps.OrdinalPosition =0"
     
    End If
    End If
     
    Next MesChamps
     
    End With

    Dans l'espoir qu'une âme charitable, pourra m'aider à résoudre ce problème

  2. #2
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 410
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 410
    Par défaut
    Bonjour.

    Comment rapproches-tu les données de ta table Entree de la table Travail ?
    C'est positionnel ? Ç-à-d que la ligne 1 de Entree correspond à la ligne 1 de travail ? Idéalement il faudrait avoir un identifiant unique pour ne pas dépendre de l'ordre dans les données.

    Ensuite je n'ai pas compris où et quoi tu veux ajouter.
    Peux-tu mettre un exemple (réduit ?) de tes entrées et de la sortie attendue ?
    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  3. #3
    Membre habitué
    Homme Profil pro
    Gestionnaire base des données
    Inscrit en
    Août 2021
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Gestionnaire base des données
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2021
    Messages : 9
    Par défaut
    Bonjour Marot_r et surtout merci pour ta réponse.

    En gros:

    En théorie, je veux créer une requête ajout (avec VBA ACCESS) pour transférer les lignes de la table ENTREE à la table TRAVAIL uniquement pour celles qui sont remplies. Sachant que les lignes de ENTREE ont chacune un ID unique.

    En pratique, si par exemple dans ENTREE, j'ai (champ1, champ2, champ3) et Dans TRAVAIL pour le mois d'Aout , j'ai par exemple : (Reference, Nom, client, Code insee) et pour Septembre dans TRAVAIL, j'ai (code client, article, montant).

    Ensuite, les lignes du champ2 de ENTREE doivent toujours être ajouter au deuxième champ de la Table TRAVAIL(peu importe le Mois). Dans notre cas, pour le mois d'Aout, il faudra ajouter les lignes de Champ2 de ENTREE au champ "Reference" de TRAVAIL, et celles du champ3 au champ "nom". Et pour Septembre, ajouter les lignes du champ2 au champ "code client" et les lignes du champ3 au champ article et ainsi de suite.

    Désolé, si j'ai été encore un peu long. j'essaye de faire de mon mieux pour être compréhensif.

    A plus tard

  4. #4
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 410
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 410
    Par défaut
    Bonjour.

    Donc si je suis bien ta table TRAVAIL n'a pas toujours la même structure ni les mêmes noms de champs. C'est bien cela ?

    Et tu effaces les données présentes dans TRAVAIL avant de charger tes nouvelles entrées donc on n'a que des ajouts et pas de mise à jour d'enregistrements existants.

    Note que Access fonctionne TRÈS mal avec des structures variables, dans une BD les tables sont supposés avoir des noms de champs fixes et conserver leurs liste de champs en tout temps.
    Il arrive parfois qu'on doive les modifier mais il s'agit d'actes ponctuels pas systématiquement.

    Pour des structure variables, il va falloir sans doute tout faire en VBA ou une bonne partie.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  5. #5
    Membre habitué
    Homme Profil pro
    Gestionnaire base des données
    Inscrit en
    Août 2021
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Gestionnaire base des données
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2021
    Messages : 9
    Par défaut
    Bonjour Marot_r,

    Oui effectivement les noms des champs et la structure de la table TRAVAIL varie selon le mois, c'est donc là que reside ma difficulté. Et c'est très très long à faire à la main…

    Et la table de destination "TRAVAIL" est vide, elle sert juste à recevoir les données provenant de ENTREE. Donc une requête Ajout et non de MAJ.

    Oui, je me doutais que ça devrait être un peu complexe à réaliser. Et surtout qu'avec SQL ACCESS, le langage est limité concernant tout ce qui est boucle, vue etc.

    Mais par contre pour ce qui est de VBA (si c'est faisable !), j'avais commencé à coder un peu (selon ma logique). Mais ça ne marche pas.

    Voici mon code :

    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
    'Déclaration des variables
     
    Dim lignesEntree, lignesTravail As Recordset, BaseMapping As DAO.Database, _
    i As Integer, RequeteSQL As QueryDef, requete As String, valeur As Byte, _
    MaTable As DAO.TableDef, MesChamps As DAO.Field
     
    Set BaseMapping = Application.CurrentDb 'Ma base
    Set TblSource = BaseMapping.TableDefs("ENTREE") 'Table source "ENTREE"
    Set TblDestination = BaseMapping.TableDefs("TRAVAIL") 'Table destination "TRAVAIL"
     
    'Les entêtes du champ 'Déclaration des noms des entêtes dans TRAVAIL
     
     Set MesChamps = TblSource.Fields ("Champ1", "Champ2", "Champ3", "Champ4", "Champ5", "Champ6", "Champ7", "Champ8", "Champ9", _
                                     Champ10", "Champ11", "Champ12", "Champ13", "Champ14", "Champ15", "Champ16", "Champ17", _
                                     Champ18", "Champ19", "Champ20", "Champ21", "Champ22", "Champ23", "Champ24", "Champ25", _
                                     Champ26", "Champ27", "Champ28", "Champ29", "Champ30", "Champ31", "Champ32", "Champ33", _
                                     Champ34", "Champ35", "Champ36", "Champ37", "Champ38", "Champ39", "Champ40", "Champ41", _
                                     Champ42", "Champ43", "Champ44", "Champ45", "Champ46", "Champ47", "Champ48", "Champ49", _
                                     Champ50", "Champ51", "Champ52", "Champ53", "Champ54", "Champ55", "Champ56", "Champ57", _
                                     Champ58", "Champ59")
     
     
     
     Set lignesEntree = BaseMapping.OpenRecordset("SELECT * FROM ENTREE WHERE Champ1=" & Chr(34) & "2" & Chr(34), dbOpenDynaset) 'Critères ajouter par rapport aux lignes du champ
     Set lignesTravail = BaseMapping.OpenRecordset("TRAVAIL") '
     
    'TblDestination.Fields.Append MesChamps 'ajout des lignes de "ENTREE" à la table "TRAVAIL"
     
     
    With MesChamps
     
    'Stocker les champs vides
     
    For Each MesChamps In MaTable.Fields
     
    If MesChamps.Name <> "Champ1" Then 'Exclusion des champs et des lignes non prises en compte
       MesChamps <> "Champ55" Or _
       MesChamps <> "Champ56" Or _
       MesChamps <> "Champ57" Or _
       MesChamps <> "Champ58" Or _
       MesChamps <> "ID" Then
     
    If lignesEntree <> "" Then
     
    requete = "INSERT INTO TblDestination * MesChamps.OrdinalPosition =0"
    Donc, j'ai d'abord déclaré ma base Access et les lignes des tables avec recordset et puis j'ai essayé de créer une boucle sur les champs et lignes que je veux ajouter dans TRAVAIL, mais sauf que rien ne marche.

    Auras-tu des idées ou des pistes à me donner ou c'est vraiment quelque chose qui n'est pas automatisable ?

    J'attends avec impatience ton retour.

    A plus tard

  6. #6
    Expert éminent
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 962
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 962
    Par défaut
    bonjour,
    aurais-tu un exemple de 2 tables ENTREE (avec des données fictives) et le résultat que tu aimerais obtenir au final dans la table TRAVAIL, avec un exemple expliqué dans une feuille Excel via un schéma du genre: champ d'ENTREE vers champ de TRAVAIL (même si il n'y a pas les 59 champs) ?

  7. #7
    Membre habitué
    Homme Profil pro
    Gestionnaire base des données
    Inscrit en
    Août 2021
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Gestionnaire base des données
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2021
    Messages : 9
    Par défaut
    Bonjour tee_grandbois

    Merci pour ta réponse.

    Par rapport à la base que tu as demandée, j'ai mis en pièce la base ACCESS contenant 3 tables : 2 Tables "ENTREE" dont une (qui sert juste d'exemple) avec les entêtes avant requête, et une autre avec les enregistrements apres lancement de la requête, et une Table TRAVAIL-SORTIE qui contient tous les résultats de la sortie attendue.

    Et donc en résumé, j'ai créée une requête pour transférer les lignes de la table "ENTREE" à la table TRAVAIL, en prenant en compte que les champs remplis de ENTREE. Sachant que l'ajout des enregistrements doivent commencer à partir du champ2 de ENTREE.MaBase.rar

    Peut être qu'avec une base contenant les tables et les requêtes, ça serait plus pratique ?


    Merci

    A plus trad

  8. #8
    Expert éminent
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 962
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 962
    Par défaut
    bonsoir,
    Peut être qu'avec une base contenant les tables et les requêtes, ça serait plus pratique ?
    Par contre, peux-tu la poster au format ZIP ?

  9. #9
    Expert confirmé Avatar de hyperion13
    Homme Profil pro
    Webplanneur
    Inscrit en
    Octobre 2007
    Messages
    4 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : Réunion

    Informations professionnelles :
    Activité : Webplanneur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 290
    Par défaut
    Salut
    zip en pj
    Citation Envoyé par tee_grandbois Voir le message
    bonsoir,
    Par contre, peux-tu la poster au format ZIP ?
    Fichiers attachés Fichiers attachés

  10. #10
    Membre habitué
    Homme Profil pro
    Gestionnaire base des données
    Inscrit en
    Août 2021
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Gestionnaire base des données
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2021
    Messages : 9
    Par défaut
    Citation Envoyé par tee_grandbois Voir le message
    bonsoir,
    Par contre, peux-tu la poster au format ZIP ?
    MaBase.7z

    j'ai zippé le fichier

  11. #11
    Membre habitué
    Homme Profil pro
    Gestionnaire base des données
    Inscrit en
    Août 2021
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Gestionnaire base des données
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2021
    Messages : 9
    Par défaut
    Citation Envoyé par hyperion13 Voir le message
    Salut
    zip en pj
    Merci pour le Zip hyperion13

  12. #12
    Expert éminent
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 962
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 962
    Par défaut
    oui merci hyperion13, visiblement le format ZIP n'est pas natif partout

  13. #13
    Expert éminent
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 962
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 962
    Par défaut
    j'avais compris le principe d'ajout dans la table TRAVAIL donc, la requête ne me donne pas plus d'explication sur la manière dont il faut la remplir (d'ailleurs, je ne vois qu'une seule table ENTREE dans la base alors que j'en avais demandé 2).
    est-ce que la structure de la table TRAVAIL est complète (elle ne contient que 35 champs) ?
    si il n'y a que 58 champs autant les créer dès le départ

  14. #14
    Expert confirmé Avatar de hyperion13
    Homme Profil pro
    Webplanneur
    Inscrit en
    Octobre 2007
    Messages
    4 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : Réunion

    Informations professionnelles :
    Activité : Webplanneur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 4 290
    Par défaut
    Salut
    Je pense avoir compris
    tbl ENTREE observer le Champ1 et les lignes qui commencent par ASM. Ces lignes contiennent des noms de champ qui correspondent aux champs de la tbl TRAVAIL-SORTIE. Puis toutes les lignes qui suivent sont les valeurs à insérer dans la tbl TRAVAIL-SORTIE.
    Citation Envoyé par tee_grandbois Voir le message
    j'avais compris le principe d'ajout dans la table TRAVAIL donc, la requête ne me donne pas plus d'explication sur la manière dont il faut la remplir (d'ailleurs, je ne vois qu'une seule table ENTREE dans la base alors que j'en avais demandé 2).
    est-ce que la structure de la table TRAVAIL est complète (elle ne contient que 35 champs) ?
    si il n'y a que 58 champs autant les créer dès le départ

  15. #15
    Expert éminent
    Avatar de tee_grandbois
    Homme Profil pro
    retraité
    Inscrit en
    Novembre 2004
    Messages
    8 962
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : retraité

    Informations forums :
    Inscription : Novembre 2004
    Messages : 8 962
    Par défaut
    Je pense avoir compris
    tbl ENTREE observer le Champ1 et les lignes qui commencent par ASM. Ces lignes contiennent des noms de champ qui correspondent aux champs de la tbl TRAVAIL-SORTIE.
    bien vu hyperion13 ! cela aurait facilité l'automatisation si cela avait été fiable:
    Nom : _0.JPG
Affichages : 290
Taille : 288,8 Ko
    Nom : _1.JPG
Affichages : 294
Taille : 109,2 Ko

Discussions similaires

  1. [AC-2007] Probleme requete Date Vba Access
    Par mezmerize dans le forum Access
    Réponses: 6
    Dernier message: 20/05/2014, 16h36
  2. [AC-2003] Créer une requete sous vba Access
    Par facteur dans le forum VBA Access
    Réponses: 23
    Dernier message: 22/01/2013, 13h50
  3. [AC-2010] VBA Access SQL WHERE
    Par JMMVBA dans le forum VBA Access
    Réponses: 2
    Dernier message: 04/05/2010, 12h47
  4. Réponses: 7
    Dernier message: 26/04/2008, 10h48

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