VBA : condition pour fusionnage
Résolu/Fermé
A voir également:
- VBA : condition pour fusionnage
- Excel compter cellule couleur sans vba - Guide
- Mkdir vba ✓ - Forum VB / VBA
- L'indice n'appartient pas à la sélection vba ✓ - Forum Programmation
- Autofill vba ✓ - Forum Excel
- Vba range avec variable ✓ - Forum VB / VBA
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
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
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
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
26 févr. 2016 à 08:58
Bonjour Flo
le code modifié avec N cellules au lieu de 2
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
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 !!!
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 !!!
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
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 :
Ainsi que les méthodes suivantes :
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.
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.
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.
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
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.
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.
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
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
voici comment fusionner des cellules :
Range("D5:D6").Select
Selection.Merge
Selection.UnMerge
25 févr. 2016 à 11:50
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 !!
25 févr. 2016 à 12:24
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
25 févr. 2016 à 14:45
En essayant de comprendre et de me dépatouiller de mon coté, j'ai modifié ton code comme ceci:
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:
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 ^^
25 févr. 2016 à 17:14
Je regarde demain.... ;o)