[ RESOLU ] Classer les plus grosses valeurs negatives,et

Guido

XLDnaute Accro
Bonsoir Le furum

J'aimerais faire ressortir les valeurs negatives et positives separement dans deux colonnes et

les classer de la plus grosses negative a la plus petites et classer les plus grosses valeurs positives a

la plus petite sans les valeurs ZERO

Merci

Guido
 

Pièces jointes

  • Classer plus grosses valeurs negatives,et.xls
    19.5 KB · Affichages: 85
  • Classer plus grosses valeurs negatives,et.xls
    19.5 KB · Affichages: 75

CISCO

XLDnaute Barbatruc
Re : Classer les plus grosses valeurs negatives,et

Bonsoir

Cf. en pièce jointe. Formules matricielles dans les colonnes V et Y à valider avec Ctrl+maj+entrer. J'ai mis des formats personnalisés pour faire "disparaitre" les nombres en bas des colonnes W et Z.

@ plus
 

Pièces jointes

  • Classer plus grosses valeurs negatives,et.xls
    53.5 KB · Affichages: 75
  • Classer plus grosses valeurs negatives,et.xls
    53.5 KB · Affichages: 85

Guido

XLDnaute Accro
Re : Classer les plus grosses valeurs negatives,et

Re CISCO

Merci pour ta reponse,

J'ai oublié de preciser que la donnée peut atteindre 20 valeurs parfois.

Voir le fichier ,merci pour corriger la formule

Guido
 

Pièces jointes

  • 362891d1461879663-classer-les-plus-grosses-valeurs-negatives-et-classer-plus-grosses-valeurs-neg.xls
    48 KB · Affichages: 76

job75

XLDnaute Barbatruc
Re : Classer les plus grosses valeurs negatives,et

Bonjour Guido, CISCO,

Code:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim P1 As Range, P2 As Range
If Intersect(Target, [B3,K3]) Is Nothing Then Exit Sub 'cellules à adapter
Cancel = True
Application.ScreenUpdating = False
If Me.FilterMode Then Me.ShowAllData 'si la feuille est filtrée
With Range(Target, Target(Rows.Count - Target.Row + 1, 2).End(xlUp))
  Set P1 = .Offset(, 3): Set P2 = .Offset(, 6)
  .Copy P1: .Copy P2
End With
P1.Sort P1(1, 2), xlAscending, Header:=xlYes 'tri
P1.AutoFilter 2, ">=0" 'filtre automatique
Set P1 = P1.Offset(1).SpecialCells(xlCellTypeVisible)
P1.Clear: P1.Interior.ColorIndex = 2 'couleur blanche facultative...
Me.AutoFilterMode = False
P2.Sort P2(1, 2), xlDescending, Header:=xlYes 'tri
P2.AutoFilter 2, "<=0" 'filtre automatique
Set P2 = P2.Offset(1).SpecialCells(xlCellTypeVisible)
P2.Clear: P2.Interior.ColorIndex = 2 'couleur blanche facultative...
Me.AutoFilterMode = False
End Sub
Fichier joint.

A+
 

Pièces jointes

  • Classer plus grosses valeurs negatives et positives(1).xls
    31.5 KB · Affichages: 83

job75

XLDnaute Barbatruc
Re : Classer les plus grosses valeurs negatives,et

Re,

En cas de cellules vides :

Code:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim P1 As Range, P2 As Range
If Intersect(Target, [B3,K3]) Is Nothing Then Exit Sub 'cellules à adapter
Cancel = True
Application.ScreenUpdating = False
If Me.FilterMode Then Me.ShowAllData 'si la feuille est filtrée
With Range(Target, Target(Rows.Count - Target.Row + 1, 2).End(xlUp))
  Set P1 = .Offset(, 3): Set P2 = .Offset(, 6)
  .Copy P1: .Copy P2
End With
P1.Sort P1(1, 2), xlAscending, Header:=xlYes 'tri
P1.Columns(2).Replace "", 0 'en cas de cellules vides
P1.AutoFilter 2, ">=0" 'filtre automatique
Set P1 = P1.Offset(1).SpecialCells(xlCellTypeVisible)
P1.Clear: P1.Interior.ColorIndex = 2 'couleur blanche facultative...
Me.AutoFilterMode = False
P2.Sort P2(1, 2), xlDescending, Header:=xlYes 'tri
P2.Columns(2).Replace "", 0 'en cas de cellules vides
P2.AutoFilter 2, "<=0" 'filtre automatique
Set P2 = P2.Offset(1).SpecialCells(xlCellTypeVisible)
P2.Clear: P2.Interior.ColorIndex = 2 'couleur blanche facultative...
Me.AutoFilterMode = False
End Sub
Fichier (2).

A+
 

Pièces jointes

  • Classer plus grosses valeurs negatives et positives(2).xls
    31.5 KB · Affichages: 77

job75

XLDnaute Barbatruc
Re : Classer les plus grosses valeurs negatives,et

Re,

Pour finir voici une meilleure solution avec filtrage par colonne auxiliaire.

Elle fonctionne même s'il y a des cellules vides, des valeurs textes ou des valeurs d'erreur :

Code:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim P As Range
If Intersect(Target, [B3,K3]) Is Nothing Then Exit Sub 'cellules à adapter
Cancel = True
Application.ScreenUpdating = False
If Me.FilterMode Then Me.ShowAllData 'si la feuille est filtrée
With Range(Target, Target(Rows.Count - Target.Row + 1, 2).End(xlUp))
  Set P = .Offset(, 3): .Copy P: Filtrer P, ">0", xlAscending
  Set P = .Offset(, 6): .Copy P: Filtrer P, "<0", xlDescending
End With
End Sub

Sub Filtrer(P As Range, critere$, sens%)
With P.Offset(1).Columns(3) 'colonne auxiliaire
  .FormulaR1C1 = "=IF(ISNUMBER(1/(-(""""&RC[-1])" & critere & ")),RC[-1],"""")"
  .Value = .Value 'supprime les formules
  P.Resize(, 3).Sort .Cells, sens, Header:=xlYes 'tri
  Set P = Intersect(P.Offset(1), .SpecialCells(xlCellTypeBlanks).EntireRow)
  .ClearContents
End With
P.Clear: P.Interior.ColorIndex = 2 'couleur blanche facultative...
End Sub
Fichier (3).

A+
 

Pièces jointes

  • Classer plus grosses valeurs negatives et positives(3).xls
    44 KB · Affichages: 80

job75

XLDnaute Barbatruc
Re : Classer les plus grosses valeurs negatives,et

Re,

Bah pas besoin de colonne auxiliaire, ici les formules sont entrées dans la 2ème colonne :

Code:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim P As Range
If Intersect(Target, [B3,K3]) Is Nothing Then Exit Sub 'cellules à adapter
Cancel = True
Application.ScreenUpdating = False
If Me.FilterMode Then Me.ShowAllData 'si la feuille est filtrée
With Range(Target, Target(Rows.Count - Target.Row + 1, 2).End(xlUp))
  Set P = .Offset(, 3): .Copy P: Filtrer P, -3, ">0", xlAscending
  Set P = .Offset(, 6): .Copy P: Filtrer P, -6, "<0", xlDescending
End With
End Sub

Sub Filtrer(P As Range, decal%, critere$, sens%)
With P.Offset(1).Columns(2)
  .FormulaR1C1 = "=IF(ISNUMBER(1/(-(""""&RC[" & decal & "])" & critere & ")),RC[" & decal & "],"""")"
  .Value = .Value 'supprime les formules
  P.Sort .Cells, sens, Header:=xlYes 'tri
  Set P = Intersect(P.Offset(1), .SpecialCells(xlCellTypeBlanks).EntireRow)
End With
P.Clear: P.Interior.ColorIndex = 2 'couleur blanche facultative...
End Sub
Fichier (4).

Edit : pour mieux comprendre les formules insérez un End juste avant leur suppression :

Code:
'----
  End
  .Value = .Value 'supprime les formules
A+
 

Pièces jointes

  • Classer plus grosses valeurs negatives et positives(4).xls
    42 KB · Affichages: 77
Dernière édition:

job75

XLDnaute Barbatruc
Re : Classer les plus grosses valeurs negatives,et

Bonjour Guido, CISCO, le forum,

Vous préfèrerez peut-être utiliser l'évènement Change :

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim r As Range, P As Range
Set r = [B3,K3] '1ères cellules des tableaux, à adapter
For Each r In r
  With r.Resize(Rows.Count - r.Row + 1, 2)
    If Not Intersect(Target, .Cells) Is Nothing Then
      Application.ScreenUpdating = False
      If Me.FilterMode Then Me.ShowAllData 'si la feuille est filtrée
      Set P = .Offset(, 3): .Copy P: Filtrer P, -3, ">0", xlAscending
      Set P = .Offset(, 6): .Copy P: Filtrer P, -6, "<0", xlDescending
    End If
  End With
Next
End Sub

Sub Filtrer(P As Range, decal%, critere$, sens%)
Set P = Range(P(1), Cells(Rows.Count, P(1, 2).Column).End(xlUp))
With P.Offset(1).Columns(2)
  .FormulaR1C1 = "=IF(ISNUMBER(1/(-(""""&RC[" & decal & "])" & critere & ")),RC[" & decal & "],"""")"
  .Value = .Value 'supprime les formules
  P.Sort .Cells, sens, Header:=xlYes 'tri
  Set P = Intersect(P.Offset(1), .SpecialCells(xlCellTypeBlanks).EntireRow)
End With
P.Clear: P.Interior.ColorIndex = 2 'couleur blanche facultative...
End Sub
Fichier (5).

A+
 

Pièces jointes

  • Classer plus grosses valeurs negatives et positives(5).xls
    42 KB · Affichages: 75
Dernière édition:

job75

XLDnaute Barbatruc
Re : Classer les plus grosses valeurs negatives,et

J'ai oublié de preciser que la donnée peut atteindre 20 valeurs parfois.

Si chaque tableau a au maximum 21 lignes c'est plus simple :

Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim r As Range, P As Range
Set r = [B3,K3] '1ères cellules des tableaux, à adapter
For Each r In r
  With r.Resize(21, 2) 'taille maximum d'un tableau
    If Not Intersect(Target, .Cells) Is Nothing Then
      Application.ScreenUpdating = False
      If Me.FilterMode Then Me.ShowAllData 'si la feuille est filtrée
      Set P = .Offset(, 3): .Copy P: Filtrer P, -3, ">0", xlAscending
      Set P = .Offset(, 6): .Copy P: Filtrer P, -6, "<0", xlDescending
    End If
  End With
Next
End Sub

Sub Filtrer(P As Range, decal%, critere$, sens%)
With P.Offset(1).Columns(2)
  .FormulaR1C1 = "=IF(ISNUMBER(1/(-(""""&RC[" & decal & "])" & critere & ")),RC[" & decal & "],"""")"
  .Value = .Value 'supprime les formules
  P.Sort .Cells, sens, Header:=xlYes 'tri
  Set P = Intersect(P.Offset(1), .SpecialCells(xlCellTypeBlanks).EntireRow)
End With
P.Clear: P.Interior.ColorIndex = 2 'couleur blanche facultative...
End Sub
Fichier (5 bis).

A+
 

Pièces jointes

  • Classer plus grosses valeurs negatives et positives(5 bis).xls
    37 KB · Affichages: 68

Guido

XLDnaute Accro
Re : Classer les plus grosses valeurs negatives,et

Bonjour job75, CISCO

Merci pour ses propositions

la derniere bloque ,quand je formules 20 possibilités differentes

Je vais poster une nv feuille que job75 connais deja...????

se seras plus simple ,et ca vas m'eviter de faire 9 tableaux...

a de suite

Merci

Guido
 

Guido

XLDnaute Accro
Re : Classer les plus grosses valeurs negatives,et

Bonjour job75, CISCO

Merci pour ses propositions

la derniere bloque ,quand je formules 20 possibilités differentes

Je vais poster une nv feuille que job75 connais deja...????

se seras plus simple ,et ca vas m'eviter de faire 9 tableaux...

a de suite

Merci

Guido

Re

Voici le fichier

Si cela pourrais se faire avec une macro...Merci et un bouton...

Merci

Guido
 

Pièces jointes

  • Classer selon le modele...V1.xls
    97 KB · Affichages: 69

job75

XLDnaute Barbatruc
Re : Classer les plus grosses valeurs negatives,et

Bonjour Guido, le forum,

Pourquoi ne pas avoir donné ce fichier dès le post #1 ? On aurait évité du travail !!!

La macro du bouton :

Code:
Private Sub CommandButton1_Click()
Dim c As Range, i As Variant
Application.ScreenUpdating = False
For Each c In Intersect([B:B], Me.UsedRange.EntireRow)
  If c = "N°" Then
    c.Resize(21, 5).Copy c(1, 9)
    c.Resize(, 5).Copy c(22, 9) '2ème ligne de titres
    With c(1, 9).Resize(22, 5)
      For i = 2 To 21
        If .Cells(i, 5) = 0 Then .Cells(i, 1).Resize(, 5) = "": _
          .Cells(i, 1).Resize(, 5).Interior.ColorIndex = xlNone
      Next
      .Sort .Columns(5), xlAscending, Header:=xlYes '1er tri
      i = Application.Match(0, .Columns(5))
      If IsNumeric(i) Then .Cells(i + 1, 1).Resize(22 - i, 5) _
        .Sort .Columns(5), xlDescending, Header:=xlNo '2ème tri
    End With
  End If
Next
End Sub
Fichier joint.

Bonne journée.
 

Pièces jointes

  • Classer selon le modele(1).xls
    84.5 KB · Affichages: 75

Discussions similaires

Statistiques des forums

Discussions
314 207
Messages
2 107 274
Membres
109 791
dernier inscrit
frederic.perrier@hotmail.