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 :

Comment fusionner cellules qui portent le même nom [XL-2016]


Sujet :

Macros et VBA Excel

  1. #1
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2018
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 29
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2018
    Messages : 56
    Par défaut Comment fusionner cellules qui portent le même nom
    Bonjour
    J'ai une colonne de 35 920 lignes
    Je voudrais fusionner les lignes qui ont la même date et donc afficher qu'une fois la date (voir le rendu attendu en photo) avec un code VBA
    Nom : Capture.PNG
Affichages : 2195
Taille : 24,8 Ko

    Sur mon fichier d'origine, j'ai aussi d'autres colonnes avec des noms fournisseurs et n° de commande où je souhaite faire la même chose
    je devrais traiter ces 3 colonnes : B, C et D à partir de la ligne 2

    Je cherche donc à automatiser cela car j'ai beaucoup de lignes

    Si quelqu'un à la solution, merci d'avance
    Bonne journée

  2. #2
    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
    tu veux fusionner les meme ligne en colonne C
    tu filtre tes dates en "A" et tu mergecells le offset(0,2) des speciallcells(xlvisible)
    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

  3. #3
    Membre Expert Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Par défaut
    Bonjour le fil, bonjour le forum,

    Une proposition avec le code ci-dessous :

    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
    Sub Macro1()
    Dim O As Worksheet 'déclare la variable O (Onglet)
    Dim DL As Long 'déclare la variable DL (Derniere Ligne)
    Dim LD As Long 'déclare la variable LD (Ligne du Début)
    Dim LF As Long 'déclare la variable LF (Ligne de Fin)
    Dim I As Long 'déclare la variable I (Incrément)
    Dim D As String 'déclare la variable D (Date)
     
    Set O = Worksheets("Feuil1") 'définit l'onglet O (à adapter à ton cas)
    DL = O.Cells(Application.Rows.Count, "A").End(xlUp).Row 'définit la dernière ligne éditée DL de la colonne A de l'onglet O
    O.Columns("B:D").Cells.UnMerge 'défusionne toutes les cellules des colonne B à D
    For I = 2 To DL 'boucle 1 : sur toutes les lignes I  de 2 à DL
        If Cells(I - 1, "A").Value <> Cells(I, "A").Value Then 'condition 1 : si la valeur de la cellule au-dessus est différente de la valeur de la cellule de la boucle
            If LF > 0 Then 'condition 2 : si la ligne de fin LF est supérieure à zéro
                For J = 2 To 4 'boucle 2 sur les colonnes 2 à 4 (=> colonne B à D)
                    O.Range(O.Cells(LD, J), O.Cells(LF, J)).Merge 'fusionne les cellules des ligne LD à LF dans la colonne de la boucle
                Next J 'prochaine colonne de la boucle 2
                LF = 0 'réinitialise la ligne de fin LF
            End If 'fin de la condition 2
            LD = I 'définit la ligne de début LD
            D = CStr(Cells(I, "A").Value) 'définit la date D
        Else 'sinon (condition 1)
            LF = I 'définit la ligne de fin LF
        End If 'fin de la condition 1
    Next I 'prochaine ligne de la boucle 1
    End Sub

  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 tautheme
    allons allons!!!

    faisons simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub merge()
        Set f = ActiveSheet
        For i = 1 To 18
            If oldvalue <> f.Cells(i, 1).Value Then f.Cells(i, "C") = f.Cells(i, "A").Text
            oldvalue = f.Cells(i, "A").Text
            With f.Range("$A$1:$A$18")
                .AutoFilter Field:=1, Criteria1:=Cells(i, 1).Value
                .SpecialCells(xlVisible).Offset(0, 2).MergeCells = True
                .AutoFilter
            End With
        Next
    End Sub
    Nom : demo.gif
Affichages : 1959
Taille : 110,2 Ko

    pettite amélioration le format de date et le merge uniquement si ca n'est pas deja fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub merge()
        Set f = ActiveSheet
        For i = 1 To 18
            If oldvalue <> f.Cells(i, 1).Text Then f.Cells(i, "C") = CStr(f.Cells(i, "A").Text): f.Cells(i, "C").NumberFormat = "mm/dd/yyyy"
            oldvalue = CStr(f.Cells(i, "A").Text)
            If f.Cells(i, 3).MergeArea.Cells.Count = 1 Then
                With f.Range("$A$1:$A$18")
                    .AutoFilter Field:=1, Criteria1:=Cells(i, 1).Value
                    .SpecialCells(xlVisible).Offset(0, 2).MergeCells = True
                    .AutoFilter
                End With
            End If
        Next
    End Sub
    Nom : demo.gif
Affichages : 1949
Taille : 138,0 Ko

    pour l'anegdote
    ne pas confondre numberformat="mm/dd/yyyy" et format(une date,"mm/dd/yyyy")
    ca n'est pas la meme chose le premier etant un peu magic et n'exprimant son action comme le fait format et redresse le soucis bien conus des dates dans une cellule
    d'ailleur dans la 2d capture on voit bien son action qui n'est pas la meme que la fonction format avec les 2d et 3eme date
    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 Expert Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Par défaut
    Bonjour le fil, bonjour le forum,

    @Patrick
    Allons, allons !!

    Faire simple c'est bien mais quand ça fonctionne c'est mieux...

  6. #6
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2018
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 29
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2018
    Messages : 56
    Par défaut
    Je suis débutante depuis maintenant plusieurs mois en VBA
    Mais je n'ai jamais entendu parler de ça : "tu mergecells le offset(0,2) des speciallcells(xlvisible)"
    Je n'ai aucune idées de ce que c'est

    Je met un échantillon de mon fichier ci-joint

    J'ai testé les 2 réponses reçues, aucune ne donnent le bon "résultat"
    Fichiers attachés Fichiers attachés

  7. #7
    Membre Expert Avatar de Thautheme
    Homme Profil pro
    salarié
    Inscrit en
    Août 2014
    Messages
    1 373
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : salarié

    Informations forums :
    Inscription : Août 2014
    Messages : 1 373
    Par défaut
    Re,

    Mon code comportait une erreur, je le reconnais. Mais si tu donnes un exemple où tes données commencent en colonne A, il ne faut pas s'étonner que ça ne fonctionne pas sur un fichier où elles commencent en colonne B !...
    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
    Sub Macro1()
    Dim O As Worksheet 'déclare la variable O (Onglet)
    Dim PLV As Long 'déclare la variable PLV (Première Ligne Vide)
    Dim LD As Long 'déclare la variable LD (Ligne du Début)
    Dim LF As Long 'déclare la variable LF (Ligne de Fin)
    Dim I As Long 'déclare la variable I (Incrément)
    Dim D As String 'déclare la variable D (Date)
     
    Set O = Worksheets("Feuil1") 'définit l'onglet O (à adapter à ton cas)
    PLV = O.Cells(Application.Rows.Count, "B").End(xlUp).Row + 1 'définit la première ligne vide PLV de la colonne B de l'onglet O
    O.Columns("B:D").Cells.UnMerge 'défusionne toutes les cellules des colonnes B à D
    For I = 2 To PLV 'boucle 1 : sur toutes les lignes I de 2 à PLV
        If Cells(I - 1, "B").Value <> Cells(I, "B").Value Then 'condition 1 : si la valeur de la cellule au-dessus est différente de la valeur de la cellule de la boucle
            If LF > 0 Then 'condition 2 : si la ligne de fin LF est supérieure à zéro
                Application.DisplayAlerts = False
                For J = 2 To 4 'boucle 2 sur les colonnes 2 à 4 (=> colonne B à D)
                    O.Range(O.Cells(LD, J), O.Cells(LF, J)).Merge 'fusionne les cellules des ligne LD à LF dans la colonne de la boucle
                Next J 'prochaine colonne de la boucle 2
                LF = 0 'réinitialise la ligne de fin LF
            End If 'fin de la condition 2
            LD = I 'définit la ligne de début LD
            D = CStr(Cells(I, "B").Value) 'définit la date D
        Else 'sinon (condition 1)
            LF = I 'définit la ligne de fin LF
        End If 'fin de la condition 1
    Next I 'prochaine ligne de la boucle 1
    End Sub

  8. #8
    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 tautheme
    Faire simple c'est bien mais quand ça fonctionne c'est mieux...
    et alors ca fonctionne pas dans la capture????

    tu imagine ta boucle elle a plus de 30 000 lignes
    tu peux chercher tant que tu veux les filtres seront toujours plus rapides
    n'oublie pas que tu fusionne tu réenclenche tout les events calculate et compagnie
    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

  9. #9
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Juillet 2018
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 29
    Localisation : France, Aisne (Picardie)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2018
    Messages : 56
    Par défaut
    Yes c'est bon ça marche pour mes 3 colonnes
    Merci beaucoup de ton aide Thautheme
    Bonne journée

    Et merci à toi aussi Patrick

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

Discussions similaires

  1. [XSLT] Comment différencier des balises qui portent le même nom
    Par Tomtom31 dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 22/07/2015, 11h18
  2. [Google Maps] Des villes qui portent le même nom dans diffèrents pays
    Par bhrochdi dans le forum APIs Google
    Réponses: 2
    Dernier message: 15/10/2014, 12h18
  3. XML plusieurs balise qui portent le même nom.
    Par jeyGey dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 18/01/2013, 21h43
  4. [MySQL] Stocker plusieurs variables qui portent le même nom
    Par Cyclone200 dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 10/12/2012, 01h16
  5. Réponses: 3
    Dernier message: 04/03/2007, 20h00

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