Masquer les 0 dans un classement alphabétique horizontal

Bonsoir,

Grâce H2SO4, j'ai pu adapter une macro qui classe par ordre alphabétique une ligne de donnée, voici le code :

    Sub triligne()
        With ActiveWorkbook.Worksheets("Planning").Sort
            .SortFields.Clear
            .SortFields.Add Key:=Range("B1:AJ1"), _
                            SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
            .SetRange Range("B1:AJ1")
            .Header = xlGuess
            .MatchCase = False
            .Orientation = xlLeftToRight
            .SortMethod = xlPinYin
            .Apply
        End With
    End Sub

Hors sur cette ligne il y a des valeurs mentionné 0, ce qui fait que lorsque je classe ma ligne par ordre alphabétique, j'ai une multitude de 0 en tete de ligne et seulement après les noms par ordre alphabétique.

Comment pourrais t'on "masquer ces mentions 0 et garder uniquement les noms par ordre alphabétique?

Merci bien par avance.

Bonjour.

Il faut simplement faire 2 tris. Un premier tri descendant pour placer les 0 à la fin. Le second ascendant portera seulement sur le champ contenant les données différentes de 0.

Sub triligne()

 'Premier tri : descendant
 Set r = Range("B1:AJ1") 'Definit le champ a trier
        With ActiveWorkbook.Worksheets("Planning").Sort
            .SortFields.Clear
            .SortFields.Add Key:=r, _
                            SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
            .SetRange r
            .Header = xlGuess
            .MatchCase = False
            .Orientation = xlLeftToRight
            .SortMethod = xlPinYin
            .Apply
        End With
  'Chercher le premier 0
    For i = Cells(1, "B").Column To Cells(1, "Aj").Column

     If Cells(1, i) = 0 Then
      Set r = Range(Cells(1, "B"), Cells(1, i - 1)) 'Definit le champ a trier
      Exit For
     End If

    Next
  If i > Cells(1, "B").Column Then
  'Second tri : Ascendant
        With ActiveWorkbook.Worksheets("Planning").Sort
            .SortFields.Clear
            .SortFields.Add Key:=r, _
                            SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
            .SetRange r
            .Header = xlGuess
            .MatchCase = False
            .Orientation = xlLeftToRight
            .SortMethod = xlPinYin
            .Apply
        End With
   End If

    End Sub

Cordialement

Docmarti

Bonjour Docmarti et merci pour ton aide.

Malheureusement je viens de teste ce la ne fonctionne pas.

Enfin partiellement, on voit encore les 0 dans la ligne mas ça les mets à la fin par contre ça c'est bien.

Je précise que la colone nom dans personnels est dynamiqueun coup il y en a 5, un coup 15.

Je te joins mon fichier pour plus de facilité.

Bien cordialement.

Merci pour ton fichier. C'est effectivement plus facile quand on voit de visu.

Voici comment masquer les colonnes dont le titre est 0.

Sub triligne()

 'Premier tri : descendant
Set r = Range("B1:AJ1") 'Definit le champ a trier
'Affiche toutes les colonnes de ce champ
Range(Columns(r.Column), Columns(r.Columns.Count + r.Column - 1)).Hidden = False

       With ActiveWorkbook.Worksheets("Planning").Sort
            .SortFields.Clear
            .SortFields.Add Key:=r, _
                            SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
            .SetRange r
            .Header = xlGuess
            .MatchCase = False
            .Orientation = xlLeftToRight
            .SortMethod = xlPinYin
            .Apply
        End With
  'Chercher le premier 0
   For i = Cells(1, "B").Column To Cells(1, "Aj").Column

     If Cells(1, i) = 0 Then

      Set masquer = Range(Cells(1, i), Cells(1, "AJ")) 'Définir le champ à masquer

      Set r = Range(Cells(1, "B"), Cells(1, i - 1)) 'Definir le champ a trier

     Exit For
     End If

    Next
  If i > Cells(1, "B").Column Then
  'Second tri : Ascendant
       With ActiveWorkbook.Worksheets("Planning").Sort
            .SortFields.Clear
            .SortFields.Add Key:=r, _
                            SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
            .SetRange r
            .Header = xlGuess
            .MatchCase = False
            .Orientation = xlLeftToRight
            .SortMethod = xlPinYin
            .Apply
        End With

        'Masquer les colonnes dont le titre est 0
        Range(Columns(masquer.Column), Columns(masquer.Columns.Count + masquer.Column - 1)).Hidden = True
   End If

    End Sub

Docmarti

Bonjour DOCMARTI,

Merci pour ton aide, j'ai donc inséré ta macro, lorsque je la teste il me déclenche une erreur ligne 424

Range(Columns(masquer.Column), Columns(masquer.Columns.Count + masquer.Column - 1)).Hidden = True

Tu aurais une idée ?

Cordialement.

Bonjour

Je n'ai pas assez de détailsur cette erreur.

Laisse tomber le code de mon précédent message.

Utilise plutôt la procédure triligne modifiée qui se trouve dans le classeur ci-joint.

Et dis-moi si elle provoque une erreur.

Docmarti

Hello Doc

J'ai effectivement une erreur :

Fenêtre alerte qui s'ouvre et qui dit Erreur ligne 0

Error (9) L'indice n'appartient pas à la sélection.

Je clique sur OK, il m'ouvre la fenêtre VBA et en bas le stop est en jaune :

Stop

End Sub

COrdialement

Oups. Un oubli.

Remplace

Set fPlanning = ActiveWorkbook.Worksheets("Planning3")

par

Set fPlanning = ActiveWorkbook.Worksheets("Planning")

re

Merci de ton aide tout d'abord.

Je viens de modifier ce que tu m'as demandé.

J'ai une erreur ligne error 424 objet requis.

et le stop en bas en jaune.

Ca classe quand même en alphabétique, mais j'ai les X cases vides en début.

dyscus a écrit :

re

J'ai une erreur ligne error 424 objet requis.

Ca classe quand même en alphabétique, mais j'ai les X cases vides en début.

Si tu cliques sur le bouton TEST du classeur ci-joint, as-tu encore une erreur ?

S,il y a une erreur, clique sur OK et pèse une fois sur la touche F8.

Docmarti

Hello Doc,

Je teste et je te tiens au courant dqp

Bonne journée.

Je viens donc de tester sur ta dernière mouture ça fonctionne sans soucis.

Par contre j'ai importé la macro dans le fichier contenant toutes les données des personnels celà ne fonctionne pas j'ai toujours l'erreur.

Ligne : 0

Error: (424) objet requis

Dans l'ordre lorsque je fait F8 dans l'ordre se colore en jaune :

Stop

Resume

fPlanning.Range(fPlanning.Columns(masquer.Column), fPlanning.Columns(masquer.Columns.Count + masquer.Column - 1)).Hidden = True

MsgBox "Ligne: " & Erl & vbCrLf & _

"Error: (" & Err.Number & ") " & Err.Description, vbCritical, "Erreur"

Et donc après j'ai le fameux :

Ligne : 0

Error: (424) objet requis

Dans mon fichier original, pour les noms je fais appel à une formule matricielle du type ci-dessous, les noms ne sont pas en "durs" sur l'onglet personnels est ce que celà peut interférer avec la macro ?

=SI(LIGNES('Liste complète des PERS DIR'!$G$1:'Liste complète des PERS DIR'!H1)>NB('Liste complète des PERS DIR'!$H$1:$H$903);"";INDEX('Liste complète des PERS DIR'!$A$1:$G$903;PETITE.VALEUR('Liste complète des PERS DIR'!$H$1:$H$903;LIGNES('Liste complète des PERS DIR'!$G$1:'Liste complète des PERS DIR'!H1));2))

Du coup c'est soit un nom qui s'affiche dans la case soit elle est vide dans l'onglet personnels.

Bonjour Christophe,

En parlant de classement alphabétique sans macro ... ci-joint une proposition ...

22test-dyscus.xlsx (12.92 Ko)
dyscus a écrit :

Dans mon fichier original, pour les noms je fais appel à une formule matricielle du type ci-dessous, les noms ne sont pas en "durs" sur l'onglet personnels est ce que celà peut interférer avec la macro ?

Je ne connais pas assez les formules pour pouvoir répondre sans avoir un classeur identique au classeur original.

Essaie de déclarer toutes les variables :

En remplaçant

On Error GoTo errorhandler

par

On Error GoTo errorhandler
 Dim i As Long
 Dim fPlanning As Worksheet
 Dim r As Range
 Dim masquer As Range

Cordialement

Docmarti

Hello DOCMATI,

Voici le fichier original.

Via l'onglet Etat déclaratif en E10il y une liste déroulante avec 2 affectations qui insère automatiquement les noms des agents dans notre fameux onglet Planning

J'ai remplacé ce que tu m'a proposé, il y a une autre erreur.

Ce sera plus facile pour toi peut être avec le fichier original.

Merci encore pour ton aide.

Cordialement.

Bonjour dyscus

Le problème était dû au fait que les entêtes qui étaient censées afficher 0 n'affichaient pas 0 dans ton fichier original.

Docmarti

dyscus

Le fichier joint dans mon précédent message a été supprimé par moi. Car il semble représenter un problème de sécurité. Il ralentit considérablement le VBA Excel.

Ce fichier était ton fichier original de ton dernier message que Excel a dû corrigé car il contenait une partie illisible.

Tu devrais le supprimer de ton dernier message.

Docmarti

Hello voila c'est fait,

C'est dommage car j'étais entrain de le tester et ça fonctionnais

L'erreur que j'ai eu à l'ouverture est peut-être due à une mémoire insuffisante sur un ordi que j'utilise depuis peu, manque de mémoire causé possiblement par le nombre de formules dans ton fichier.

Le nouveau code est dans le fichier ci-joint.

Docmarti

Merci bien Docmarti,

Je t'avoue que j'ai passé une petite nuit blanche a gratter sur tout mon projet, j'ai tellement envie d'y aller jusqu'au bout

Donc là ça fonctionne pas de soucis si "j’appelle" le nom sur l'onglet planning avec =Personnels!B1 , =Personnels!B2 , =Personnels!B3 etc...

Par contre à l'origine, j’appelle les noms avec cette formule =INDIRECT("Personnels!B" & COLONNE(B1) - 1) , =INDIRECT("Personnels!B" & COLONNE(C1) - 1) , =INDIRECT("Personnels!B" & COLONNE(D1) - 1)

Le tri ne se fait pas, on vois que ça réfléchit, pas d'erreur mais ca laisse le classement tel quel.

Il doit y avoir une subtilité je pense mais laquelle

Rechercher des sujets similaires à "masquer classement alphabetique horizontal"