Rechercher : dans
Par :

Excel MacroVBA : tri avec cellules fusionnées

Dernière réponse le 21 mai 2009 à 14:40:03 STS, le 20 mai 2009 à 09:18:40 
 Signaler ce message aux modérateurs

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.

Configuration: Windows XP Internet Explorer 6.0

Meilleures réponses pour « Excel MacroVBA : tri avec cellules fusionnées » dans :
[Excel] Colorer des cellules sur conditions VoirIl existe dans Excel des fonctions très pratiques mais peu connues et peu utilisées. Exemple : vous souhaitez qu'une cellule se colore automatiquement en rouge (ou autre mise en forme de police, de bordure, de trame) selon une condition : un...
Formules Excel de base VoirVoici quelques formules de bases qui sont faciles à réaliser et qui peuvent donner un peu de vie à une feuille Excel ! Pour cette astuce, on supposera que l’on veut que le résultat s’affiche dans la cellule B10 et on se servira principalement des...
[Excel] Trier sur les lignes (horizontalement), non les colonnes VoirMicrosoft Excel est configuré par défaut pour réaliser un tri sur les colonnes (Données / Trier). Pour trier les données horizontalement, il suffit de sélectionner les données à trier, puis de cliquer sur le bouton Options et, dans le panneau...

1

michel_m, le 20 mai 2009 à 09:50:05

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 Cordialement, Michel

Répondre à michel_m

2

STS, le 20 mai 2009 à 10:06:54

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...

Répondre à STS

3

michel_m, le 20 mai 2009 à 22:05:01
  • +2

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.... Cordialement, Michel

Répondre à michel_m

4

 michel_m, le 21 mai 2009 à 14:40:03

Histoire d'améliorer les codes sur l'étagère: ;-)
http://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 Cordialement, Michel

Répondre à michel_m