Merge mais en horizontal

erics83

XLDnaute Impliqué
Bonjour,

J'ai trouvé le code de JB (merci pour tous tes apports), pour fusionner des lignes
Code:
Sub merge()
  Application.DisplayAlerts = False
  i = 2
  Do While Cells(i, 1) <> ""
  m = i
  Do While Cells(i, 1) = Cells(m, 1)
    i = i + 1
  Loop
  Cells(m, 1).Resize(i - m).VerticalAlignment = xlTop
  Cells(m, 1).Resize(i - m).MergeCells = True
Loop
End Sub
qui donne le résultat :
on passe de
merge1.GIF

à
Merge2.GIF

C'est super, je l'ai déjà beaucoup utilisé, par contre, je n'arrive pas à le ré-utiliser pour des colonnes (je mets mon fichier en PJ, plus simple pour l'explication....)

J'ai fait de nombreux essais en inversant par exemple cells(i,3) par cells(3,i) (qui me semblait logique par rapport à mon fichier, mais tant que ça, puisque ça ne fonctionne pas....lol)

Merci pour votre aide,
Eric
 

Pièces jointes

  • Classeur1.xlsx
    70.9 KB · Affichages: 46
Dernière édition:

cathodique

XLDnaute Barbatruc
Bonjour,

un essai
VB:
Option Explicit
Sub Merging()
    Dim i As Long
        With Feuil1
           'Fusion en ligne
            For i = .Cells(3, .Columns.Count).End(xlToLeft).Column To 2 Step -1
                If UCase(.Cells(3, i)) = UCase(.Cells(3, i - 1)) Then
                    .Cells(3, i - 1) = ""
                    .Range(Cells(3, i), Cells(3, i - 1)).Merge
                    .Range(Cells(3, i), Cells(3, i - 1)).HorizontalAlignment = xlCenter
                End If
            Next i
        End With
End Sub
 

cathodique

XLDnaute Barbatruc
Moi pour une colonne, je fais comme ceci
VB:
For i = .Range("A" & .Rows.Count).End(xlUp).Row To 7 Step -1 'jusqu'à ligne 7
                If UCase(.Cells(i, 1)) = UCase(.Cells(i - 1, 1)) Then
                    .Cells(i - 1, 1) = ""
                    .Range(Cells(i, 1), Cells(i - 1, 1)).merge
                End If
            Next i
Je n'ai pas trop l'habitude avec les boucles Do... Loop, Do while... etc. Je préfere For ... Next. Bien qu'elles soient peut-être bien plus pratique, je ne les maitrise pas bien.
Bonne journée.
 

erics83

XLDnaute Impliqué
Merci Cath,

Idem pour moi, je préfère For à Do...(mais c'est une question d'habitude...)....apparemment Do est plus rapide, mais les rares fois où je les ai ré-utilisé, j'ai toujours eu un problème....d'où la "facilité" avec For.....je n'ai pas trouvé un tuto pour l'instant, suffisamment explicite sur l'utilisation du Do, While, etc.....

Merci,
Eric
 

cathodique

XLDnaute Barbatruc
je n'ai pas trouvé un tuto pour l'instant, suffisamment explicite sur l'utilisation du Do, While, etc.....
En effet, je partage ton avis. Il a beaucoup de tutos proposés sur la toile mais beaucoup ne sont assez explicite.

Personnellement, c'est ici que je trouve mes sources.

http://boisgontierjacques.free.fr/
https://www.excel-pratique.com/fr/vba.php
https://web.archive.org/web/20150317223348/http://www.excelabo.net/excel/macros_formulaires
ce dernier site a été piraté, il ne propose que ses anciennes pages non dynamiques.
sinon ce dernier site
https://excel.developpez.com/ sur lequel, je ne participe plus.

Depuis que je suis sur XLD, je suis satisfait j'ai trouvé ma famille.
 

erics83

XLDnaute Impliqué
Bonjour Cath,

Merci pour tous ces liens, et idem je trouve que XLD est vraiment parfait et dynamique, en plus avec des aides et conseils précieux (la preuve...:))

Le site de JB est ma bible ;)

Merci pour ton aide et apports,
Eric
 

erics83

XLDnaute Impliqué
Bonjour,

Je reviens sur ce post car j'ai un petit souci : j'ai repris le code de JB sur le merge vertical (mais j'ai le même souci sur l'horizontal, d'où la continuité du post) : lorsqu'il y a un espace, cela ne fonctionne plus (et pour cause puisqu'on met <>""...). Mais comment est-il possible de faire merge lorsqu'une ligne est vide.....(classeur test en PJ).

J'ai essayé en faisant
Code:
'........mon code......où i est une boucle sur la colonne A et détecte lorsqu'il y a un vide
k = k + 1
fusion(k) = i
'End If  'dans mon code


Next 'dans mon code fin du i

For i = 1 To k
i = fusion(i)

  Do While Cells(i, 1) <> ""
  m = i
  Do While Cells(i, 1) = Cells(m, 1)
    i = i + 1
  Loop
  Cells(m, 1).Resize(i - m).VerticalAlignment = xlTop
  Cells(m, 1).Resize(i - m).MergeCells = True
Loop

Next
mais cela ne fonctionne pas....

Une petite aide ?

En vous remerciant,
Eric
 

Pièces jointes

  • Classeur11.xlsx
    8 KB · Affichages: 43

cathodique

XLDnaute Barbatruc
avec cette macro ci-dessous.
"Espace" c'est un caractère avec la touche espace. Dans ton cas c'est une ligne vide.
Oublie Trim car c'est une fonction qui supprime les espaces dans une chaîne de caractères.
Comment veux-tu que ta macro fusionne alors que tu lui demandes de sortir de la procédure avec Do while cells(i,1)<>"" alors qu'elle rencontre une cellule vide.
VB:
Sub fusionnage()
    Dim  i as Long
    Application.DisplayAlerts = False
        For i = Cells(Rows.Count, 1).End(xlUp).Row To 2 Step -1
            If Cells(i, 1) = Cells(i - 1, 1) Then Range(Cells(i, 1), Cells(i - 1, 1)).MergeCells = True
            Cells(i, 1).HorizontalAlignment = xlCenter
            Cells(i, 1).VerticalAlignment = xlCenter
        Next i
    Application.DisplayAlerts = True
End Sub
 

erics83

XLDnaute Impliqué
Super merci Cath,

C'est ce que je disais : comme il y avait un "<>"" il était normal que "mon" code bloque....Par contre, le tien fonctionne à merveille....merci

Juste pour ma culture : pourquoi partir de la dernière ligne (ou dernière colonne dans ton précédent post) ? il doit bien y avoir une raison ,mais que je ne comprends pas...La seule explication qui me vient à l'esprit, c'est que si tu partais du début, le code fusionnerai avec toutes les cellules vides après la N°20...c'est ça ?

En te remerciant pour ton aide,
Eric
 

cathodique

XLDnaute Barbatruc
Juste pour ma culture : pourquoi partir de la dernière ligne (ou dernière colonne dans ton précédent post) ? il doit bien y avoir une raison ,mais que je ne comprends pas...La seule explication qui me vient à l'esprit, c'est que si tu partais du début, le code fusionnerai avec toutes les cellules vides après la N°20...c'est ça ?
On a 2 manières d'avoir la dernière ligne non vide
1-Cells(Rows.Count, 1).End(xlUp).Row: comme ceci on part de la fin de la colonne 1 est on remonte, sur ton fichier c'est la ligne 19.

2- Cells(Rows.Count, 1).End(xlDown).Row: on part du début de la colonne, étant donné que la première est non vide, le code te renvoie une aberration (il donne la dernière ligne de la feuille: 1048576 sous excel 2007/2010)

NB: pour avoir la première ligne à partir du haut de la colonne le précédent code est faux
il faut utiliser ceci: Range("a1").End(xlDown).Row

Alors on part du bas en remontant pour balayer toute la plage.
 
Dernière édition:

Statistiques des forums

Discussions
312 249
Messages
2 086 609
Membres
103 260
dernier inscrit
NHOURRA