(difficile) VBA : syntaxe sélection case avec condition

Bonjour à tous,

Désolé pour ce titre de rubrique peu affordant.

"Le but est d'effectuer des calculs très simples (additions) en fonction de la valeur d'une case"

Synoptique lettré de la démarche souhaitée :

1) Dans la feuille nommée "Tri"

2) On a un numéro d'anomalie (ici 1), pour chaque anomalie.

3) A chaque ligne correspond une anomalie (attention cela peut être la même anomalie que l'anomalie N-1, notamment si la colonne "Anomalie terminée" n'est pas "oui".

4) On a plusieurs colonnes regroupant diverses informations, et entres autres, "QT triée" et "Qt rebuts".

5) Ce que je n'arrive pas à programmer : faire la sommes de toutes les quantités pour un même numéro d'anomalie quand celle-ci est dite terminée.

6) L'anomalie est dite terminée quand la colonne "Anomalie terminée" comprend un "oui".

7) Se rendre dans la feuille nommée "TV poste de tri".

8) Un bouton vert foncé "Sortie" est disponible tout en haut dans le bandeau vert pâle.

9) Cliquer dessus, un Userform nommé "F_Sortie_tri" s'ouvre. Cet Userform est de couleur vert pomme.

10) L'action de mettre un "oui" ou "non" dans la colonne "Anomalie terminée" est déterminée par le fait de cocher la case.

11) Si on ne coche pas la case, on met "non" dans la colonne "anomalie terminée".

12) Si on coche la case :

  • on met oui dans la case de la colonne "anomalie terminée" (colonne J).
  • on fait la somme de toutes les cases "Temps de tri", "QT triée" et "QT rebuts" pour un même numéro d'anomalie (colonne A "N° d'anomalie").

13) par la suite, je voudrais prendre ces données des 3 cases pour remplacer les cases correspondantes dans la feuille "BDD". (je sais faire).

Nota : j'ai crée ce fichier avec mes connaissances personnelles, et des bouts de codes récupérés sur les forums. La syntaxe est terrible.

J'espère être assez clair, malheureusement mes compétences en explications et en programmation sont faibles...

J'ai classé cette discussion en "difficile" car le fichier est assez gros, même si pour un professionnel de programmation c'est super simple.

Merci de votre attention et bonne journée !

Bonjour,

5) Ce que je n'arrive pas à programmer : faire la sommes de toutes les quantités pour un même numéro d'anomalie quand celle-ci est dite terminée.

Tu pourrais passer par un somme.si.ens qui s'afficherait dans un tableau récap des types d'anomalies, exemple dans image :

sommsiens

je regarde tes autres questions.

cdt

Salut Audebois !

C'est impossible !

Les données enregistrées ici compose l'historique de notre îlot "Tri".

Cela veut dire que le tableau va grossir grossir (il est vidé annuellement : 40 000 lignes au minimum)

Si l'on programme avec une fonction sur le tableau excel, le calcul va finir par être très lourd et nos ordinateurs sont peu performants.

En outre, programmer en VBA semble plus efficient :

Une même anomalie ne dure pas très longtemps (entre 1 jour et 5 jours pour les cas normaux [un cas extraordinaire serait une durée de 1 mois]), donc c'est moins éprouvant de chercher le même numéro d'anomalie sur cette petite période de temps.

Donc programmer en VBA pour que, lorsque je clique sur la case à cocher de mon Userform ""F_sortie_Tri", l'outil prend en compte toutes les lignes de mon tableau dans la geuille Excel "Tri" qui ont le même n° d'anomalie que l'anomalie en cours. Et ensuit, il faut additionner les valeurs et remplacer cette nouvelle valeurs dans certaines cases de ma feuille Excel "BDD".

C'est complexe à expliquer mais simple à programmer je pense.

Merci de ton aide Audebois ^^"


Attention Audebois, j'ai mal expliqué et ce que tu penses avoir compris sur ta photo dans ton premier post ci-dessus est faux. Excuse-moi. Permets-moi d'ajouter une image affordante.

Voici une image explicite je pense :

explications

Bonsoir,

ci-jointe proposition de comptage

Bonjour, tout d'abord, un truc qui m'a extrêmement énervé : j'écris un message et quand je l'envoie cela me marque "déconnecté" j'ai donc perdu le contenu de mon long message.

Sinon, salut thev, merci beaucoup de ta réponse, c'est gentil d'avoir pris du temps pour me répondre.

Malheureusement, la solution que tu propose ne correspond pas à mes attentes :/

Je cherche une syntaxe VBA

1) Rechercher dans la colonne A toutes les lignes qui ont comme n° d'anomalie le n° d'anomalie cité dans mon Userform (si actuellement j'ai terminé mon tri sur l'anomalie 1, dans mon Userform "F_Sortie_Tri", je coche la case "Anomalie terminée", donc il faut rechercher toutes les lignes qui ont un 1 dans n° d'anomalie).

2) Pour toutes les lignes sélectionnées (dans mon exemple, lignes 5,6 et 7) je fais la sommes des colonnes "Temps de tri", "QT triée" et "QT rebuts"

et c'est tout ^^"

est-ce que ce que je te propose dans le fichier joint (c'est un début, j'ai testé que sur les valeurs "QT triée") ressemble à ce que tu recherches?

Bonjour,

Ta question manque de précision : où met-on les résultats ?

De plus, il paraît difficilement rationnel d'avoir à remonter 40000 lignes pour une même anomalie ! Des critères plus judicieux devraient permettre plus d'efficacité.

On en aurait d'ailleurs eu plus en n'éclatant pas en trois Userforms quand un seul peut remplir les fonctions demandées...

Il serait bon aussi de saisir les heures en valeurs horaires...

(Egalement, si le code était écrit avec plus de soin, les contrôles renommés, etc. etc. ce serait un tantinet plus agréable !)

Cordialement.

Bonjour Audebois, merci beaucoup pour ta réponse et d'avoir pris du temps pour programmer ce bouton.

Malheureu....Oh, là ça fonctionne.

Edit : attention, tu t'es trompé(e) de colonne dans ton mini tableau (c'est QT triée et non pas temps de tri mais aucune importance).

du coup, je vais supprimer ce bouton, mais le code est adapté, je vais l'implanter dans ma condition "Si checkbox1 est cochée" de mon Userform "F_Sortir_Tri".

Ainsi, ce que fait ta macro, mon userform le fera aussi si je coche ma case, du moins en théorie.

Ce matin, j'essaie de comprendre le code que tu m'a proposé, puis j'essaie d'appliquer la macro dans l'userform pour voir si ça marche.

Je uploaderai le fichier amélioré sur ce topic ensuite.

à tout à l'heure, et merci Audebois.

EDIT :

En fait, le soucis de ton code, c'est que tu as prédéfini un cadre. Or, je vais rajouter des lignes, et le cadre restera le même donc ça ne vas pas marcher.


Bonjour Mr Ferrand, comment allez-vous ?

1) Les résultats, je vais les mettre dans la feuille 'BDD".

2) En effet, j'ai peur que faire mouliner Excel via la recherche sur 40 000 lignes ça prenne du temps (ps : j'avais vu sur une page de ce site une fonction VBA qui passait le temps de recherche de 30s à 0.4s [de mémoire])

Une anomalie peut être éclatée au minimum sur 1 ligne, mais peut se répercuter sur plusieurs lignes, par exemple 3 lignes. Selon mon expérience et l'historique de notre îlot, les plus grosses anomalies de types "tri" devraient prendre 20 lignes et la moyenne serait 1 ligne.

3) L'outil Excel n'est pas optimisé pour le moment, mais je pense que ces 3 Formulaires sont requis :

On a plusieurs stade

Stade 1 : on entre des données dans notre outil (on a détecté une anomalie) et donc on propose une estimation du coût de non qualité.

Stade 2 : SI notre "Décision Qualité" était de faire du "tri", l'userform F_sortie_Tri est obligatoire pour mettre a jour l'estimation du coût de non Qualité car là on indique le vrai temps de tri, et on ajoute des rebuts au temps de tri, donc le Coût change.

Le 3 ème Userform est utile pour les cas où l'on est en attente de décision.

Donc en résumé, un seul Userform, cela me semble pas adapté à la problématique, mais je me trompe peut être car je suis novice dans le domaine de programmation VBA.

4) Oui, il faut convertir les valeur en valeur numériques pour le calcul : 1h00 = 1; 1h30 = 1.5 etc

5) Le code est très mal écrit, en effet, je vous demande mes excuses...

Je vais tenter un autre approche :

Traduire ceci en VBA fonctionnel :

[...]

If CKB_anomalie_terminee.value = true then

Range (A").select

For each Range (A1:A65 0000") = TB_num_anomalie

Temps_tri.value = sommes column ("G")

QT_triee.value = sommes column ("H")

QT_rebuts.value = sommes colums "I")

sheet("BDD").select

Cells (J, 20) = Temps_tri.value

Cells (J, 21) =QT_triee.value

Cells (J, 22) =QT_rebuts.value

[...]

C'est juste la partie de code en bleu que je n'arrive pas à traduire !

explications detaillees

Kureyna,

je te propose le fichier v2.

les résultats s'affichent dans le tableau résultat provisoire de l'onglet Tri;

la macro peut tout à fait être modifier pour afficher les résultats dans l'onglet BDD.

Quelques observations :

  • je persiste à penser qu'il serait plus pratique que tes données de l'onglet Tri soient dans un format Tableau (comme c'est le cas dans l'onglet BDD), sachant qu'un tableau peut être facilement redimensionné.
  • Veiller à ce que les colonnes de l'onglet Tri soient au bon format (numérique pour les chiffres, date pour le temps, etc)

je continue à tester différentes choses, je reviens vers toi quand j'aurais du nouveau.

EDIT : insertion fichier v2

Merci beaucoup je regarde tout cela Audebois.

Nota : je ne trouve pas le fichier version v2 ?

Bonjour,

J'ai peut-être mal compris mais pourquoi pas un TCD avec un segment ?

Ca sera beaucoup plus rapide que n'importe quel code vba.

Eventuellement juste ajouter le rafraichissement du TCD à l'activation de la feuille en vba.

eric

Audebois :

merci pour ta réponse!

Cependant, je n'ai pas compris la différence avec le tableau précédent. Certes maintenant les 3 colonnes sont prises en compte, et cela marche bien (malgré l'anomalie 1 qui ne s'affiche pas)

Si je créer un tableau, est ce que la sélection de cellule va s'agrandir en fonction de la taille du tableau?

Bonjour eriiic,

Merci pour votre réponse, le TCD fonctionne bien.

Cependant ce n'est pas ce que je recherche. Le tableau que je remplis est un historique, et le TDC est éphémère, lui.

(à titre indicatif, les données seront archivées 5 ans)

Avez-vous réussi à traduire le bout de syntaxe que j'avais écrit dans un précédent poste, en bleu?

Je pense qu'il serait plus simple de coder ce petit morceau que j'imbriquerai directement dans le code VBA.

Merci à tous pour vos réponses

Comment aurait-on pu le deviner ?

Et bien il suffit de regarder si l'ano est présente dans l'historique et de l'ajouter si besoin. Ca restera nettement plus rapide à mon avis.

Vous avez certainement raison, mais je n'arrive pas à le faire.

Un exemple.

Pas sûr que ce soit ce que tu veux, tu verras.

eric

Hello Kureyna,

regarde le fichier v4 joint.

Je rappelle que mes connaissances en vba étant succinctes, le code que je propose peut certainement être amélioré : mieux écrit, plus propre, plus pro...

Quelques observations sur les modifs que j'ai apportées:

  • toutes les cellules contenant des nombres (colonnes A, H,I onglet Tri) doivent être au format numérique
  • Pour calculer des heures, il faut que les cellules concernées soit au bon format. J'ai donc modifié les formats :
      de la colonne O (onglet Macro) Temps_tri
    • de la ComboBox3 (pas pu le mettre au format 1H00, ça bug pour les calculs)
  • la macro sera à modifier pour le calcul du temps de tri si celui-ci peut être supérieur à 24h
  • il faudra modifier le code si un même n° d’anomalie peut apparaître plusieurs fois dans BDD et et qu’il ne faut pas écraser les données existantes
  • pour les tests, les données de « Tri » sont copiées dans « BDD », colonnes T, U et V

Bonjour à eriiic et à Audebois,

Merci pour vos éléments de réponse.

J'essaie de trouver du temps pour étudier tout ça et vous recontacte.

Bonne journée

Rechercher des sujets similaires à "difficile vba syntaxe selection case condition"