Fonction rank sur lignes non masquées

Holeshotman

XLDnaute Junior
Bonjour le forum !

Je butte sur un problème depuis un petit moment ...

J'ai le code suivant, qui me permet d'établir en colonne L un classement des valeurs présentes en colonne K:

Code:
Application.ScreenUpdating = False
    Der = Range("K65536").End(xlUp).Row
    Set Plage = Range("K1:K" & Der)
    With Range("L2:L" & Der).Font
        .ColorIndex = 1
        .Bold = False
    End With
    For i = 2 To Der
        Cells(i, 12) = Application.WorksheetFunction.Rank(Cells(i, 11), Plage, 0)
        If Cells(i - 1, 12) = Cells(i, 12) Then
            With Range("L" & i - 1 & ":L" & i).Font
                .ColorIndex = 46
                .Bold = True
            End With
        End If
    Next i
    Application.ScreenUpdating = True

Unload Me 'Ferme le userform
    
End Sub

Cela fonctionne parfaitement, seulement lorsque je filtre une colonne et que je réactualise le classement, le code ne fonctionne plus (en tout cas il établit un classement, mais saute des valeurs).

J'ai pensé à insérer quelque chose du genre :

Code:
If Not Rows(i).Hidden Then 'etc

Mais je n'y arrive pas, je dois mal m'y prendre ..

Si vous avez des idées, je suis preneur ! Merci beaucoup :D
 

job75

XLDnaute Barbatruc
Re : Fonction rank sur lignes non masquées

Bonjour,

Il faudrait voir votre fichier montrant ce que vous voulez obtenir quand vous filtrez.

Ce qui est sûr c'est que End(xlUp) donne la dernière cellule visible non vide.

Si vous voulez toujours obtenir la dernière ligne remplie Der, essayez en début de macro :

Code:
Dim Der1 As Long, Der2 As Long, Der As Long
On Error Resume Next
Der1 = Application.Match("zzz", [K:K])
Der2 = Application.Match(9 ^ 9, [K:K])
Der = Application.Max(Der1, Der2)
On Error GoTo 0
A+
 

Holeshotman

XLDnaute Junior
Re : Fonction rank sur lignes non masquées

Job75,

Merci pour vos conseils, je vous joins mon fichier.

Pour exécuter un classement, tapez sur le bouton de contrôle "Classer les fournisseurs par critère",ensuite choisissez une valeur (il s'agit simplement d'une pondération qui attribue plus ou moins d'importance à chacun des critères) et validez:

Le classement s'établit alors en colonne L. (Ça fonctionne avec en plus gestion des ex-aequo).

Maintenant si l'on filtre par la colonne "TECHNOLOGIE" en ne sélectionnant que "Fonderie" par exemple et que l'on recommence un classement via le bouton de contrôle, on obtient le classement suivant (pour coef qualité = 0,5):

Regarde la pièce jointe Class1.bmp

Alors que je souhaiterais obtenir le classement suivant : 1, 2, 3, 4, 5, 6 tout simplement ...
Le code semble prendre en compte les lignes masquées :confused:

D'autres idées ?
 

Holeshotman

XLDnaute Junior
Re : Fonction rank sur lignes non masquées

Non effectivement, je pensais avoir mis le fichier, mais je l'ai visiblement oublié :cool:

Voila l'erreur réparée à présent !
 

Pièces jointes

  • Présentation fichier souhaité.zip
    39.8 KB · Affichages: 19
  • Présentation fichier souhaité.zip
    39.8 KB · Affichages: 19
  • Présentation fichier souhaité.zip
    39.8 KB · Affichages: 19

job75

XLDnaute Barbatruc
Re : Fonction rank sur lignes non masquées

Re,

Vous voulez le classement des cellules visibles uniquement, alors essayez ce code :

Code:
Dim Der&, Plage As Range, n&, i&
'-----------
Der = Range("K65536").End(xlUp).Row
Set Plage = Range("K1:K" & Der).SpecialCells(xlCellTypeVisible)
With Range("L2:L" & Der)
  .Font.ColorIndex = 1
  .Font.Bold = False
  .ClearContents
End With
n = 1
For i = 2 To Der
  If Not Rows(i).Hidden Then
    Cells(i, 12) = Application.WorksheetFunction.Rank(Cells(i, 11), Plage)
    If Cells(n, 12) = Cells(i, 12) Then
      With Union(Range("L" & n), Range("L" & i)).Font
        .ColorIndex = 46
        .Bold = True
      End With
    End If
    n = i
  End If
Next
Application.ScreenUpdating = True
La fonction RANG accepte en effet des plages constituées de plusieurs zones.

A+
 

Statistiques des forums

Discussions
312 493
Messages
2 088 944
Membres
103 989
dernier inscrit
jralonso