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!
 

Fichiers joints

Modeste geedee

XLDnaute Barbatruc
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!
1 -pour garder l'ordre des types d'information :
il faut que cet ordre corresponde à un type (alpha ou num)
dans le cas contraire
il faut insérer une colonne comportant l'ordre inital

2 - si l'on veut que l'ordre des superviseurs soit alphabétique
il faut que les superviseurs non utilisés soient nommés "zzz" ou tout autre caractère supérieur à "z" dans la table ASCII

en conséquence :
insérez une colonne avant B
en B4 saisissez : 1
en B5 saisissez : 2
sélectionnez ces 2 cellules
double click sur le coin inférieur droit de cette sélection
puis choisir
tri personnalisé :
upload_2018-10-4_16-46-7.png

la colonne B pourra alors ensuite être supprimée
 

fablog

XLDnaute Occasionnel
Bonjour et merci pour votre réponse. Malheureusement, je dois laisser les cellules vides car je suis sur qu'une fois qu'un employé sera parti, son chef d'équipe ne remettra pas le "ZZZZZ" dans la cellule. Le filtre ne fonctionnera donc plus à ce moment là.
 

Modeste geedee

XLDnaute Barbatruc
Bonjour et merci pour votre réponse. Malheureusement, je dois laisser les cellules vides car je suis sur qu'une fois qu'un employé sera parti, son chef d'équipe ne remettra pas le "ZZZZZ" dans la cellule. Le filtre ne fonctionnera donc plus à ce moment là.
o_O Dans ce cas limiter les données aux seules lignes remplies (superviseur, nom, CIDP)
 

fablog

XLDnaute Occasionnel
La liste d'employé va s'agrandir et rétrécir régulièrement, je ne peux pas limiter l'accès seulement au lignes remplis car je ne sais pas combien vont l'être.
 

Modeste geedee

XLDnaute Barbatruc
La liste d'employé va s'agrandir et rétrécir régulièrement, je ne peux pas limiter l'accès seulement au lignes remplis car je ne sais pas combien vont l'être.
:rolleyes: Masquer EXCEL, Userform ===> VBA !!!
cela devient une application...
une simple macro ne peut tenir compte d'un cahier des charges inexistant !!!
 

fablog

XLDnaute Occasionnel
Je sais exactement ce que je veux alors je ne vois pas pourquoi vous dites qu'il n'y a pas de cahier des charges. D'ailleurs, dans mon cahier des charges je ne peux pas utiliser de Userform par choix ergonomiques.
Je rappel que ma demande consiste en une macro pas dans des changements de structure de mon fichier.
Merci quand même pour votre temps.
 

Modeste geedee

XLDnaute Barbatruc
Je sais exactement ce que je veux alors je ne vois pas pourquoi vous dites qu'il n'y a pas de cahier des charges. D'ailleurs, dans mon cahier des charges je ne peux pas utiliser de Userform par choix ergonomiques.
Je rappel que ma demande consiste en une macro pas dans des changements de structure de mon fichier.
Merci quand même pour votre temps.
Je pense que la solution à mon problème nécessite une macro
Continuons donc à penser , un VBAiste extralucide va peut-être passer par ici ...
 

job75

XLDnaute Barbatruc
Bonjour fablog, Modeste geedee, JHA, le forum,

Je ne comprends pas pourquoi vous utilisez des formules, d'autant qu'elles ne sont pas simples à mettre en œuvre.

Voyez le fichier joint et les opérations de copier-collage spécial.

Il suffira ensuite de trier le tableau sur les colonnes "Superviseur" puis "CIDP".

A+
 

Fichiers joints

chatounet

XLDnaute Nouveau
Bonjour le forum
JHA était parti sur la même idée que moi.
Ma proposition est un nouveau tableau dans une autre feuille qui est toujours trié et à jour. Il suffit d'incrémenter la dernière ligne et/ou la dernière colonne. Ainsi la base de donnée peut être modifiée à souhait : suppression ou ajout de salariés ; idem pour les jours en colonne. Une solution sans macro.
Bien à vous tous
 

Fichiers joints

job75

XLDnaute Barbatruc
Re, salut chatounet,

La solution de mon post #10 est aussi sans macro (et sans formules) :)

Maintenant si l'on veut que les plages telles que B5: D9. restent vides il faut du VBA :
Code:
Sub Trier()
Dim a As Range
Application.ScreenUpdating = False
On Error Resume Next 'si aucune SpecialCell
With [A3].CurrentRegion.Columns(2).Resize(, 3)
    For Each a In .SpecialCells(xlCellTypeBlanks).Areas
        a.NumberFormat = "General" 'format Standard
        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
End With
End Sub
Fichier .xlsm joint.

A+
 

Fichiers joints

chatounet

XLDnaute Nouveau
Re à Tous, salut Job75
Bien vu ta proposition, c'est exactement ce que voulait Fablog. Il est vrai que je n'avais pas vraiment compris si son problème était de remplir les cellules en blanc (colonnes B C et D) ou de sans débarrasser, mais aussi si elle voulait travailler directement sur sa BD.
Merci à toi,
 

chatounet

XLDnaute Nouveau
Oui Job c'est stupide de ma part j'ai associé très bêtement Fablog au prénom Fabienne une copine à moi secrétaire.
Je m'excuse à tous pour cette ânerie. Et merci de m'avoir remis en place ; je serai plus vigilant désormais.
 

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+
 

Fichiers joints

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+
 

Fichiers joints

Discussions similaires


Haut Bas