Excel MacroVBA : tri avec cellules fusionnées
STS
-
michel_m Messages postés 18903 Date d'inscription Statut Contributeur Dernière intervention -
michel_m Messages postés 18903 Date d'inscription Statut Contributeur Dernière intervention -
Bonjour,
J'ai une feuille Excel avec des cellules fusionnées. Par exemple, la colonne A ne comporte que des cases (cellules fusionées) contenant 4 cellules, les cellules de la colonne B ne sont pas fusionnées... 1 case de la colonne A correspond donc à 4 cellules de la cellules B...
Je cherche à trier cette feuille en fonction du contenu des cases de la colonne A. Celui ci devrait etre de type chaine de caractere (pas d'heure ou date).
Je n'ai pas à effectuer de tri sur une colonne de celules non fusionnée.
Je me disais que cela devait etre un probleme fréquent et que si quelqu'un avait un bout de code sur une étagère...
Merci d'avance.
J'espere avoir été clair.
Bonne journée.
J'ai une feuille Excel avec des cellules fusionnées. Par exemple, la colonne A ne comporte que des cases (cellules fusionées) contenant 4 cellules, les cellules de la colonne B ne sont pas fusionnées... 1 case de la colonne A correspond donc à 4 cellules de la cellules B...
Je cherche à trier cette feuille en fonction du contenu des cases de la colonne A. Celui ci devrait etre de type chaine de caractere (pas d'heure ou date).
Je n'ai pas à effectuer de tri sur une colonne de celules non fusionnée.
Je me disais que cela devait etre un probleme fréquent et que si quelqu'un avait un bout de code sur une étagère...
Merci d'avance.
J'espere avoir été clair.
Bonne journée.
Configuration: Windows XP Internet Explorer 6.0
4 réponses
-
Bonsoir,
que si quelqu'un avait un bout de code sur une étagère... : bin, j'ai construit l'étagère car effectivement, ça doit être fréquent
a essayer(valable pour 2 colonnes jointives, XL<2007):
Option Explicit Const hauteur As Byte = 4 'hauteur des cellules fusionnées Const zone As String = "A1:B21" Sub trier_cell_fusionnées() Dim lig As Long, nbre_lig As Long, etape As Long, col As Byte Dim tablo_tri Dim lig_src As Long, lig_cbl As Long Dim cptr1 As Long, cptr2 As Long, cptr3 As Long, cptr4 As Long Dim col_B As New Collection Dim i, j, k As Long Dim tmp0, tmp1 '---- INITIALISATION col = Range(zone).Column lig = Range(zone).Row nbre_lig = Range(zone).Rows.Count etape = ((nbre_lig - 1) / hauteur) - 1 ReDim tablo_tri(etape, 1) '----- MEMORISATION des DONNEES lig_src = lig For cptr1 = 0 To etape 'mémorise valeur dans cellule fusionnée tablo_tri(cptr1, 0) = Cells(lig_src, 1) 'mémorise ligne de la cellule tablo_tri(cptr1, 1) = lig_src lig_src = lig_src + hauteur Next 'collecte les données dans la colonne à droite For cptr2 = lig To nbre_lig - 1 col_B.Add Cells(cptr2, col + 1).Value Next '-----TRI 'trie dans l'ordre crissant valeurs et lignes dans cell fusionnées For i = 0 To etape j = i For k = j + 1 To etape If tablo_tri(k, 0) <= tablo_tri(j, 0) Then j = k Next k If i <> j Then tmp0 = tablo_tri(j, 0) tmp1 = tablo_tri(j, 1) tablo_tri(j, 0) = tablo_tri(i, 0) tablo_tri(j, 1) = tablo_tri(i, 1) tablo_tri(i, 0) = tmp0 tablo_tri(i, 1) = tmp1 End If Next i '----- RESTITUTION Application.ScreenUpdating = False lig_cbl = lig For cptr3 = 0 To etape Cells(lig_cbl, col) = tablo_tri(cptr3, 0) 'cellule fusionnée lig_src = tablo_tri(cptr3, 1) For cptr4 = 0 To hauteur - 1 'cellule colonne de droite Cells(lig_cbl + cptr4, col + 1) = col_B(lig_src + cptr4) Next lig_cbl = lig_cbl + hauteur Next '---- annulation du pointeur Set col_B = Nothing End Sub
Ci joint démo
http://www.cijoint.fr/cjlink.php?file=cj200905/cijvk2FwQb.xls
mais il ya peut-^tre + simple.... -
Histoire d'améliorer les codes sur l'étagère: ;-)
https://www.cjoint.com/?fvoGU5rg3R
on peut sélectionner plusieurs colonnes à droite de la colonne des cellules fusionnées
un formulaire (userform1) demande de sélectionner la zone (appui sur le petit carré à droite avec les points)
le nombre de lignes fusionnées par cellule est calculé (cette hauteur ou" pas",doit ^tre toujours le m^me par ex:4)
annule et remplace le doliprane précédent -
Bonjour,
Les cellules fusionnées sont à bannir...
en vertical, il n'y a pas grand remède si ce n'est dans ton code de dé-fusionner ta colonne et à la fin refusionner à un pas de 4...
Bon courage -
Je sais que c'est à bannir. mais voila... mes fichiers d'entrée sont comme cela... :(
J'imagine qu'une piste serait de parcourir la colonne A avec un tri type "tri à bulle" et de deplacer les 4 lignes de la "ligne" en cours...