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 :

Export Access vers Excel champs à plusieurs valeurs


Sujet :

VBA Access

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2018
    Messages : 5
    Points : 5
    Points
    5
    Par défaut Export Access vers Excel champs à plusieurs valeurs
    Bonjour à tous,

    Je dois réaliser un export de mes tables de Access à Excel. Je dois exporter des données de plusieurs tables liées entres elles. J'ai donc créé une requête dans Access pour ensuite l'exporter à l'aide de VBA. Mon problème ce trouve dans ma requête, je dois exporter les données de 4 tables : Evaluation, Controle, Organisation, Utilisateur. Les tables Controle et Organisation sont directement liées à la table Evaluation et la table Utilisateur est liéé à la table Controle. Une Evaluation possède un controle, une oranisation mais peut posséder plusieurs Utilisateurs ( Voilà mon problème )
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT Evaluations.Id, (SELECT Controles_Locals.Ref FROM Controles_Locals WHERE Controles_Locals.Id = Evaluations.LocalIndicator) AS Référence, (SELECT Controles_Locals.ShortTitleFR FROM Controles_Locals WHERE Controles_Locals.Id = Evaluations.LocalIndicator) AS libelle, (SELECT Organisation.NameFR FROM Organisation WHERE Organisation.Id = Evaluations.EntityId) AS Equipe,
    ' Me met une erreur car cela renvoie plusieurs utilisateurs pour un enregistrement
    (SELECT DISTINCT Utilisateurs.UserName FROM Utilisateurs WHERE (Utilisateurs.Questionnaires_liste.Value) In (SELECT Controles_Locals.ControlGrouping FROM Controles_Locals WHERE Controles_Locals.id = Evaluations.LocalIndicator )) AS Utilisateur
    FROM Evaluations;
    Il me renvoie donc l'erreur "cette sous requête peut renvoyer au plus un enregistrement".
    J'ai essayé de modifier ma requête plusieurs fois mais cela ne fonctionne toujours pas, j'espère avoir été clair dans mes explications.
    Merci par avance.

    Dimitri Brachet

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    Access ne peut pas "conactener" des enregsitrements en SQL.

    Soit tu fais une requete avec des jointures sur ta table des utilisateurs qui va te donner autant de lignes que tu as d'utilisateur en repetant les infos communes.
    Quelque chose comme :

    • Data1 | User1
    • Data1 | User2
    • Data1 | User3
    • Data2 | User4


    Soit tu dois ecrire une fonction VBA qui va concatener tes utilisateurs et obtenir quelque chose comme :

    • Data1 | User1, User2, User3
    • Data2 | User4


    Si tu as besoin d'aide pour la function, n'hesite pas a demander.

    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
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2018
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2018
    Messages : 5
    Points : 5
    Points
    5
    Par défaut
    Merci pour ta réponse,

    La solution 2 est plus appropriée, cependant je vois pas comment concaténer les utilisateurs sur une ligne.

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    Comme je l'ai dit il faut que faire du code VBA pour cela. Ici un exemple de fonction a mettre dans un module.

    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
    Public function ConcatenerEnr(prmSource as string, prmNomChamp as string, prmSeparateur as string) as string
       dim result as string
       dim db as dao.database:set db=currentdb
       dim r as dao.recordset: set r=db.openrecordset(prmSource, dbOpenSnaptshot)
     
       do while not r.eof
          if result <> "" then
             result=result & prmSeparateur
          end if
     
          result=result & r.fields(prmNomChamp)
     
          r.movenext
       loop
     
       r.close: set r=nothing
       db.close: set d=nothing
     
       ConcatenerEnr = result
    end function
    prm est une abbreviation pesronnelle pour "Parametre", cela me permet de savoir que cette variable vient de l'exterieur de ma function.

    Excemple d'utilisation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    private sub Test_ConcatenerEnr()
        debug.print ConcatenerEnr("Select [MaTable].* from [MaTable] where [MaTable].[MonChamp] = " & UneValeurValide, "MonAutreChamp", ", ")
    end sub
    Exemple d'utilisation dans une requete :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Reference : ConcatenerEnr("SELECT [Controles_Locals].[Ref] FROM [Controles_Locals] WHERE [Controles_Locals].[Id] = " & [Evaluations].[LocalIndicator]; "Ref"; ", ")
    Attention utiliser du code VBA pour acceder a des donneses dans une requete est TRES lent donc si tu as beaucoup de donnees cela peut devenir penible.

    Si tu as des problemes de performance, la solution la plus simple est de stocker le calcul dans la table Evaluations au fur et a mesure de la saisie. Le temps total reste le meme mais tu le "paye" un petit peu a chaque entrée ce qui parait moins long.
    Note que cette solution n'est recommandee que si tu as des problemes de performance ou a la rigueur si tu fais la mise a jour avec des Macros de donnees qui sont directement "dans" les tables.

    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.

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

Discussions similaires

  1. exportation access vers excel
    Par osia1 dans le forum VBA Access
    Réponses: 44
    Dernier message: 18/04/2008, 15h40
  2. Export ACCESS vers EXCEL
    Par BAYRAL dans le forum VBA Access
    Réponses: 2
    Dernier message: 21/11/2007, 15h13
  3. Réponses: 5
    Dernier message: 15/07/2007, 22h49
  4. Export Access vers Excel nb de champs variable
    Par SylvainJ dans le forum Access
    Réponses: 4
    Dernier message: 05/03/2007, 13h55
  5. export access vers excel en asp
    Par oniric dans le forum ASP
    Réponses: 9
    Dernier message: 24/03/2006, 14h21

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