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 :

Transposition d'une colonne en plusieurs lignes


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes

    Informations forums :
    Inscription : Décembre 2014
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    Pour vous mettre dans le contexte, je suis chargé d’analyser des fichiers log.
    Ceux-ci contiennent des milliers de lignes, et la lecture par défaut n’est pas optimale, ... du tout.
    Je cherche à automatiser une tâche pour traiter le tableau et le mettre en forme différemment.

    => Concernant le log excel, j'ai une colonne contenant des contextes lié à chaque évènement qui sont eux sur une ligne
    A chaque nouveau évènement, la colonne contexte contient donc une cellule vide lié à la ligne.

    A savoir que je souhaite transposer automatiquement la suite de cellule de la colonne contexte, en plusieurs colonne, et qu'à chaque cellule vide dans cette colonne contexte, la série de contexte suivante se mette sur la ligne de l'évènement suivant.

    Comme cela me semble compliqué de tout expliquer clairement par des mots, je vous propose si nécessaire de joindre par la suite un fichier excel contenant un exemple de quelques lignes de l'origine et l'exemple associé de mise en forme (j'ai vu qu'il n'était pas souhaité qu'un fichier joint soit directement inclus à l'ouverture du sujet)

    Je vous remercie d’avance

    L'exemple en question
    ça va peut-être vous paraitre tout con au final
    Mais je rame
    Fichiers attachés Fichiers attachés

  2. #2
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut
    Bonjour.

    Ce n'est pas franchement "tout con" !

    Je te propose une solution. Tu dois nommer la plage du tableau des données d'entrée "nmTabVertical", et la plage du tableau de résultat "nmTabHorizontal".
    Pour ce tableau de sortie, cela peut être simplement la ligne des titres ou tout le tableau s'il y a déjà des valeurs.

    Et voici le code à placer dans un module standard:
    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    Option Explicit
     
    Public Sub subTranspose()
    Dim oRngV As Excel.Range
    Dim bFinTab As Boolean
    Dim oRngH As Excel.Range
    Dim vV As Variant, iV As Integer, jV As Integer
    Dim vH As Variant, iH As Integer, jH As Integer
    Dim iNbEvents As Integer
    Dim oCol As VBA.Collection
     
    'instancier les plages des tableaux
    Set oRngV = ThisWorkbook.Names("nmTabVertical").RefersToRange
    Set oRngH = ThisWorkbook.Names("nmTabHorizontal").RefersToRange
     
    'effacer le contenu éventuel du tableau horizontal
    vH = oRngH.Value
    For iH = 2 To UBound(vH, 1)
        For jH = 1 To UBound(vH, 2)
            vH(iH, jH) = Empty
        Next jH
    Next iH
    oRngH.Value = vH
     
    'compter les évènements
    vV = oRngV.Value
    iNbEvents = 0
    For iV = 2 To UBound(vV, 1)
        If Len(vV(iV, 1)) > 0 Then iNbEvents = iNbEvents + 1
    Next iV
     
    'dimensionner le tableau résultat, nb de lignes seulement
    Set oRngH = oRngH.Resize(iNbEvents + 1)
        'mettre à jour le nom de plage
    ThisWorkbook.Names("nmTabHorizontal").RefersTo = "='" & oRngH.Worksheet.Name & "'!" & oRngH.Address
    vH = oRngH.Value
     
    'créer une collection des en-têtes pour les champs cités en col 3 du tableau vertical
    Set oCol = New VBA.Collection
        'extraire les noms de champs à partir de la colonne 4
        'dans cette collection, la clé est le nom du champ et la valeur de l'élément est l'indice de colonne dans le tableau H
    For jH = 4 To UBound(vH, 2)
        oCol.Add jH, vH(1, jH)
    Next jH
     
    'transposer
    iH = 1
    bFinTab = False
    For iV = 2 To UBound(vV, 1)
        If Len(vV(iV, 1)) > 0 Then
            iH = iH + 1
            vH(iH, 1) = vV(iV, 1) 'évènement
            vH(iH, 2) = vV(iV, 2) 'code erreur
            vH(iH, 3) = vV(iV, 3) 'contexte
            'pour placer un élément de la colonne 5, on utilise la collection
            Do
                If Len(vV(iV, 4)) > 1 Then
                    On Error Resume Next
                        vH(iH, oCol(vV(iV, 4))) = vV(iV, 5)
                    On Error GoTo 0
                End If
                If iV < UBound(vV, 1) Then: iV = iV + 1: Else: bFinTab = True ': End If
            Loop Until (Len(vV(iV, 1)) > 0) Or bFinTab
            If Not bFinTab Then iV = iV - 1
     
        End If
    Next iV
     
    'copier le résultat
    oRngH.Value = vH
     
    'libérer les variables
    Set oCol = Nothing
    Set oRngV = Nothing
    Set oRngH = Nothing
    vV = Empty
    vH = Empty
    End Sub
    Enjoy your project !

    PGZ
    pluritas non est ponenda sine necessitate - Le rasoir d'Okham
    Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon

  3. #3
    Candidat au Club
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes

    Informations forums :
    Inscription : Décembre 2014
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Salut,
    Ouch, en effet, c'est costaud, c'est pas tout con à faire ... du tout !!!
    J'ai ramé toute l'après midi pour arriver à un code long comme un bras et bien pourri et qui déconne systématiquement pour probablement beaucoup de raison ...

    je te remercie, je teste demain matin et viens donner des news dans la foulée

    Salut

    Tout simplement excellent. J'ai fait quelques test sur le fichier exemple, ça parait robuste !
    Je n'ai plus qu'à tester sur mon fichier log qui est un peu plus complexe d'un point de vue nombre de colonne, lignes (10 000)

    Mais il n'y a pas de raison

    Mille merci
    @ suivre

  4. #4
    pgz
    pgz est déconnecté
    Expert éminent Avatar de pgz
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Août 2005
    Messages
    3 692
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Office VBA
    Secteur : Conseil

    Informations forums :
    Inscription : Août 2005
    Messages : 3 692
    Points : 6 591
    Points
    6 591
    Par défaut
    Bonjour.

    Tiens nous au courant de la suite et tu n'oublieras pas de clore la discussion.

    Cordialement,

    PGZ
    pluritas non est ponenda sine necessitate - Le rasoir d'Okham
    Ne jamais attribuer à la malignité ce que la stupidité peut expliquer -Le rasoir d'Hanlon

  5. #5
    Candidat au Club
    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes

    Informations forums :
    Inscription : Décembre 2014
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Bonjour,

    C'est parfait,

    J'ai adapté le nombre de colonne, emplacement etc ...
    C'est perfect
    Un grand merci à PGZ

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

Discussions similaires

  1. Une Legend sur plusieurs lignes ou colonnes
    Par Copepode dans le forum MATLAB
    Réponses: 4
    Dernier message: 26/05/2021, 10h53
  2. [MySQL V5.0] Update d'une colonne pour plusieurs lignes
    Par ogrius dans le forum Requêtes
    Réponses: 2
    Dernier message: 02/06/2014, 17h15
  3. Réponses: 2
    Dernier message: 01/12/2011, 17h12
  4. Décomposer les valeurs d'une colonne en plusieurs lignes
    Par sinoun dans le forum Développement de jobs
    Réponses: 3
    Dernier message: 13/10/2011, 15h23
  5. Réponses: 4
    Dernier message: 29/08/2008, 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