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.
Merci d'avance
Bonjour Bidexcel le forum
ton fichier en retour tu l'ouvres tu cliques traiter et tu me redis
a+
Papou
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
Aussi je vois qu'il y a deux boutons, sur lequel je dois cliquer en priorité?
Merci de m'aide STP
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
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
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!
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 Subklin89
Bonjour Bidexcel Klin89
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
NextJ'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
Nextklin89
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
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 SubRevois ces 2 conditions au cas où :
Case Is = "ACHAT"
If dico("Ordre valides")(e)(8) < b(pos, 3) ThenCase Is = "VENTE"
If dico("Ordre valides")(e)(8) > b(pos, 5) Thenklin89
Bonjour Bidexcel le forum
ton fichier en retour avec tes nouvelles conditions
a+
papou
Bonjour Paritec merci infiniment ca marche super bien
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 SubRevois ces 2 conditions au cas où :
Case Is = "ACHAT" If dico("Ordre valides")(e)(8) < b(pos, 3) ThenCase Is = "VENTE" If dico("Ordre valides")(e)(8) > b(pos, 5) Thenklin89
Salut Klin89 merci pour ton code ca marche aussi
Bonjour Bidexcel le forum
voilà modifié un petit oubli pour les dates!!!
a+
Papou