Macro de TRI avec des conditions

Bonjour à tous et bonne fête du travail anticipé à vous

Je viens solliciter votre aide pour la réalisation d'un macro de tri avec des conditionna lités les détails sont insérer dans le fichier Excel joint.

24ordres.xlsx (30.98 Ko)

Merci d'avance

Bonjour Bidexcel le forum

ton fichier en retour tu l'ouvres tu cliques traiter et tu me redis

a+

Papou

16bidexcel-v1.xlsm (47.53 Ko)

Bonjour Papou merci pour ton grand aide, j'ai testé la macro mais pour certaines lignes il ne respecte pas la condition, j'ai mis en couleur rouge un exemple dans le fichier. J'ai ajouté d'autres titres au niveau des limites j’espère que la correspondance des noms au niveau du carnet (première feuille) et des limites (deuxième feuille) pourra se faire . C'est tous les titres en fait que j'ai mis au niveau des limites.

Aussi je vois qu'il y a deux boutons, sur lequel je dois cliquer en priorité?

Merci de m'aide STP

19papou.xlsm (68.46 Ko)

Bonjour Bidexcel le forum

bon alors moi je sais lire et il est écrit dans le fichier que tu as fourni en premier

Pour les "ventes" il verifira plutot la borne supérieure, il faudra dans ce cas que le cours soit supérieure ou égale à la borne supérieure

Alors le cours dans la ligne est de 7200 et la borne supérieure dans la feuille limite est de 6450

Donc tu réclames et tu dis que cela ne fonctionne pas, mais c'est exactement ce que tu as écrit cours supérieur ou égal à la borne supérieure.

A moins qu'en Cote D'Ivoire 7200 soit plus petit que 6450????

Pour les ajouts de lignes, si il n'y a pas de doublons dans la feuille limite, et que les noms sont écrits de la même manière cela devrait fonctionner parfaitement

par contre dans la feuille CORIS_Carnet.... Palm Côte D'ivoire est écrit comme cela et dans la feuille limite PALM COTE D'IVOIRE!!!!!!!

si dans ton fichier c'est un coup blanc un coup noir ????

a+

Papou

Bonjour Bidexcel le forum

Je ne sais pas quel est votre métier mais franchement !!!!

Vous avez ajouté des lignes OK, mais les ^ sur les o de Côte d'Ivoire vous ne savez pas les mettre????

De plus vous dites la macro ne fais pas etc etc, mais qui a ajouté une colonne dans la feuille limite??

Franchement vous pensez que les macros savent que vous ne savez pas travailler?

Vous fournissez des fichiers et vous changez tout sans même le dire c'est au gens qui ont envie de vous aider de chercher!!!

bref

a+

papou

Re Bonjour Bidexcel le forum

Ton fichier en retour avec des messages box d'information à la fin

Mais franchement il y a des lignes avec des BOA de tous les pays et dans la feuille Limite il n'y a pas de correspondances BOA aucune lignes !!!!!!!!

En clair je ne sais pas si c'est pour jouer le fichier, mais si c'est pour travailler, il va falloir revoir toutes les lignes lors d'ajout futur, car moi j'ai modifié toutes les lignes, mais si l'orthographe ne correspond pas entre la colonne E de coris.... et la colonne B de Limite cela ne marchera pas

la V3 à tester

le fichier pourrait être 100 fois plus rapide s' il n'y avait plus de couleur dans les feuilles de récupération ordre valide et ordre non valide

a+

Papou

15bidexcel-v3.xlsm (57.33 Ko)

Bonjour Bidexcel le forum

bon alors moi je sais lire et il est écrit dans le fichier que tu as fourni en premier

Pour les "ventes" il verifira plutot la borne supérieure, il faudra dans ce cas que le cours soit supérieure ou égale à la borne supérieure

Alors le cours dans la ligne est de 7200 et la borne supérieure dans la feuille limite est de 6450

Donc tu réclames et tu dis que cela ne fonctionne pas, mais c'est exactement ce que tu as écrit cours supérieur ou égal à la borne supérieure.

A moins qu'en Cote D'Ivoire 7200 soit plus petit que 6450????

Pour les ajouts de lignes, si il n'y a pas de doublons dans la feuille limite, et que les noms sont écrits de la même manière cela devrait fonctionner parfaitement

par contre dans la feuille CORIS_Carnet.... Palm Côte D'ivoire est écrit comme cela et dans la feuille limite PALM COTE D'IVOIRE!!!!!!!

si dans ton fichier c'est un coup blanc un coup noir ????

a+

Papou

Bonjour Papou je suis désolé vraiment d'avoir gaffer j'ai totalement mélanger tout, c'est vrai que la ligne en rouge respecte bien ce que j'ai dit au début. Tu as raison excuse moi .En effet pour les ventes c'est bien le plafond (le max) la borne supérieure et pour les achats c'est le prix minimum. Les limites c'est juste l'interval de prix sur lequel les achats et ventes s'effectueront; un prix proposé en dehors cet inter val ne passera pas.

J'ai eu a ajouter des lignes excuse moi aussi mais je croyais t'avoir dit dans le message dessolé. je tire les données de deux logiciels différents pour les cours (dans les limites) et pour le carnet, et dans c'est deux logiciels, l'orthographe n'est pas le même, voila pourquoi il y a des difficultés pour la correspondance colonne E (feuille Coris) et B (Feuille limite). Sinon en effet BOA c'est" bank of africa" en entier.

Pour résoudre le soucis on pourrait aller sur la base des symboles (colonne A Feuille Limite) pour la correspondance, car l'orthographe ne différera pas dans les deux logiciels. Pour ce faire je t’enverrais un autre fichier incluant les symboles à côté dans la feuille Coris.

Dessolé pour le désagrément mon cher Papou

A tout à l'heure pour le fichier Merci!

Re Bidexcel le forum

le fichier 100 fois plus rapide

a+

papou

12bidexcel-v4.xlsm (70.48 Ko)

Re Bidexcel le forum

le fichier 100 fois plus rapide

a+

papou

16bidexcel-v4.xlsm (70.48 Ko)

Bonsoir paritec, bidexcel

Comme le souligne paritec, il faut que l'on puisse comparer les libellés de la feuille source avec ceux de la feuille "Limite"

A tester

Option Explicit
Sub test()
Dim a, b, i As Long, pos, e, dico As Object
    Set dico = CreateObject("Scripting.Dictionary")
    '2 clés dans le dictionnaire parent
    Set dico("Ordre valides") = CreateObject("Scripting.Dictionary")
    Set dico("Ordres non valides") = CreateObject("Scripting.Dictionary")
    'feuille source en 1ere position ds le classeur
    a = Sheets(1).Range("a9").CurrentRegion.Value
    For i = 2 To UBound(a, 1)
        dico("Ordre valides")(i) = Application.Index(a, i, 0)
    Next
    'feuille limite en 2eme position ds le classeur
    b = Sheets(2).Range("a1").CurrentRegion.Value
    For Each e In dico("Ordre valides").keys
        pos = Application.Match(dico("Ordre valides")(e)(5), Application.Index(b, 0, 2), 0)
        If Not IsError(pos) Then
            Select Case dico("Ordre valides")(e)(4)
                Case Is = "ACHAT"
                    If dico("Ordre valides")(e)(7) < b(pos, 2) Then
                        dico("Ordres non valides")(e) = dico("Ordre valides")(e)
                        dico("Ordre valides").Remove e
                    End If
                Case Is = "VENTE"
                    If dico("Ordre valides")(e)(7) < b(pos, 4) Then
                        dico("Ordres non valides")(e) = dico("Ordre valides")(e)
                        dico("Ordre valides").Remove e
                    End If
            End Select
        Else
            'on supprime la ligne si le libellé ne figure pas en feuille "Limite"
            dico("Ordre valides").Remove e
        End If
    Next
    For Each e In dico.keys
        With Sheets(e).Range("a1").CurrentRegion
            With .Offset(1)
                .Resize(, 14).ClearContents
                If dico(e).Count > 0 Then
                    .Resize(UBound(Application.Index(dico(e).items(), 0, 0), 1), UBound(Application.Index(dico(e).items(), 0, 0), 2)) = _
                    Application.Index(dico(e).items(), 0, 0)
                End If
            End With
        End With
    Next
    Set dico = Nothing
End Sub

klin89

Bonjour Bidexcel Klin89 le forum

Avec ta macro et le fichier original transmis par Bidexcel, ta macro aurait retournée que quelques lignes.

Par contre moi qui utilisait les dico, uniquement pour créer des listes sans doublons, là je tombe par terre.

J'ai modifié et j'ai rajouté une ligne Dico "Lignes Non Copiées" et les trois tableaux sont parfait.

Je n'ai pas encore compris l'indexation, mais j'y retourne, car l'utilisation du dico de cette manière est une pure merveille

merci Klin89

Quand on aura le fichier avec les bonnes ref à comparer ce sera une affaire entendu

a+

Papou

Re Bonjour Bidexcel le forum

Quand on aura le fichier avec les bonnes ref à comparer ce sera une affaire entendu

a+

Papou

Re

Ci-dessous, le code produisait un bug lorsque le tableau restitué ne comportait qu'une seule ligne

For Each e In dico.keys
    With Sheets(e).Range("a1").CurrentRegion
        With .Offset(1)
            .Resize(, 14).ClearContents
            If dico(e).Count > 0 Then
                .Resize(UBound(Application.Index(dico(e).items(), 0, 0), 1), _
                        UBound(Application.Index(dico(e).items(), 0, 0), 2)).Value = _
                        Application.Index(dico(e).items(), 0, 0)
            End If
        End With
    End With
Next

J'ai modifié ainsi

For Each e In dico.keys
    With Sheets(e).Range("a1").CurrentRegion
        With .Offset(1)
            .Resize(, 14).ClearContents
            If dico(e).Count > 0 Then
                If UBound(Application.Transpose(Application.Index(dico(e).items(), 0, 0)), 2) = 1 Then
                    .Resize(1, UBound(Application.Index(dico(e).items(), 0, 0))).Value = _
                    Application.Index(dico(e).items(), 0, 0)
                Else
                    .Resize(UBound(Application.Index(dico(e).items(), 0, 0), 1), _
                            UBound(Application.Index(dico(e).items(), 0, 0), 2)).Value = _
                            Application.Index(dico(e).items(), 0, 0)
                End If
            End If
        End With
    End With
Next

klin89

Re Bidexcel le forum

le fichier 100 fois plus rapide

a+

papou

Bonjour à tous j'espère que vous aviez passer un bon weekend,

comme promis j'ai intégré une colonne symbole dans la feuille carnet d'ordre, cela rendra facile la correspondance des titres dans la feuille limite.

Pour la réglé de validité de l'ordre, pour les achats le cours doit être au minimum égal à la borne inférieure de la limite sans dépasser la borne supérieure[/u], et pour les ventes le cours doit être au maximum égal a la borne supérieure sans être inférieure à la borne inférieure.

Pour résumer aucun prix ne doit être en dehors de l'interval sinon l'ordre n'est pas valide

Merci de m'aider mes amis

Bon début de semaine à tous !

Bonjour Bidexcel le forum

bon est bien on va faire les modifs et te retourner ton fichier

a+

papou

Bonjour Bidexcel le forum

ton fichier en retour avec tes nouvelles conditions

a+

papou

12bidexcel-v6.xlsm (69.81 Ko)

re bidexcel

Les lignes d'en-têtes des feuilles cible sont aussi à modifier

A tester :

Option Explicit
Sub test()
Dim a, b, i As Long, pos, e, dico As Object
    Set dico = CreateObject("Scripting.Dictionary")
    dico.CompareMode = 1
    '2 clés dans le dictionnaire parent
    Set dico("Ordre valides") = CreateObject("Scripting.Dictionary")
    Set dico("Ordres non valides") = CreateObject("Scripting.Dictionary")
    'feuille source en 1ere position ds le classeur
    a = Sheets(1).Range("a9").CurrentRegion.Value
    'feuille limite en 2eme position ds le classeur
    b = Sheets(2).Range("a1").CurrentRegion.Value
    For i = 2 To UBound(a, 1)
        dico("Ordre valides")(i) = Application.Index(a, i, 0)
    Next
    For Each e In dico("Ordre valides").keys
        pos = Application.Match(dico("Ordre valides")(e)(5), Application.Index(b, 0, 1), 0)
        If Not IsError(pos) Then
            Select Case UCase(dico("Ordre valides")(e)(4))
                Case Is = "ACHAT"
                    If dico("Ordre valides")(e)(8) < b(pos, 3) Then
                        dico("Ordres non valides")(e) = dico("Ordre valides")(e)
                        dico("Ordre valides").Remove e
                    End If
                Case Is = "VENTE"
                    If dico("Ordre valides")(e)(8) > b(pos, 5) Then
                        dico("Ordres non valides")(e) = dico("Ordre valides")(e)
                        dico("Ordre valides").Remove e
                    End If
            End Select
        Else
            'on supprime la ligne si le libellé ne figure pas en feuille "Limite"
            dico("Ordre valides").Remove e
        End If
    Next
    For Each e In dico.keys
        With Sheets(e).Range("a1").CurrentRegion
            With .Offset(1)
                .ClearContents
                If dico(e).Count > 0 Then
                    If UBound(Application.Transpose(Application.Index(dico(e).items(), 0, 0)), 2) = 1 Then
                        .Resize(1, UBound(Application.Index(dico(e).items(), 0, 0))).FormulaLocal = _
                        Application.Index(dico(e).items(), 0, 0)
                    Else
                        .Resize(UBound(Application.Index(dico(e).items(), 0, 0), 1), _
                                UBound(Application.Index(dico(e).items(), 0, 0), 2)).FormulaLocal = _
                                Application.Index(dico(e).items(), 0, 0)
                    End If
                End If
            End With
        End With
    Next
    Set dico = Nothing
End Sub

Revois ces 2 conditions au cas où :

Case Is = "ACHAT"
        If dico("Ordre valides")(e)(8) < b(pos, 3) Then
Case Is = "VENTE"
        If dico("Ordre valides")(e)(8) > b(pos, 5) Then

klin89

Bonjour Bidexcel le forum

ton fichier en retour avec tes nouvelles conditions

a+

papou

Bonjour Paritec merci infiniment ca marche super bien , juste in petit detail pas bien grave, quand il copie le format des dates change sur les feuilles ordres valides et ordre non vamodes, le format est différent du format d'origine.

Cordialement

re bidexcel

Les lignes d'en-têtes des feuilles cible sont aussi à modifier

A tester :

Option Explicit
Sub test()
Dim a, b, i As Long, pos, e, dico As Object
    Set dico = CreateObject("Scripting.Dictionary")
    dico.CompareMode = 1
    '2 clés dans le dictionnaire parent
    Set dico("Ordre valides") = CreateObject("Scripting.Dictionary")
    Set dico("Ordres non valides") = CreateObject("Scripting.Dictionary")
    'feuille source en 1ere position ds le classeur
    a = Sheets(1).Range("a9").CurrentRegion.Value
    'feuille limite en 2eme position ds le classeur
    b = Sheets(2).Range("a1").CurrentRegion.Value
    For i = 2 To UBound(a, 1)
        dico("Ordre valides")(i) = Application.Index(a, i, 0)
    Next
    For Each e In dico("Ordre valides").keys
        pos = Application.Match(dico("Ordre valides")(e)(5), Application.Index(b, 0, 1), 0)
        If Not IsError(pos) Then
            Select Case UCase(dico("Ordre valides")(e)(4))
                Case Is = "ACHAT"
                    If dico("Ordre valides")(e)(8) < b(pos, 3) Then
                        dico("Ordres non valides")(e) = dico("Ordre valides")(e)
                        dico("Ordre valides").Remove e
                    End If
                Case Is = "VENTE"
                    If dico("Ordre valides")(e)(8) > b(pos, 5) Then
                        dico("Ordres non valides")(e) = dico("Ordre valides")(e)
                        dico("Ordre valides").Remove e
                    End If
            End Select
        Else
            'on supprime la ligne si le libellé ne figure pas en feuille "Limite"
            dico("Ordre valides").Remove e
        End If
    Next
    For Each e In dico.keys
        With Sheets(e).Range("a1").CurrentRegion
            With .Offset(1)
                .ClearContents
                If dico(e).Count > 0 Then
                    If UBound(Application.Transpose(Application.Index(dico(e).items(), 0, 0)), 2) = 1 Then
                        .Resize(1, UBound(Application.Index(dico(e).items(), 0, 0))).FormulaLocal = _
                        Application.Index(dico(e).items(), 0, 0)
                    Else
                        .Resize(UBound(Application.Index(dico(e).items(), 0, 0), 1), _
                                UBound(Application.Index(dico(e).items(), 0, 0), 2)).FormulaLocal = _
                                Application.Index(dico(e).items(), 0, 0)
                    End If
                End If
            End With
        End With
    Next
    Set dico = Nothing
End Sub

Revois ces 2 conditions au cas où :

Case Is = "ACHAT"
        If dico("Ordre valides")(e)(8) < b(pos, 3) Then
Case Is = "VENTE"
        If dico("Ordre valides")(e)(8) > b(pos, 5) Then

klin89

Salut Klin89 merci pour ton code ca marche aussi

Bonjour Bidexcel le forum

voilà modifié un petit oubli pour les dates!!!

a+

Papou

17bidexcel-v8.xlsm (75.77 Ko)
Rechercher des sujets similaires à "macro tri conditions"