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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 960
    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 960
    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) ?

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