Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2010 Macro pour trier séries de lignes contenant des formules

fablog

XLDnaute Occasionnel
Bonjour tout le monde,

Je pense que la solution à mon problème nécessite une macro car avec les fonctions de trie cela ne fonctionne pas correctement.
Je veux trier mon tableau dans cet ordre:
- Superviseur
- CIDP
- Information (en gardant l'ordre des types d'information)

Le problème est que j'ai des formules de recopie dans les cellules sans couleur des colonnes A à E et c'est ça qui met le bazar.

Merci par avance pour votre aide!
 

Pièces jointes

  • Tableau.xlsx
    30.5 KB · Affichages: 40

job75

XLDnaute Barbatruc
Re,

Utilisez plutôt cette macro qui est 2 fois plus rapide que la précédente :
Code:
Sub Trier()
Dim a As Range
Application.ScreenUpdating = False
On Error Resume Next 'si aucune SpecialCell
With [A3].CurrentRegion.Columns(2).Resize(, 3)
    .NumberFormat = "General" 'format Standard
    For Each a In .SpecialCells(xlCellTypeBlanks).Areas
        a.FormulaR1C1 = "=IF(RC5=R4C5,""zzz"",R[-1]C)"
    Next
    .EntireRow.Sort .Columns(3), xlAscending, .Columns(1), , xlAscending, Header:=xlYes 'tri sur 2 colonnes
    .SpecialCells(xlCellTypeFormulas).ClearContents 'efface les formules
    .NumberFormat = "@" 'format Texte
End With
End Sub
Fichier (2).

J'ai testé en recopiant le tableau sur 36 000 lignes, le tri se fait chez moi en 43 secondes.

Je vais voir si l'on peut faire mieux en utilisant un tableau VBA.

A+
 

Pièces jointes

  • Tableau trié par VBA(2).xlsm
    39.4 KB · Affichages: 13

job75

XLDnaute Barbatruc
Re,

En effet avec un tableau VBA c'est bien plus rapide :
Code:
Sub Trier()
Dim t, ncol%, x$, i&, j%
Application.ScreenUpdating = False
On Error Resume Next 'si aucune SpecialCell
With [A3].CurrentRegion.Columns(2).Resize(, 4)
    t = .Value 'tableau VBA, plus rapide
    ncol = UBound(t, 2) - 1
    x = t(2, 4)
    For i = 2 To UBound(t)
        For j = 1 To ncol
            If t(i, j) = "" Then If t(i, 4) = x Then t(i, j) = "zzz" Else t(i, j) = "=R[-1]C"
    Next j, i
    .NumberFormat = "General" 'format Standard
    .Resize(, 3).FormulaR1C1 = t 'restitution
    .EntireRow.Sort .Columns(3), xlAscending, .Columns(1), , xlAscending, Header:=xlYes 'tri sur 2 colonnes
    .SpecialCells(xlCellTypeFormulas).ClearContents 'efface les formules
    .Replace "zzz", ""
    .NumberFormat = "@" 'format Texte
End With
End Sub
Fichier (3).

Sur 36 000 lignes la macro s'exécute chez moi en 6,7 secondes.

A+
 

Pièces jointes

  • Tableau trié par VBA(3).xlsm
    41 KB · Affichages: 16

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…