Ordonnancement suivant différentes conditions

Bonjour,

Je suis assez nouveau sur ce site et novice en VBA, donc soyez indulgent svp ^^.

Je vais vous expliquer mon problème. Je voudrais grâce à une extraction qui est faite tous les jours trier suivant différents critères et attribuer des machines "Fettes" en fonctions de ces infos.

J'ai écris mes conditions mais :

  • elles bloquent car elles sont trop longues, je voudrais savoir comment faire pour écrire une conditions sur plusieurs lignes,
  • j'aimerais mettre des priorités car les différentes conditions viennent écraser les résultats des conditions précédentes. Individuellement, elle me donne ce que je recherche mais quand elles sont toutes activées, ça ne fonctionne pas.

Puis savoir s'il y a un moyen plus rapide de faire ceci comme par exemple avec des Select Case... chose que je n'ai jamais utilisé et que je ne maîtrise pas du tout.

Cordialement,

U_goffu

PS: Voici mon fichier, la macro se trouve dans le Module 1. Seul l'Userform fette1 et Saisie et Graphique 1 sont fonctionnels pour le moment.

152ordonnacement.xlsm (158.07 Ko)

Bonjour,

Hum... Sans vouloir t'offenser, c'est pas gagné d'avance !

Je n'y comprend pas grand chose dans tes explications.

A quoi servent les feuilles "Fette1, Fette2..." : Le texte des macros laisse à supposer que dans la réalité il y a d'autres Fette...

Le but ultime de tout cela est-il de répartir la BD dans les différentes Fette... ?

Revenons aux fondamentaux :

Diviser pour mieux régner.

Dans le classeur ci joint les différentes conditions sont examinées dans les Sub Cas1(), Cas2(), Cas(3)... qui sont appelées successivement

par la Sub Main()

Pour les tester séparément, il suffit de commenter les cas inutiles (Commenter c'est mettre un quote ( ' ) devant les lignes à inhiber.

Ainsi dans la version d'origine seule Cas1() est testée. Le cas 2 me semble un peu... baclé !

On peut choisir de tester Cas2 en commentant Cas1() et en enlevant le quote devant Cas2()

ou au contraire choisir de les enchaîner successivement en enlevant seulement le quote(') devant Cas2()

On pourrait ainsi examiner séparément tous les Cas() ou les enchaîner si l'on est certain que chaque Cas() est Ok

Dans chaque Cas() la condition est représentée par Y (qui est une variable booléenne) -cf en haut du module le DefBool-

Pour le reste TOUSSA me semble très nébuleux... Qu'est-ce qu'un regroupement ?

Qu'est-ce que Fette longue Série ou une Fette série courte ?

Que signifie : "en dernière position" ?

Que signifie : "mettre à la suite" ?

C'est pas du langage Excel ça : C'est du charabia !

Bref quand chaque cas pris isolément fonctionnera, tu pourras les enchainer.

Les Dim se font dans chaque Sub

C'est un principe couramment admis par la plupart des programmeurs, tu ferais bien de t'y conformer...

Je n'ai fait qu'une exception pour :

Dim Fetten(1 To 7) 

...qui est un tableau initialisé dans la procédure principale.

C'est une vague concession à ta longue suite de déclarations, mais était-ce bien utile ? Je n'en suis pas certain...

Nota : Ne pas confondre mes Sub CasX() avec un Select Case qui dans cette situation ne serait d'aucune utilité !

A+

Merci de t'être penché sur mon cas, je sais que ce n'est pas clair.

Je voudrais que mes différents cas s'appliquent chacun à la suite.

Ainsi, chaque cas va rajouter la machine attitrée. Néanmoins :

- lorsque mon cas n°1 s'applique (il doit s'appliquer en premier, c'est la priorité), il attribue dans la colonne "Fette" la Fette 1

- lorsque mon cas n°2 s'applique juste après le cas n°1, les valeurs "Fette 1" déjà remplies précédemment se font écrasé et sont remplacées par les valeurs de ce cas

- et ainsi de suite pour mes 9 cas. Mais neuf cas sont pas identiques et devraient s'effectuer à la suite pour remplir le maximum de champs dans la colonne Fette.

Du coup j'ai pensé mettre une condition en plus au niveau de mes cas mais je n'arrive pas à trouver la bonne expression :

For i = 2 To derligne

If (Ws1.Cells(i, 17).Value = Empty) And (Val(Cells(i, 6).Value) = 10 Or Val(Cells(i, 6).Value) = 9 Or Val(Cells(i, 6).Value) = 8 Or Val(Cells(i, 3).Value) = "32858-00" Or Val(Cells(i, 3).Value) = "32871-00") Then

Ws1.Cells(i, 17).Value = Fetten1

End If

Next

Merci d'avance.

Bonsoir,

Ta réponse ne m'apporte rien.

Tu ne réponds pas à mes questions ni à mes observations.

Dans ces conditions je ne peux pas passer à la deuxième condition.

Je passe la main à celui qui comprendra...

A+

Désolé, je voulais y aller progressivement car je sais que ce n'est pas facile de comprendre ce que je voudrais. Du coup je voulais décomposer par morceaux pour essayer de faire mieux comprendre. Apparemment ce n'est pas la solution ^^.

Voici les réponses si tu comptes toujours essayer de m'aider.

"A quoi servent les feuilles "Fette1, Fette2..." : Le texte des macros laisse à supposer que dans la réalité il y a d'autres Fette...

Le but ultime de tout cela est-il de répartir la BD dans les différentes Fette... ?"

- Effectivement le but est de distribuer les différentes lignes par Fette donc Fette1 pour l'onglet Fette1, Fette2 pour l'onglet Fette2, etc...

Pour les tester séparément, il suffit de commenter les cas inutiles (Commenter c'est mettre un quote ( ' ) devant les lignes à inhiber.

Ainsi dans la version d'origine seule Cas1() est testée. Le cas 2 me semble un peu... baclé !

On peut choisir de tester Cas2 en commentant Cas1() et en enlevant le quote devant Cas2()

ou au contraire choisir de les enchaîner successivement en enlevant seulement le quote(') devant Cas2()

On pourrait ainsi examiner séparément tous les Cas() ou les enchaîner si l'on est certain que chaque Cas() est Ok

- Comme dit dans mon message précédent, il faudrait enfaîte une succession des cas mais que les valeurs trouvé par les cas précédents ne s'effacent pas. J'ai essayer d’exécuter les cas un par un mais arriver au cas numéro 5 la condition est tellement longue que je ne peux pas l’exécuter.

Le Cas numéro 2 " est absurde" d'après toi, c'est juste que pour tester mes conditions j'ai mis un petit bout de ma base pour vérifier si elle marchait. En réalité, il n'y aura pas autant de similitude.

Pour le reste TOUSSA me semble très nébuleux... Qu'est-ce qu'un regroupement ?

Qu'est-ce que Fette longue Série ou une Fette série courte ?

Que signifie : "en dernière position" ?

Que signifie : "mettre à la suite" ?

- Effectivement, ce n'est pas du langage Excel mais des commentaires qui figuré avec mon explication.

Regroupement : Chaque outils fournis un code article particuliers mais peut être produit en différentes poudres du coup le regroupement consiste à regrouper en PRIORITE les Outils, puis la Poudre et ensuite le Code Article

C'est vrai que je n'ai pas définis mais Fettes dites "série longues" ou "série courtes", ce sont les Fettes qui produiront des séries avec des quantités >=1000 (longues) ou <=1000 (série courtes)

En dernière position, sa consiste à placer la ligne en dernière position étant donné qu'un regroupement n'a pas été possible(position par défaut).

et mettre à la suite c'est placer la ligne en l'intercalant s'il est possible par regroupement donc soit par Outils, poudre ou code article.

En espérant que sa sera plus clair pour toi galopin01 et les autres lecteurs.

Cordialement,

U_goffu

PS : Néanmoins, si vous avez des choses à proposer pour simplifier, ou améliorer, je suis preneur toutes bonnes idées

bonjour,

Pour l'essentiel j'avais donc à peu près compris.

Cependant je ne donnerai pas suite, dans l'ensemble ça me parait trop nébuleux, façon usine à gaz.

Il faudra essayer de formaliser ça dans un langage Excel.

Il faudra probablement aussi dissocier les problèmes de regroupement, de positionnement qui n'ont rien à voir dans les conditions d'attribution des Fette (regroupée ou pas la ligne doit pouvoir être attribuée de la même manière)

Néanmoins je persiste à penser que ma structuration de macro est surement une des clefs de ton problème.

Pour l'expression des conditions au lieu de tout mettre sur la même ligne dans un fouillis illisible inspire toi de ma présentation dans le Cas1 :

      For i = 2 To iA
         Y = WsA.Cells(i, 6) = 10 Or _
             WsA.Cells(i, 6) = 9 Or _
             WsA.Cells(i, 6) = 8 Or _
             WsA.Cells(i, 3) = "32858-00" Or _
             WsA.Cells(i, 3) = "32871-00"
         If Y Then ...

Il est bien plus simple de lire chaque condition par ligne...

Bonne continuation.

A+

Très bien, je te remercie beaucoup, je vais essayer de l'appliquer à mes différents cas .


Par curiosité, quelqu'un pourrait-il m'expliquer pourquoi cette condition ne marche pas? Car c'est la première fois que je m'étais des And et des Or imbriqués dans une condition if. Est ce que c'est parce que je renvois la même cellule "Ws1.Cells(i, 17).Value" ou non?

For i = 2 To derligne

If (Ws1.Cells(i, 17).Value = Empty) And (Val(Cells(i, 6).Value) = 10 Or Val(Cells(i, 6).Value) = 9 Or Val(Cells(i, 6).Value) = 8 Or Val(Cells(i, 3).Value) = "32858-00" Or Val(Cells(i, 3).Value) = "32871-00") Then

Ws1.Cells(i, 17).Value = Fetten1

End If

Next

Rechercher des sujets similaires à "ordonnancement suivant differentes conditions"