Signaler

Tri de données ni ordre croissant, ni ordre decroissant... [Résolu]

Posez votre question GermPeru 159Messages postés mercredi 7 décembre 2016Date d'inscription 14 novembre 2017 Dernière intervention - Dernière réponse le 14 nov. 2017 à 17:40 par yg_be
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
Utile
+1
plus moins
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
yg_be 3823Messages postés lundi 9 juin 2008Date d'inscription ContributeurStatut 19 novembre 2017 Dernière intervention - 13 nov. 2017 à 21:33
cela serait sans doute plus concret si tu partageais ton code qui construit le tableau sans faire le tri.
Répondre
GermPeru 159Messages postés mercredi 7 décembre 2016Date d'inscription 14 novembre 2017 Dernière intervention - 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
Répondre
GermPeru 159Messages postés mercredi 7 décembre 2016Date d'inscription 14 novembre 2017 Dernière intervention - 13 nov. 2017 à 20:49
Ps: partager le fichier ne vaut pas trop le coup car je fais des requetes au serveur pour construire mes graphiques, je vais essayer de faire un fichier avec des données factices pour exemple. Donne moi 15 min.

Merci
Répondre
GermPeru 159Messages postés mercredi 7 décembre 2016Date d'inscription 14 novembre 2017 Dernière intervention - 13 nov. 2017 à 21:07
http://www.cjoint.com/c/GKnugbT08B8

en feuille 1 mon tablea et en feuille 2 le résultat que je souhaite obtenir, cela me parrait pas si compliqué mais je n´y suis pas arrivé...
Répondre
GermPeru 159Messages postés mercredi 7 décembre 2016Date d'inscription 14 novembre 2017 Dernière intervention - 13 nov. 2017 à 21:18
http://www.cjoint.com/c/GKnuqQiYl68

Le lien ci-dessus ne fonctionnait pas, j´avais enregistré le fichier xlsm, qui ne marchait pas du coup en xls...
Répondre
Donnez votre avis
Utile
+0
plus moins
je voulais voir le code "construire un autre tableau a partir de ce premier tableau", pour pouvoir l'adapter avec le tri.
GermPeru 159Messages postés mercredi 7 décembre 2016Date d'inscription 14 novembre 2017 Dernière intervention - 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
Répondre
GermPeru 159Messages postés mercredi 7 décembre 2016Date d'inscription 14 novembre 2017 Dernière intervention - 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
Répondre
GermPeru 159Messages postés mercredi 7 décembre 2016Date d'inscription 14 novembre 2017 Dernière intervention - 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
Répondre
yg_be 3823Messages postés lundi 9 juin 2008Date d'inscription ContributeurStatut 19 novembre 2017 Dernière intervention - 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
Répondre
Donnez votre avis

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !