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

Macros et VBA Excel Discussion :

Transposer un tableau de données en une liste de données [XL-2007]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 190
    Par défaut Transposer un tableau de données en une liste de données
    Bonjour,

    pourriez vous me donner des idées comment je pourrais faire ceci en VBA:
    --> transposer un tableau sous forme de colonnes en un tableau sous forme de liste.

    Voir mon exemple en pièce attaché (il s'agit d'un echantillon d'un plus grand jeu de données).
    La feuille INPUT est ma source de données
    La feuille OUTPUT est le résultat que j'aimerai avoir.

    Hypothèses
    1) Il peut y avoir plusieurs centaines d'IDs.
    2) Chaque ID's possèdent différent Elements.
    3) Pour chaque combinaisons de ID et de Element, nous avons un résultat par PERIODE (le nombre de périodes peut varier).

    Merci de m'aider.
    Fichiers attachés Fichiers attachés

  2. #2
    Membre chevronné
    Homme Profil pro
    retraité enseignement
    Inscrit en
    Mars 2013
    Messages
    213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Saône (Franche Comté)

    Informations professionnelles :
    Activité : retraité enseignement
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2013
    Messages : 213
    Par défaut une solution...
    Bonsoir,

    J'ai fait une transposition qui me semble répondre à votre problème; Pour être plus rapide je la fais par ligne id et element, si vous le voulez trié par periode il suffit de faire le tri correspondant.

    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
    46
    Sub transposition()
     
    Dim ligne As Integer, Period As Integer, Derperiod As Integer, Debid As Integer, Bas As Integer
     
    Application.ScreenUpdating = False
    Set ws = Sheets("INPUT")
    Set dest = Sheets("resultat")
     
    'dernière ligne
    Bas = Cells(64000, 2).End(xlUp).Row
     
    Debid = 2
    ligne = 2
    While Debid <= Bas
        'recherche première id
        While ws.Cells(Debid, 2) = "" And Debid <= Bas
            Debid = Debid + 1
        Wend
     
        'parcours des id's courantes
        While ws.Cells(Debid, 2) <> ""
            'traitement des id's
            Derperiod = ws.Cells(Debid, 10000).End(xlToLeft).Column
            Period = 5
            'parcours des périodes
            While Period <= Derperiod
                While ws.Cells(Debid, Period) = "" And Period <= Derperiod
                    Period = Period + 1 'colonne suivante
                Wend
                If ws.Cells(Debid, Period) <> "" Then
                    'traitement des périodes
                    dest.Cells(ligne, 1) = ws.Cells(Debid, 2)
                    dest.Cells(ligne, 2) = ws.Cells(Debid, 3)
                    dest.Cells(ligne, 3) = ws.Cells(1, Period)
                    dest.Cells(ligne, 4) = ws.Cells(Debid, Period)
     
                    Period = Period + 1
                End If
                ligne = ligne + 1 'ligne suivante
            Wend
     
            Debid = Debid + 1 'id suivante
        Wend
    Wend
    Application.ScreenUpdating = True
    End Sub
    le fichier :TRANSPOSE DATA.xlsm

    Merci de valider mon message s'il convient

    Salutations les meilleures

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 190
    Par défaut
    Bonjour geogeo70,

    Merci pour votre aide.
    J'ai également travaillé cette nuit et suis arrivé à quelque chose de semblable à votre code.
    Le votre à l'air plus rapide que le mien sur l'échantillon donné.

    Par contre, je suis amené à traiter quelques millions de données/lignes dans ma feuille INPUT.
    Dès lors, je m'inquiète de la performance du code proposé (avec des boucles for ou while).
    Je dois tester ce matin au bureau.

    Sinon, est ce que l'idée de faire des couper/coller (Cut & paste) ne serait pas moins gourmande en temps et ressource, plutot que de traiter ligne par ligne..
    Une idée que je viens d'avoir.. encore faut-il trouver une logique.

    Encore merci pour le travail fait jusqu'a présent, et pour la suite des solutions.

    EDIT: J'arrive très proche des 1 048 576 lignes maximales de mon fichier excel...
    EDIT: Ne serait-il pas possible de traiter l'information dans un fichier TEXTE (.txt)?
    EDIT: Car la finalité serait d'exporter ma table/feuille RESULTAT dans une table ACCESS.


    apnw7931

  4. #4
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    Bonjour
    prend ton fichier exemple et teste ca
    cette macro fait ce que tu demande dans un fichier texte sauvé au même endroit ou se trouve le classeur
    si tu veux un csv tu remplace l'espace dans la constante et change l'extension "txt" pour "csv" dans la ligne du output
    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
    Sub transposition_to_fich_texte()
      Dim texte As String, col As Variant, i, cl, lig
        Const E = " "
        With Sheets(1)
            'récupération des colonnes a exploiter
            For i = 1 To .Cells(1, Columns.Count).End(xlToLeft).Column
                If .Cells(1, i) <> "" Then col = col & .Cells(1, i).Column & " "
            Next
            col = Split(Trim(col), " ")
            For cl = 0 To UBound(col)
                For lig = 1 To .Cells(Rows.Count, Val(col(cl))).End(xlUp).Row
                    If .Cells(lig, Val(col(cl))) <> "" And IsNumeric(.Cells(lig, Val(col(cl)))) Then
                        texte = texte & E & .Cells(lig, 1) & E & .Cells(lig, 2) & E & .Cells(1, Val(col(cl))) & E & .Cells(lig, Val(col(cl))) & vbCrLf
                    End If
                Next
            Next
        End With
        Debug.Print texte
        fichier = ThisWorkbook.Path & "\" & "transposition .txt"
        x = FreeFile
        Open fichier For Output As #x
        Print #x, texte
        Close #x
    End Sub
    voila
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  5. #5
    Membre chevronné
    Homme Profil pro
    retraité enseignement
    Inscrit en
    Mars 2013
    Messages
    213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Saône (Franche Comté)

    Informations professionnelles :
    Activité : retraité enseignement
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2013
    Messages : 213
    Par défaut fichier texte...
    Bonjour,
    Patrick donne un bon moyen de transformer en txt. Merci à lui, une remarque il faudra traiter les espaces dans les données car cela va multiplier les champs dans la base...

    Bonne continuation

  6. #6
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    Citation Envoyé par geogeo70 Voir le message
    Bonjour,
    Patrick donne un bon moyen de transformer en txt. Merci à lui, une remarque il faudra traiter les espaces dans les données car cela va multiplier les champs dans la base...

    Bonne continuation
    re
    c'est pour cela que j'ai mis une constante remplacer l'espace par ce que l'on veut
    voila
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  7. #7
    Membre chevronné
    Homme Profil pro
    retraité enseignement
    Inscrit en
    Mars 2013
    Messages
    213
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Saône (Franche Comté)

    Informations professionnelles :
    Activité : retraité enseignement
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2013
    Messages : 213
    Par défaut suite...
    J'ai intégré dans mon code la proposition de patrick (en utilisant ; comme séparateur de champ) et ouvert le fichier dans access, ça semble bien fonctionner. Voir quelle solution est plus rapide...

    à vous!
    Nom : access.JPG
Affichages : 513
Taille : 88,1 Ko

    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    Sub transposition()
     
    Dim ligne As Integer, Period As Integer, Derperiod As Integer, Debid As Integer, Bas As Integer
    Dim texte As String, E As String
     
     
    Application.ScreenUpdating = False
    Set ws = Sheets("INPUT")
    Set dest = Sheets("resultat")
     
    'dernière ligne
    Bas = Cells(64000, 2).End(xlUp).Row
     
    Debid = 2
    ligne = 2
    texte = ""
    E = ";"
    While Debid <= Bas
        'recherche première id
        While ws.Cells(Debid, 2) = "" And Debid <= Bas
            Debid = Debid + 1
        Wend
     
        'parcours des id's courantes
        While ws.Cells(Debid, 2) <> ""
            'traitement des id's
            Derperiod = ws.Cells(Debid, 10000).End(xlToLeft).Column
            Period = 5
            'parcours des périodes
            While Period <= Derperiod
                While ws.Cells(Debid, Period) = "" And Period <= Derperiod
                    Period = Period + 1 'colonne suivante
                Wend
                If ws.Cells(Debid, Period) <> "" Then
                        texte = texte & ws.Cells(Debid, 2) & E & ws.Cells(Debid, 3) & E & ws.Cells(1, Period) & E & ws.Cells(Debid, Period) & vbCrLf
     
                'If ws.Cells(Debid, Period) <> "" Then
                    'traitement des périodes
                    'dest.Cells(ligne, 1) = ws.Cells(Debid, 2)
                    'dest.Cells(ligne, 2) = ws.Cells(Debid, 3)
                    'dest.Cells(ligne, 3) = ws.Cells(1, Period)
                    'dest.Cells(ligne, 4) = ws.Cells(Debid, Period)
     
                    Period = Period + 1
                End If
                ligne = ligne + 1 'ligne suivante
            Wend
     
            Debid = Debid + 1 'id suivante
        Wend
    Wend
    Debug.Print texte
    fichier = ThisWorkbook.Path & "\" & "transposition .txt"
    x = FreeFile
    Open fichier For Output As #x
    Print #x, texte
    Close #x
    Application.ScreenUpdating = True
     
    End Sub

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 28/05/2010, 19h12
  2. Tri sur une base de donnée avec une list box
    Par niamo dans le forum IHM
    Réponses: 5
    Dernier message: 26/05/2010, 12h07
  3. Réponses: 6
    Dernier message: 27/10/2008, 12h16
  4. Afficher le contenue d'une base de données dans une liste
    Par fdoncev dans le forum SharePoint
    Réponses: 3
    Dernier message: 16/07/2008, 18h00
  5. [Liste]Affichage données dans une liste
    Par Zartak dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 22/05/2007, 17h02

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