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 :

Regrouper des lignes en 1 seule et suppression des autres [XL-2016]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Juin 2023
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Juin 2023
    Messages : 2
    Par défaut Regrouper des lignes en 1 seule et suppression des autres
    Bonjour,

    J'espère que mon sujet vous inspirera.
    Je récupère un fichier XML que je convertis directement via Excel, cela ne pose pas de problème

    J'ai intégré une macro qui permet de supprimer les lignes dont certaines colonnes sont vides.

    Par contre, je n'arrive pas à concaténer les lignes dont la colonne C est identique et supprimer les autres lignes.

    Actuellement :
    ddeb dfin num NomUs PrenUs NomEx PrenEx Code1 Code2 Code3
    18/03/2022 31/12/2025 1223 nom1 prenom1 nom1
    18/03/2022 31/12/2025 1223 nom1 prenom1 prenom1
    18/03/2022 31/12/2025 1223 nom1 prenom1 22
    18/03/2022 31/12/2025 1223 nom1 prenom1 101006

    Attendu :
    ddeb dfin num NomUs PrenUs NomEx PrenEx Code1 Code2 Code3
    18/03/2022 31/12/2025 1223 nom1 prenom1 nom1 prenom1 22 101006


    J'ai mis un exemple au format Excel en PJ (le fichier peut contenir > 10000 lignes) : onglet 1 données de base ; onglet 2 données attendues.

    Est-ce possible en vba ?

    Je vous remercie pour votre aide.
    Fichiers attachés Fichiers attachés

  2. #2
    Membre Expert
    Inscrit en
    Décembre 2002
    Messages
    993
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 993
    Par défaut
    Voici une macro qui fait le job, c'est probablement pas la plus performante mais ça peut te dépanner en attendant mieux.

    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
    Sub RegrouperLignes()
     
        ' Déclaration des variables
        Dim i As Long
        Dim lastRow As Long
        Dim lo As ListObject
     
        ' Définition de l'objet ListObject pour accéder au tableau
        Set lo = Sheets("Feuil1").ListObjects("Tableau1")
     
        ' Récupération du numéro de la dernière ligne du tableau
        lastRow = lo.ListRows.Count
     
        ' Boucle pour parcourir les lignes en commençant par la dernière et en remontant
        For i = lastRow To 2 Step -1
            ' Vérification si la valeur de la colonne "num" (3ème colonne) est identique à celle de la ligne précédente
            If lo.DataBodyRange(i, 3) = lo.DataBodyRange(i - 1, 3) Then
                ' Vérification si la cellule de la colonne "NomEx" (6ème colonne) de la ligne précédente est vide
                If lo.DataBodyRange(i - 1, 6) = "" Then
                    ' Copie de la valeur de la ligne en double dans cette cellule
                    lo.DataBodyRange(i - 1, 6) = lo.DataBodyRange(i, 6)
                End If
                ' Vérification si la cellule de la colonne "PrenEx" (7ème colonne) de la ligne précédente est vide
                If lo.DataBodyRange(i - 1, 7) = "" Then
                    ' Copie de la valeur de la ligne en double dans cette cellule
                    lo.DataBodyRange(i - 1, 7) = lo.DataBodyRange(i, 7)
                End If
                ' Vérification si la cellule de la colonne "Code1" (8ème colonne) de la ligne précédente est vide
                If lo.DataBodyRange(i - 1, 8) = "" Then
                    ' Copie de la valeur de la ligne en double dans cette cellule
                    lo.DataBodyRange(i - 1, 8) = lo.DataBodyRange(i, 8)
                End If
                ' Vérification si la cellule de la colonne "Code2" (9ème colonne) de la ligne précédente est vide
                If lo.DataBodyRange(i - 1, 9) = "" Then
                    ' Copie de la valeur de la ligne en double dans cette cellule
                    lo.DataBodyRange(i - 1, 9) = lo.DataBodyRange(i, 9)
                End If
                ' Vérification si la cellule de la colonne "Code3" (10ème colonne) de la ligne précédente est vide
                If lo.DataBodyRange(i - 1, 10) = "" Then
                    ' Copie de la valeur de la ligne en double dans cette cellule
                    lo.DataBodyRange(i - 1, 10) = lo.DataBodyRange(i, 10)
                End If
     
                ' Suppression de la ligne en double
                lo.ListRows(i).Delete
            End If
        Next i
    End Sub

  3. #3
    Candidat au Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Juin 2023
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Somme (Picardie)

    Informations professionnelles :
    Activité : Chef de projet MOA

    Informations forums :
    Inscription : Juin 2023
    Messages : 2
    Par défaut
    Citation Envoyé par Franc Voir le message
    Voici une macro qui fait le job, c'est probablement pas la plus performante mais ça peut te dépanner en attendant mieux.

    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
    Sub RegrouperLignes()
     
        ' Déclaration des variables
        Dim i As Long
        Dim lastRow As Long
        Dim lo As ListObject
     
        ' Définition de l'objet ListObject pour accéder au tableau
        Set lo = Sheets("Feuil1").ListObjects("Tableau1")
     
        ' Récupération du numéro de la dernière ligne du tableau
        lastRow = lo.ListRows.Count
     
        ' Boucle pour parcourir les lignes en commençant par la dernière et en remontant
        For i = lastRow To 2 Step -1
            ' Vérification si la valeur de la colonne "num" (3ème colonne) est identique à celle de la ligne précédente
            If lo.DataBodyRange(i, 3) = lo.DataBodyRange(i - 1, 3) Then
                ' Vérification si la cellule de la colonne "NomEx" (6ème colonne) de la ligne précédente est vide
                If lo.DataBodyRange(i - 1, 6) = "" Then
                    ' Copie de la valeur de la ligne en double dans cette cellule
                    lo.DataBodyRange(i - 1, 6) = lo.DataBodyRange(i, 6)
                End If
                ' Vérification si la cellule de la colonne "PrenEx" (7ème colonne) de la ligne précédente est vide
                If lo.DataBodyRange(i - 1, 7) = "" Then
                    ' Copie de la valeur de la ligne en double dans cette cellule
                    lo.DataBodyRange(i - 1, 7) = lo.DataBodyRange(i, 7)
                End If
                ' Vérification si la cellule de la colonne "Code1" (8ème colonne) de la ligne précédente est vide
                If lo.DataBodyRange(i - 1, 8) = "" Then
                    ' Copie de la valeur de la ligne en double dans cette cellule
                    lo.DataBodyRange(i - 1, 8) = lo.DataBodyRange(i, 8)
                End If
                ' Vérification si la cellule de la colonne "Code2" (9ème colonne) de la ligne précédente est vide
                If lo.DataBodyRange(i - 1, 9) = "" Then
                    ' Copie de la valeur de la ligne en double dans cette cellule
                    lo.DataBodyRange(i - 1, 9) = lo.DataBodyRange(i, 9)
                End If
                ' Vérification si la cellule de la colonne "Code3" (10ème colonne) de la ligne précédente est vide
                If lo.DataBodyRange(i - 1, 10) = "" Then
                    ' Copie de la valeur de la ligne en double dans cette cellule
                    lo.DataBodyRange(i - 1, 10) = lo.DataBodyRange(i, 10)
                End If
     
                ' Suppression de la ligne en double
                lo.ListRows(i).Delete
            End If
        Next i
    End Sub

    Je vous remercie d'avoir pris le temps de répondre au problème et surtout de l'avoir aussi bien détaillé.
    Après un test sur le fichier en PJ, malheureusement celui-ci m'affiche une erreur

    Nom : 2023-06-20 13_39_58-AnalyseNum.xlsm - Excel.png
Affichages : 50
Taille : 6,5 Ko
    Nom : 2023-06-20 13_40_15-Microsoft Visual Basic pour Applications - AnalyseNum.xlsm [arrêt] - [Module.png
Affichages : 62
Taille : 15,4 Ko

    En // j'ai réussi à m'en sortir avec Power Query.

    Je vous renouvelle une fois de plus mes remerciements.

  4. #4
    Membre Expert
    Inscrit en
    Décembre 2002
    Messages
    993
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 993
    Par défaut
    J'avais modifié ta plage de cellules de la "Feuil1" pour utiliser un tableau structuré que j'ai appelé "Tableau1" qui ne figure pas dans ton fichier original, d'où l'erreur probablement.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 07/10/2014, 12h11
  2. [AC-2003] Regrouper plusieurs lignes en une seule
    Par DeFCrew dans le forum IHM
    Réponses: 2
    Dernier message: 20/12/2010, 16h19
  3. Regrouper plusieurs lignes en une seule
    Par Nicolerst dans le forum Développement
    Réponses: 2
    Dernier message: 18/08/2010, 10h50
  4. Regrouper plusieurs lignes sur une seule
    Par Mygush dans le forum Langage SQL
    Réponses: 2
    Dernier message: 15/09/2009, 11h05
  5. regrouper 2 lignes en 1 seule
    Par Peanut dans le forum SQL
    Réponses: 2
    Dernier message: 06/09/2007, 11h52

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