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

Requêtes et SQL. Discussion :

Transposer sous ACCESS sans libellés d'en tête


Sujet :

Requêtes et SQL.

  1. #1
    Candidat au Club
    Homme Profil pro
    Chargé d'études
    Inscrit en
    Décembre 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chargé d'études
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2018
    Messages : 4
    Points : 4
    Points
    4
    Par défaut Transposer sous ACCESS sans libellés d'en tête
    Bonjour,

    J'ai cherché dans différents forums sans trouver mon bonheur.

    Mon objectif est de transposer dans ACCESS en colonnes des conditions mais sans remonter leur libellés en en-tête mais une notion de "rang".
    Autrement dit, ma 1ère condition remonte en colonne 1 (quelque soit la condition), ma 2ème condition en colonne 2, etc...

    Cela revient à l'utilisation d'un PROC TRANSPOSE dans SAS.

    Exemple :

    Module Acte Condition
    A X AA
    A X AB
    A Y AC
    A Y AB
    B X AD
    B X AA
    B Z AA


    Résultat voulu :

    Module Acte Condition 1 (ou 1) Condition 2 (ou 2) ...
    A X AA AB
    A Y AC AB
    B X AD AA
    B Z AA Null

    Je vous remercie d'avance pour votre aide,

  2. #2
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    2 912
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : consultant développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 912
    Points : 4 811
    Points
    4 811
    Par défaut
    Bonjour,

    Une requete croisée dynamique comme celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    TRANSFORM First(T1.Condition) AS PremierDeCondition
    SELECT T1.Module, T1.Acte
    FROM T1
    GROUP BY T1.Module, T1.Acte
    PIVOT T1.Condition;
    Après tu retravailles la requete obtenue en VBA dans un recordset pour obtenir le tableau souhaité.

    sinon si tu veux garder l'ordre d'apparition des valeurs, tu peux le faire directement en VBA, à partir de la table.

    CDLT

  3. #3
    Candidat au Club
    Homme Profil pro
    Chargé d'études
    Inscrit en
    Décembre 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chargé d'études
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2018
    Messages : 4
    Points : 4
    Points
    4
    Par défaut
    Bonjour,

    Merci pour votre réponse.

    Cela ne correspond pas exactement au résultat attendu car il me ressort une colonne par condition alors que je veux 1ère condition, 2ème condition,etc...
    Mais l'idée du VBA me parait être un bon début et je vais creuser cette option là (ce n'est pas une partie que je maîtrise très bien à ce jour).

    Je vous remercie et vous tiendrais informé ;-)

  4. #4
    Expert confirmé

    Homme Profil pro
    consultant développeur
    Inscrit en
    Mai 2005
    Messages
    2 912
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : consultant développeur
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 912
    Points : 4 811
    Points
    4 811
    Par défaut
    Voici une possibilité :
    Je retiens dans un champ Valeurs d'une table T2 les valeurs de Condition dans l'ordre d'affichage.
    Elles sont séparée par un ; Cette chaine est exploitable par la fonction Split() :
    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
     
    Private Sub transpose_data()
        ' 2018-12-26   retenir les valeurs Condition dans l'ordre d'affichage dans un champ Valeurs
        Dim rs1 As DAO.Recordset
        Dim s1 As String, s2 As String
        Set rs1 = CurrentDb.OpenRecordset("T1", dbOpenSnapshot)
     
        ' créer une table T2 (Module as TEXT(50) , Acte as TEXT(50) , Valeurs text(255))
        '                    avec clé primaire composée : Module, Acte
     
        With rs1
            If .RecordCount = 0 Then Exit Sub
     
            .MoveLast
            .MoveFirst
            While Not .EOF
                ' la ligne Module, Acte existe t'elle dejà dans T2 ?
                s1 = "Module ='" & Nz(!Module) & "' AND Acte ='" & Nz(!Acte) & "'"
                If DCount("*", "T2", s1) = 0 Then
                    ' la ligne Module, Acte n'existe pas encore dans T2
                    ' si Condition n'est pas nulle, on insère une nouvelle ligne dans T2
                    If Len(Nz(!Condition)) > 0 Then
                        s2 = "INSERT INTO T2 ( Module, Acte, Valeurs) VALUES" _
                             & "('" & Nz(!Module) & "','" & Nz(!Acte) & "','" & Nz(!Condition) & "')"
                        Debug.Print s2
                        CurrentDb.Execute s2
                    End If
                Else
                    ' la ligne Module, Acte existe déjà dans T2
                    ' si Condition n'est pas nulle, on ajoute Condition à Valeurs présente dans T2
                    If Len(Nz(!Condition)) > 0 Then
                        s2 = "UPDATE T2" _
                             & " SET Valeurs = Valeurs & " & "';" & Nz(!Condition) & "'" _
                             & " WHERE " & s1
                        Debug.Print s2
                        CurrentDb.Execute s2
                    End If
                End If
     
                .MoveNext
            Wend
        End With
        MsgBox "traitement terminé. Voir le résultat dans la table T2"
     
    SET rs1 = nothing
    End Sub
    CDLT

  5. #5
    Candidat au Club
    Homme Profil pro
    Chargé d'études
    Inscrit en
    Décembre 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Chargé d'études
    Secteur : Santé

    Informations forums :
    Inscription : Décembre 2018
    Messages : 4
    Points : 4
    Points
    4
    Par défaut Merci
    Bonjour,

    Je me suis servi de votre code, très bien fait et surtout bien expliqué ;-). J'ai pu l'adapter pour qu'il corresponde exactement à mon besoin.
    J'ai un peu galéré mais j'ai réussi à utiliser le split pour obtenir le résultat exact (petite difficulté à passer : le nombre de conditions n'était pas toujours identique).

    Un grand MERCI à vous

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

Discussions similaires

  1. Utilisation ACCESS sous MAC sans Virtualisation
    Par Gado2600 dans le forum Mac OS X
    Réponses: 8
    Dernier message: 15/08/2014, 14h37
  2. Réponses: 0
    Dernier message: 21/04/2010, 10h27
  3. Imprimer un pdf sous access (vba) sans ouvrir acrobat reader
    Par benoit16 dans le forum VBA Access
    Réponses: 3
    Dernier message: 23/02/2010, 08h43
  4. Réponses: 5
    Dernier message: 09/03/2009, 20h23
  5. Controle Calendrier sous Office sans Access
    Par Pantagruel92 dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 21/12/2007, 23h43

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