VBA : condition pour fusionnage

Résolu/Fermé
Flo - 24 févr. 2016 à 14:22
 Flo - 26 févr. 2016 à 12:38
Bonjour,

Je suis débutant dans la réalisation de macro et je n'arrive pas a créer un code me permettant de réaliser la formule suivante:

Sur la plage "A30:A90":
Si le contenu de la cellule "A30" est identique a celui de la cellule A31,
Alors fusionner ces cellules
Sinon, réitérer la condition pour les cellules "A31" et "A32" (et ainsi de suite jusqu'à la cellule "A90").

Toutes mes cellules dans cette plage de donnée contiennent du texte (parfois identique, d'où le but de cette macro).
Au final, mon objectif est d'avoir 2, 3 (ou plus) cellules fusionnées dans la colonne A (afin de rendre le tableau plus facile à la lecture).

A titre informatif, j'utilise

Merci d'avance pour votre aide.

Mots clés: Excel - Macro - VBA - Fusion - Merge - Condition - If - Then

5 réponses

michel_m Messages postés 16602 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 313
24 févr. 2016 à 15:17
Bonjour
Pour macitoch
donc ça tu peux trouver tout seul ^^
Très sympa !
Avec des "select" ?
Etudie les premières bases de VBA
je te cote -1

Bonjour Flo

après les 2 "profs" ci dessous une proposition qui comportait un petit piège qu'ils n'ont pas vu
Dans ce code , j'ai considéré qu'il n'y avait pas 2 cellules vides adjacentes.

Si tu as besoin d'explications fais signe
Option Explicit
'--------------------------------
Sub fusionnerV()
Dim Lig As Byte
Application.ScreenUpdating = False
Application.DisplayAlerts = False
For Lig = 30 To 90
If Cells(Lig, "A") = Cells(Lig + 1, "A") Then
With Range(Cells(Lig, "A"), Cells(Lig + 1, "A"))
.MergeCells = True
.VerticalAlignment = xlCenter
End With
Lig = Lig + 2
End If
Next
Application.DisplayAlerts = True

End Sub


4
Merci beaucoup pour ton aide michel !!!

Tu as bien compris ma demande et tu y réponds quasi parfaitement ^^

Premier détail que j'avais oublié de préciser: mon tableau contient initialement 60 lignes vierge. Suite au lancement d'une macro, celui-ci vient se remplir mais pas entièrement. J’obtiens donc des cellules vides en fin de tableau. Je supprime les lignes vides grâce à une macro mais je ne peux savoir avant combien de lignes mon tableau contiendra au final... Mais peut importe puisque ça ne semble pas poser de problème à priori (je réaliserai la fusion avant la suppression).

Concernant ton code à proprement dit:
Lorsque j'ai 2 cellules identiques (exemple: A31 et A32), ton code fonctionne parfaitement.
Par contre:
- lorsque j'ai 3 ou 4 cellules identiques (exemple: A31, A32 et A33 (et A34)), ça me fusionne uniquement les deux premières (A31 et A32)
- lorsque j'ai 5 cellules identiques ou plus, ça me donne: 2 cellules fusionnées, 1 non fusionnée, 2 fusionnées, ...

Lorsque je relance la macro plusieurs fois ensuite, je remarque que pour le cas de 5 cellules ou plus, ça me donne: 2 fusionnées, 3 fusionnées, 3 fusionnées, ...

J'ai l'impression que si nous avons 2 cellules déjà fusionnées et que nous souhaitons les fusionner avec une 3ème cellule alors ça ne marchera pas mais, à l'inverse, si nous avons une cellule non fusionnée suivie de 2 cellules fusionnée alors ça marchera (nous obtiendrons alors 3 cellules fusionnées).
J'ai fais le test avec 1 cellule non fusionnée suivie de 3 cellules fusionnées et en lançant la macro ça me fusionne bien mes 4 cellules.

Je pense que si la macro s'effectuait dans l'autre sens (de la cellule 90 à la cellule 30) ça solutionnerait ce problème mais je ne sais pas si c'est réalisable...

En attendant, encore merci pour ta réponse !!
0
michel_m Messages postés 16602 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 313
25 févr. 2016 à 12:24
Bonjour
pour les N cellules fusionnées, je te fais ca dès que j'ai un moment

par contre je ne comprend pourquoi
Lorsque je relance la macro plusieurs fois ensuite, je remarque que pour le cas de 5 cellules ou plus, ça me donne: 2 fusionnées, 3 fusionnées, 3 fusionnées, ...

En relançant la macro, il faudrait peut-^tre revoir tout le code et que je sache quels changements ont été apportés qui justifie la relance

dans l'attente
0
Je n'avais rien changé à ta macro mais en la relançant ca me refaisait des fusions: si j'avais une cellule simple Y suivie des 2 cellules Y déjà fusionnées entre elles alors ça me fusionnait ces 3 cellules lorsque je lançais la macro une seconde fois. Mais comme tu l'a compris mon objectif serait de fusion N cellules ensemble.

En essayant de comprendre et de me dépatouiller de mon coté, j'ai modifié ton code comme ceci:

Dim Lig As Byte
Application.ScreenUpdating = False
Application.DisplayAlerts = False
For Lig = 30 To 90
If Cells(Lig, "A") = Cells(Lig + 1, "A") Then
With Range(Cells(Lig, "A"), Cells(Lig + 1, "A"))
.MergeCells = True
.VerticalAlignment = xlCenter
End With
Lig = Lig + 2
End If
Next
For Lig = 30 To 90
If Cells(Lig, "A") = Cells(Lig + 2, "A") Then
With Range(Cells(Lig, "A"), Cells(Lig + 2, "A"))
.MergeCells = True
.VerticalAlignment = xlCenter
End With
Lig = Lig + 3
End If
Next
For Lig = 30 To 90
If Cells(Lig, "A") = Cells(Lig + 3, "A") Then
With Range(Cells(Lig, "A"), Cells(Lig + 3, "A"))
.MergeCells = True
.VerticalAlignment = xlCenter
End With
Lig = Lig + 4
End If
Next
Application.DisplayAlerts = True
End Sub


Et ça à l'air de plutôt bien fonctionner. Le problème (parce qu'évidement rien ne peut fonctionner parfaitement), c'est lorsque je rajoute:

    For Lig = 30 To 90
If Cells(Lig, "A") = Cells(Lig + 4, "A") Then
With Range(Cells(Lig, "A"), Cells(Lig + 4, "A"))
.MergeCells = True
.VerticalAlignment = xlCenter
End With
Lig = Lig + 5
End If
Next

Alors là ça me fait du grand nimporte (je me retrouve avec 21 cellules fusionnées, la quasi totalité de mon tableau) alors que ça ne devrait pas...

Moi qui pensait avoir trouver la solution, je ne sais plus trop quoi penser maintenant ^^
0
michel_m Messages postés 16602 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 313 > Flo
25 févr. 2016 à 17:14
Désolé, coupure de courant (orage)

Je regarde demain.... ;o)
0
michel_m Messages postés 16602 Date d'inscription lundi 12 septembre 2005 Statut Contributeur Dernière intervention 16 décembre 2023 3 313
26 févr. 2016 à 08:58
Bonjour Flo

le code modifié avec N cellules au lieu de 2
Option Explicit
'--------
Sub fusionnerV()
Dim Lig As Byte, Deb As Byte
'fige le défilement de l'écran:confort et rapidité
Application.ScreenUpdating = False
'empèche le message d'avertissement de fusion de cellules
Application.DisplayAlerts = False
For Lig = 30 To 90
'Si cellule du dessous =cellule en cours
If Cells(Lig, "A") = Cells(Lig + 1, "A") Then
Deb = Lig 'mémorise la ligne de départ de fusion

'Incrémente la ligne jusqu'à fin de condition =
Do
Lig = Lig + 1
Loop Until Cells(Lig, "A") <> Cells(Lig + 1, "A")

'fusionne le bloc des cellules adjacentes =
With Range(Cells(Deb, "A"), Cells(Lig, "A"))
.MergeCells = True
.VerticalAlignment = xlCenter
End With
End If
Next

Application.DisplayAlerts = True
'encadre la nouvelle présentation
Range("A30:A90").Borders.Weight = xlThin

End Sub


2
WOUAH !!! C'est parfait !!! Merci beaucoup !!
Avec les commentaires pour m'expliquer en plus c'est vraiment top!!! Je pense avoir bien compris le code et pouvoir à l'avenir en créer un du même type tout seul (bon il me faudra quand même quelques heures d'entrainement pour bien maîtrise les conditions, les boucles, etc. mais ça viendra certainement).
Encore merci michel !!!
0
Arkana0 Messages postés 6365 Date d'inscription mercredi 11 février 2009 Statut Modérateur Dernière intervention 10 février 2023 181
24 févr. 2016 à 14:40
Bonjour,

Voici des éléments pour t'aider à faire ton code :

Premièrement, n'hésite pas à abuser du "enregistrer macro" pour obtenir le code permettant de réaliser des actions telles que fusionner des cellules.

Ensuite, sur ce site : https://www.excel-pratique.com/fr/vba/introduction.php tu trouveras une aide précieuse. Tu devrais notamment être intéressé par le chapitre sur les boucles et celui sur les conditions.

Enfin tu trouveras certainement pratique les élements suivants :
ActiveCell
, qui permet de se référer à la cellule active, ou sélectionnée pour le dire autrement.
Cells(x,y)
, qui permet de se référer la à la cellule de la ligne x et de la colonne y (où x et y sont des nombres), la cellule "A1" correspondant à Cells(1,1)
Ainsi que les méthodes suivantes :
.Select
, qui permet de sélectionner la cellule à laquelle tu te réfères (exemple : Cells(x,y).Select)
.Offset(x,y)
, qui permet, à partir d'une cellule à laquelle tu fais référence de s'intéresser à la cellule se situant x lignes plus bas et y colonnes plus loin. Exemple : ActiveCell.Offset(0,1).Select permet de sélectionner la cellule de la colonne suivant celle où se trouve la cellule actuellement active
.Value
, qui permet de faire référence à la valeur de la cellule sélectionnée. Exemple : ActiveCell.Offset(0,1).Value = "" permet de rentrer une case vide dans la cellule une colonne après la cellule qui est actuellement active.
1
Merci pour ta réponse.

Pour faire mes macros j'abusais de la fonction "enregistrer une macro" comme tu dis et j'apprenais en regardant les codes dans visual basic. Le problème c'est que pour des macros avec des conditions je ne peux faire ainsi. Et pour mon cas en particulier je ne peux me débrouiller uniquement avec tes conseils.
Mais encore merci pour ta contribution.
0
Heas Messages postés 71 Date d'inscription samedi 21 novembre 2015 Statut Membre Dernière intervention 3 juillet 2018 5
25 févr. 2016 à 15:08
Bonjour,
le problème que ta as posé a été résolu avec la première macro.
MAIS, en fait ton problème est que tu veux fusionner n cellules identiques.
Ce qui est légèrement différent.

D'autre part, pourquoi fusionner des cellules identiques?

Aussi, essaye de travailler avec les conseils d'Arkana.

Et dans ton cas, si tu tiens vraiment à faire la fusion, travaille avec une boucle du type
Depart= 30 : i=1
WHILE Cell(Depart)=Cell(depart+i)
i=i+1
wend

Fusionner de Depart à Depart +i-1 (Si on sort de la boucle, c'est que la cellule est différente)

Et attention à faire le While avec un test sur le nombre max de cellules, car tu peux avoir la 59 et la 60 identiques; sauf SI TU ES SUR que la 61 est vide.
1

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
makitoch Messages postés 730 Date d'inscription samedi 14 juin 2014 Statut Membre Dernière intervention 28 octobre 2020 78
24 févr. 2016 à 14:34
franchement les conditions sur les cellule c'est juste des boucles for () avec des if () donc ça tu peux trouver tout seul ^^

voici comment fusionner des cellules :
Range("D5:D6").Select
Selection.Merge
Selection.UnMerge
-5