Tri de données ni ordre croissant, ni ordre decroissant...

Résolu/Fermé
GermPeru
Messages postés
172
Date d'inscription
mercredi 7 décembre 2016
Statut
Membre
Dernière intervention
27 mars 2018
- Modifié le 13 nov. 2017 à 18:46
yg_be
Messages postés
19275
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 mai 2022
- 14 nov. 2017 à 17:40
Bonjour,

J´ai des tables qui me permettent de construire des graphiques de facon dynamique sur Excel grace a VBA.

Maintenant je voudrais construire d´autre tables et ordonnées les valeures selon leur categorie, valeur de 1 a 4, mais dans lórdre 2-3-1-4...

J´ai bien essayé de bidouiller des trucs... mais rien de concluant, un peiti coup de main serait le bien venu,

Merci d´avance

2 réponses

yg_be
Messages postés
19275
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 mai 2022
1 102
13 nov. 2017 à 19:26
bonsoir, moi je ferais ainsi: écrire une petite fonction VBA qui retourne 3, 1, 2, 4 quand la valeur en entrée est 1, 2, 3 ou 4.
puis utiliser cette fonction, par exemple dans une colonne supplémentaire, et ensuite utiliser cette colonne comme source de tri.
exemple:
Function gptri(nb As Integer) As Integer
'retourne 3, 1, 2, 4 quand la valeur en entrée est 1, 2, 3 ou 4
Select Case nb
    Case 1
        gptri = 3
    Case 2
        gptri = 1
    Case 3
        gptri = 2
    Case 4
        gptri = 4
    Case Else
        gptri = 99
End Select
End Function
1
GermPeru
Messages postés
172
Date d'inscription
mercredi 7 décembre 2016
Statut
Membre
Dernière intervention
27 mars 2018

13 nov. 2017 à 20:07
Bonsoir yg_be,

Je n´ai pas trop saisi ta réponse, c´est pas la premiere fois tu me diras....

J´ai un premier tableau avec n lignes et dans ma 3 ieme colone j´ai la valeure 1,2,3 ou 4.

Je souhaite contruire un autre tableau a partir de ce premier tableau et que les valeur soit ordonnées de la facon suivante: 2-3-1-4.

Je ne saisi pas comment faire ma boucle sur mes n lignes de mon premier tableau et construire mon segond.

Merci d´avance de ta réponse
0
yg_be
Messages postés
19275
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 mai 2022
1 102 > GermPeru
Messages postés
172
Date d'inscription
mercredi 7 décembre 2016
Statut
Membre
Dernière intervention
27 mars 2018

13 nov. 2017 à 20:32
eh bien, je propose de mettre dans la quatrième colonne une formule telle que =gptri(C1), après avoir enregistré le code VBA dans une module du fichier.
et ensuite de trier sur la quatrième colonne.
si tu partages ton fichier ou donnes plus d'infos, la suggestion sera peut-être différente.
0
GermPeru
Messages postés
172
Date d'inscription
mercredi 7 décembre 2016
Statut
Membre
Dernière intervention
27 mars 2018
> yg_be
Messages postés
19275
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 mai 2022

13 nov. 2017 à 20:43
Ok,

exemple mon tableau 1:
ligne 1- colone 3: 4
ligne 2- colone 3: 3
ligne 3- colone 3: 2
ligne 4- colone 3: 1

Et en vba je souhaite construire mon tableau 2 avec les lignes rangées en fonction de la valeur de ma colonne 3, par vba et non le faire manuelement.

tableau 2:
ligne 1- colone x: 2
ligne 2- colone x: 3
ligne 3- colone x: 1
ligne 4- colone x: 4

dsl si j´ai mal compris ta réponse.

Merci yg_be
0
yg_be
Messages postés
19275
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 mai 2022
1 102 > GermPeru
Messages postés
172
Date d'inscription
mercredi 7 décembre 2016
Statut
Membre
Dernière intervention
27 mars 2018

13 nov. 2017 à 21:33
cela serait sans doute plus concret si tu partageais ton code qui construit le tableau sans faire le tri.
0
GermPeru
Messages postés
172
Date d'inscription
mercredi 7 décembre 2016
Statut
Membre
Dernière intervention
27 mars 2018
> yg_be
Messages postés
19275
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 mai 2022

13 nov. 2017 à 21:43
Le code pour determiner les categorires

Function BorneCat()
Dim Wsh As Worksheet, Wsi As Worksheet
Dim V As Variant, V2 As Variant, P() As Variant, R() As Variant, Ligne&, NbLi&, i&, j&, Bi As Byte, DemiP#, DemiR#
Dim iGG%, iGM%, iGP%, iMG%, iMM%, iO%, intDL, iLi%, iB%
Const NF As String = "GG¤GM¤GP¤MG¤MM¤O¤B"
Const NF2 As String = "MC GG¤MC GM¤MC GP¤MC MG¤MC MM¤MC Otros¤MC Beta"
    V = Split(NF, "¤"): V2 = Split(NF2, "¤")
    For Bi = 0 To UBound(V)
        Ligne = 2
        Set Wsh = ThisWorkbook.Worksheets(V(Bi))
        Set Wsi = ThisWorkbook.Worksheets(V2(Bi))
        With Wsh
        NbLi = Application.WorksheetFunction.CountA(.Range("A:A"))
        ReDim P(NbLi): ReDim R(NbLi)
        If V(Bi) = "B" Then
        For i = 1 To NbLi: P(i) = .Range("A" & i + 1).Value: R(i) = .Range("B" & i + 1): Next
        Else
        For i = 1 To NbLi: P(i) = .Range("B" & i + 1).Value: R(i) = .Range("C" & i + 1): Next
        End If
        DemiP = Application.WorksheetFunction.Max(Array(P())) / 2: DemiR = Application.WorksheetFunction.Max(Array(R())) / 2
        For j = Ligne To NbLi
            If .Range("B" & j) >= DemiP And .Range("C" & j) >= DemiR Then
            If V(Bi) = "B" Then .Range("E" & j) = 2 Else .Range("F" & j) = 2
            ElseIf .Range("B" & j) >= DemiP And .Range("C" & j) < DemiR Then
            If V(Bi) = "B" Then .Range("E" & j) = 1 Else .Range("F" & j) = 1
            ElseIf .Range("B" & j) < DemiP And .Range("C" & j) >= DemiR Then
            If V(Bi) = "B" Then .Range("E" & j) = 3 Else .Range("F" & j) = 3
            Else
            If V(Bi) = "B" Then .Range("E" & j) = 4 Else .Range("F" & j) = 4
            End If
        Next j
        End With
    Next Bi
End Function


Maintenant je cherche a exporter seulement une partie des donner et les ordonner en fonction de la valeur de la categorie
0
yg_be
Messages postés
19275
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 mai 2022
1 102
13 nov. 2017 à 22:16
je voulais voir le code "construire un autre tableau a partir de ce premier tableau", pour pouvoir l'adapter avec le tri.
0
GermPeru
Messages postés
172
Date d'inscription
mercredi 7 décembre 2016
Statut
Membre
Dernière intervention
27 mars 2018

13 nov. 2017 à 22:27
Dsl,

Je n´ai pas encore fait ma boucle pcq je ne sais pas comment procéder au tri...enfin une boucle ou j´efface les valeurs de mes tables mais pas d´importation de mes données...

 For Bi = 0 To UBound(V)
        Set Wsh = ThisWorkbook.Worksheets(V(Bi))
        Set Wsi = ThisWorkbook.Worksheets(V2(Bi))
        With Wsh
            If V2(Bi) = "MC GG" Then
            If .Range("A2") <> "" Then Range("TMCGG").EntireRow.Delete
'code de ma feuille V(Bi) a ma feuille V2(Bi)
            ElseIf V2(Bi) = "MC GM" Then
            If .Range("A2") <> "" Then Range("TMCGM").EntireRow.Delete
            ElseIf V2(Bi) = "MC MG" Then
            If .Range("A2") <> "" Then Range("TMCGP").EntireRow.Delete
            ElseIf V2(Bi) = "MC MG" Then
            If .Range("A2") <> "" Then Range("TMCMG").EntireRow.Delete
            ElseIf V2(Bi) = "MC MM" Then
            If .Range("A2") <> "" Then Range("TMCMM").EntireRow.Delete
            ElseIf V2(Bi) = "MC Otros" Then
            If .Range("A2") <> "" Then Range("TMCO").EntireRow.Delete
            ElseIf V2(Bi) = "MC Beta" Then
            If .Range("A2") <> "" Then Range("TMCBeta").EntireRow.Delete
            End If
        End With
    Next Bi
0
GermPeru
Messages postés
172
Date d'inscription
mercredi 7 décembre 2016
Statut
Membre
Dernière intervention
27 mars 2018

13 nov. 2017 à 23:25
Je ne demande pas un code tout fait mais je solicite des pistes de recherches... pcq je galere depuis un petit moment maintenant....

Merci yg_be
0
GermPeru
Messages postés
172
Date d'inscription
mercredi 7 décembre 2016
Statut
Membre
Dernière intervention
27 mars 2018

14 nov. 2017 à 15:08
 With Wsh
NbLi = Application.WorksheetFunction.CountA(.Range("A:A")): ReDim DatosTemp(3, NbLi): j = 1
For Ligne = 1 To 4
For i = 2 To NbLi
If .Range("F" & i).Value = 2 And Ligne = 1 Then
DatosTemp(1, j) = .Range("D" & i).Value
DatosTemp(2, j) = .Range("E" & i).Value
DatosTemp(3, j) = .Range("F" & i).Value
j = j + 1
ElseIf .Range("F" & i).Value = 3 And Ligne = 2 Then
DatosTemp(1, j) = .Range("D" & i).Value
DatosTemp(2, j) = .Range("E" & i).Value
DatosTemp(3, j) = .Range("F" & i).Value
j = j + 1
ElseIf .Range("F" & i).Value = 1 And Ligne = 3 Then
DatosTemp(1, j) = .Range("D" & i).Value
DatosTemp(2, j) = .Range("E" & i).Value
DatosTemp(3, j) = .Range("F" & i).Value
j = j + 1
ElseIf .Range("F" & i).Value = 4 And Ligne = 4 Then
DatosTemp(1, j) = .Range("D" & i).Value
DatosTemp(2, j) = .Range("E" & i).Value
DatosTemp(3, j) = .Range("F" & i).Value
j = j + 1
End If
Next i
Next Ligne
ReDim Datos(1 To j - 1, 1 To 3)
For iLi = 1 To j - 1
For iCol = 1 To 3
Datos(iLi, iCol) = DatosTemp(iCol, iLi)
Next iCol
Next iLi
End With


3 boucles, table temporaire, 2 variants, et 4 conditions ca le fait... Mais pcq j´ai que 4 valeur de catégories a ranger, si j´avais eu plus ceci ne conviendrait pas.

Je reste attentif a tout commentaire qui pourrait m´aider a progresser. Merci d´avance
0
yg_be
Messages postés
19275
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
17 mai 2022
1 102 > GermPeru
Messages postés
172
Date d'inscription
mercredi 7 décembre 2016
Statut
Membre
Dernière intervention
27 mars 2018

14 nov. 2017 à 17:40
bonjour,
moi je ferais plus simple:
1) je mettrais dans le tableau de destination toutes les données, avec une colonne en plus que je remplirais avec la fonction gptri.
2) je trierais le tableau en fonction de la dernière colonne
3) je supprimerais la dernière colonne
0