XL 2016 MFC sur plusieurs critères

Lorenzini

XLDnaute Occasionnel
Bonjour,

N'ayant plus de solutions (vu mon niveau limité en vba car j'imagine qu'il va falloir passer par là...), je me tourne vers vous car je patauge.
Dans le petit tableau que j'ai joins à ce message, je souhaiterais que le statut d'une ligne prévale sur le(s) statut(s) d'une/des autre(s) ligne(s) ; je donne qq exemples pour illustrer :

1721845828931.png


En changeant le statut (j'ai fais une MFC) d' "en cours" à "prêt" de la ligne 24 p.ex., je cherche à ce que

- toutes les lignes précédentes du tableau (jusqu'à celles qui avaient le statut "prêt" ; c'est la limite, s'il y'en a) ayant le même n° de chariot (colonne G), prennent le même statut.

Concrètement, si clique dans la cellule K24 pour passer d'"en cours" à "prêt", je cherche à ce que les lignes encadrées en rouge (20 et 12 car n° de chariot identique à la ligne 24) se changent à leur tour en "prêt" (et prennent la même mise en forme, couleur).

Autre exemple (qui ajoute encore en difficultés, comme si ce n'était pas assez compliqué comme çà !) :

1721847182375.png


En changeant le statut "en cours" de la ligne 23, la ligne 18 (qui a le même n° de chariot) se changerait également.

Les difficultés supplémentaires sont que :

1) ici, pour cet exemple, la ligne 10 (qui a aussi un n° de chariot commun) NE DOIT PAS changer car elle a déjà le statut "prêt" !

2) plusieurs de mes collègues seront censés travailler avec ce tableau ; quid si un utilisateur va trop vite et réalise trop tard qu'il a changé le statut d'"en cours" à "prêt" ?
Comment refaire le chemin inverse SANS CHANGER les lignes précédentes qui avaient le même n° de chariot MAIS QUI AVAIT DEJA le statut "prêt" ? (comme la ligne 10)
Il ne faudrait pas qu'en repassant de "prêt" à "en cours", la ligne 10 se change elle aussi de "prêt" à "en cours" !...

Pfff, je ne sais pas si je suis assez clair mais qui que vous soyez, vous aurez déjà été assez courageux d'avoir lu tout ce que j'ai écrit jusqu'ici ! 😁

Je vous avoue très honnêtement que çà fait quelques jours que je creuse... je sors tout juste de m'être cassé la tête d'avoir résolu d'autres choses comme le fait qu'Excel ne me recalcule pas l'heure automatiquement... mais là, je ne sais plus !

Si vous pouviez m'aider, j'apprécierai grandement ! :)
 

Pièces jointes

  • JOKIMIO TEST 3.xlsm
    44.8 KB · Affichages: 6
Solution
pour les les ######## Il faut simplement élargir la colonne
en pj, nouveau fichier avec le message de confirmation plus petit correctif
VB:
Sub MajStatut(pTarget As Range)
Dim Ligne As Long, nbLigRetour As Long
Dim NouveauStatut
Dim MemoDateMaj As Date
Dim Reponse As Integer
Dim Message As String
Dim LigneEnCours As Boolean

    Application.EnableEvents = False
    MemoDateMaj = Now
    NouveauStatut = pTarget.Value
    Ligne = pTarget.Row - ActiveSheet.Range("Tableau3").Row + 1
    If NouveauStatut = "en cours" Then
        ' on compte le nombre de lignes éventuellemnt concernées pour un retour arrière pour éventuellemnt afficher un message
        nbLigRetour = 0
        For i = 1 To Ligne - 1
            ' on compte les lignes...

crocrocro

XLDnaute Impliqué
Bonjour Lorenzini, bonjour TooFatBoy,
comme le fait remarquer TooFatBoy, si on veut revenir en arrière suite à un passage malencontreux du Statut En Cours à Prêt, il faut, pour chaque ligne, stocker la date complète (jj/mm/ssaamm hh:mm:ss) de mise à jour du statut, ce qui pourrait être fait avec une colonne cachée dont les lignes sont mises à jour à chaque changement de statut (de la ligne et des lignes précédentes avec le même n° de chariot).
L'annulation pourrait se faire
- par bouton et / ou combinaison de touches fonction) avec la règle suivante :
Pour toutes les lignes avec le même n° de chariot et la même date, elles passent du statut Prêt à En Cours
OU
- Sur passage, pour une ligne du statut Prêt à En Cours, détecté à partir de l'événement WorkSheet_Change, un message propose d'effectuer cette "annulation" pour toutes les lignes avec le même n° de chariot et la même date.
Message à 3 boutons
1721923848292.png

Oui -> Application du changement à toutes les lignes concernées
Non -> Application du changement uniquement à la ligne courante
Annuler -> Aucune Action

Pour le changement de couleur, je ne suis pas sûr d'avoir compris :
A priori, avec les MFC du fichier tout est géré :
si Statut Prêt Ligne en vert, sinon sans mise en forme
 
Dernière édition:

Lorenzini

XLDnaute Occasionnel
Bonjour,


J'allais dire "peut-être en ajoutant une colonne avec la date et l'heure", mais il y en a déjà une.
Actuellement, c'est l'heure de quoi pour toi ?
Bonjour et merci d'avoir pris la peine de vous pencher sur mon problème...

La colonne "Date et heure" représente le moment ou l'encodage s'effectue ; soit en cliquant sur le bouton jaune en haut à gauche de la feuille, soit en se placant sur la 1ère cellule vide de la colonne B intitulée "ID" qui suit le dernier n° ou dernier encodage.
 

Lorenzini

XLDnaute Occasionnel
Bonjour Lorenzini, bonjour TooFatBoy,
comme le fait remarquer TooFatBoy, si on veut revenir en arrière suite à un passage malencontreux de En Cours à Prêt, il faut, pour chaque ligne, stocker la date complète (jj/mm/ssaamm hh:mm:ss) de mise à jour du statut, ce qui pourrait être fait avec une colonne cachée dont les lignes sont mises à jour à chaque changement de statut (de la ligne et des lignes précédentes avec le même n° de chariot).
L'annulation (bouton et / ou combinaison de touches fonction) se ferait avec la règle suivante :
Pour toutes les lignes avec le même n° de chariot et la même date, elles passent du statut Prêt à En Cours
OU
Si on passe une ligne du statut Prêt à En Cours, un message propose d'effectuer cette "annulation" pour toutes les lignes avec le même n° de chariot et la même date. Message à 3 boutons Annuler (on ne fait rien) Oui (toutes les lignes), Non (seulement la ligne courante).
Pour le changement de couleur, je ne suis pas sûr d'avoir compris :
A priori, avec les MFC du fichier tou est géré :
si Statut Prêt Ligne en vert, sinon sans mise en forme
Bonjour crocrocro :)

Je prends note d'une colonne qui serait cachée...

1721924041524.png
--> j'ignore réellement (avec mon niveau) comment faire concrètement...

C'est çà l'idée : la dernière ligne (= la plus récente par la date) impose son statut aux lignes précédentes qui ont le même n° de chariot (et rien que celle-là) jusqu'à rencontrer une ligne qui avait déjà le même n° de chariot mais qui avait le statut Prêt ; alors, la "recherche" s'arrête.
...
Merci tout de même de vous être penché sur mon problème, mais je ne vois pas comment (concrètement) le résoudre... en tout cas, pour le moment, car je ne lache pas l'affaire. 🤔
 

TooFatBoy

XLDnaute Barbatruc
Merci tout de même de vous être penché sur mon problème, mais je ne vois pas comment (concrètement) le résoudre... en tout cas, pour le moment, car je ne lache pas l'affaire. 🤔
Mais "nous" non plus : comme le dit crocrocro c'était une mise au point, une sorte de cahier des charges, pour savoir si le développement qu'on envisage de faire est compatible et correspond à ce que tu attends, car il est inutile de perdre du temps à te développer un truc si dès le départ ça ne te convient pas. 😉


Je pense sincèrement que tu es entre de bonnes mains avec le camarade crocrocro. 👍
 

Lorenzini

XLDnaute Occasionnel
Mais "nous" non plus : comme le dit crocrocro c'était une mise au point, une sorte de cahier des charges, pour savoir si le développement qu'on envisage de faire est compatible et correspond à ce que tu attends, car il inutile de perdre du temps à te développer un truc si dès le départ ça ne te convient pas. 😉


Je pense sincèrement que tu es entre de bonnes mains avec le camarade crocrocro. 👍
Mais "nous" non plus : comme le dit crocrocro c'était une mise au point, une sorte de cahier des charges, pour savoir si le développement qu'on envisage de faire est compatible et correspond à ce que tu attends, car il est inutile de perdre du temps à te développer un truc si dès le départ ça ne te convient pas. 😉


Je pense sincèrement que tu es entre de bonnes mains avec le camarade crocrocro. 👍
C'est déjà vraiment super de votre part de m'apporter votre aide ; vraiment, j'apprécie ! 👍
 

Lorenzini

XLDnaute Occasionnel
Bonjour Lorenzini, bonjour TooFatBoy,
comme le fait remarquer TooFatBoy, si on veut revenir en arrière suite à un passage malencontreux du Statut En Cours à Prêt, il faut, pour chaque ligne, stocker la date complète (jj/mm/ssaamm hh:mm:ss) de mise à jour du statut, ce qui pourrait être fait avec une colonne cachée dont les lignes sont mises à jour à chaque changement de statut (de la ligne et des lignes précédentes avec le même n° de chariot).
L'annulation pourrait se faire
- par bouton et / ou combinaison de touches fonction) avec la règle suivante :
Pour toutes les lignes avec le même n° de chariot et la même date, elles passent du statut Prêt à En Cours
OU
- Sur passage, pour une ligne du statut Prêt à En Cours, détecté à partir de l'événement WorkSheet_Change, un message propose d'effectuer cette "annulation" pour toutes les lignes avec le même n° de chariot et la même date.
Message à 3 boutons
Regarde la pièce jointe 1200967
Oui -> Application du changement à toutes les lignes concernées
Non -> Application du changement uniquement à la ligne courante
Annuler -> Aucune Action

Pour le changement de couleur, je ne suis pas sûr d'avoir compris :
A priori, avec les MFC du fichier tout est géré :
si Statut Prêt Ligne en vert, sinon sans mise en forme
...j'ai beau creusé mais il y'a une chose qui m'échappe, c'est la suite de ceci (ce qui est surligné en rouge) :

"...si on veut revenir en arrière suite à un passage malencontreux du Statut En Cours à Prêt, il faut, pour chaque ligne, stocker la date complète (jj/mm/ssaamm hh:mm:ss) de mise à jour du statut, ce qui pourrait être fait avec une colonne cachée dont les lignes sont mises à jour à chaque changement de statut (de la ligne et des lignes précédentes avec le même n° de chariot)..."

Comment fait-on le lien entre les lignes ? c'est çà qui me bloque en fait...
Comment on lie ces fameuses lignes entre-elles ? Je ne vois pas.
Par MFC ? , par formule ? , par VBA ? ou une combinaison de l'ensemble ?

J'avais imaginé comme 1ère idée de faire une sorte de boucle dans VBA.
Du genre : for each... next... pour tester les conditions des cellules identiques...
Le problème qui me semble (au-delà de la traduction en VBA vu mon niveau trop faible) est celui-ci :
Cette boucle finirait par être une usine à gaz en ce sens ou, le tableau, étant amené à "gonfler" au fur et à mesure des encodages... faire une boucle sur 10 lignes, OK ; faire une boucle sur 100 lignes, c'est déjà plus long ; sur 1.000, encore plus long, etc, etc, ... Je pensais donc faire une boucle en prenant comme limite précédentes les cellules ayant le statut "prêt"... me disant : comme cela, on ne remonte pas TOUT le tableau mais seulement quelques lignes...
Bon après, ce que je dis me semble cohérent mais peut-être, comment dire ? stupide ? de non-sens pour vous, davantage familiarisé avec Excel et le langage VBA.
Ou peut-être simplement que je m'égare et que mon idée n'est pas la bonne ; qu'une colonne cachée comme ce qui a été proposé serait meilleure ?
Ca me semble être une bonne idée (à laquelle je n'avais pas pensé) mais pareil ; je veux dire, problème pour moi : l'interpréter/le traduire dans Excel... mmh...
Une chose est sûre : je continue de gratter (et je me dis que j'ai vraiment bien fait de revenir sur ce site) car je suis vraiment coincé/à court d'idées ou en tout cas, de traduction de ces idées en langage Excel/VBA...

Je continue de chercher et reste attentif aux solutions proposées pour la suite... 🤔

Merci à vous ! :)
 

crocrocro

XLDnaute Impliqué
Une proposition en pj
je vous laisse tester (après les miens) et si besoin, vous donnerai quelques explications.
Edit : je suis parti avec une validation des règles du post #3, ici sans le message de confirmation
 

Pièces jointes

  • JOKIMIO TEST 3 crocrocro.xlsm
    85.7 KB · Affichages: 2

crocrocro

XLDnaute Impliqué
Cette boucle finirait par être une usine à gaz en ce sens ou, le tableau, étant amené à "gonfler" au fur et à mesure des encodages... faire une boucle sur 10 lignes, OK ; faire une boucle sur 100 lignes, c'est déjà plus long ; sur 1.000, encore plus long, etc, etc, ... Je pensais donc faire une boucle en prenant comme limite précédentes les cellules ayant le statut "prêt"... me disant : comme cela, on ne remonte pas TOUT le tableau mais seulement quelques lignes...
Bon après, ce que je dis me semble cohérent mais peut-être, comment dire ? stupide ? de non-sens pour vous, davantage familiarisé avec Excel et le langage VBA.
D'où l'intérêt d'être clair sur le besoin ...
Non, selon ce que l'on souhaite faire (c'est le cas ici), pas le temps de prendre un café, le temps d'exécuter le traitement pour 10 000 lignes :)
Ne traiter que les lignes précédentes est évidemment plus compliqué (au niveau de code) que de traiter toutes les lignes, c'est ce qui est appliqué dans mon fichier pour le passage au statut Prêt comme pour l'annulation,
NouveauStatut = "prêt"
' on positionne à "prêt" les lignes précédentes qui ont le même chariot
NouveauStatut = "en cours"
' on positionne à "en cours" les lignes précédentes qui ont statut "prêt" et même date maj statut.
Faut-il supprimer la condition précédentes ?
 

Lorenzini

XLDnaute Occasionnel
Waaaaaah ! 🤩🥳😊😃
Chapeau bas !!!
Le code fonctionne et c'est super !
Vraiment merci !!
Les premiers tests sont concluants Je vais me pencher sur le code...
...

Je remarque juste ceci :

Lorsque je fais un nouvel encodage, j'ai des ############### affichés.
...
1721940484153.png

Je suis persuadé que cela vient de mon "chipotage" d'avoir demandé le format des heures avec un "h" comme séparateur...
Range("J1").FormulaR1C1 = "=NOW()"
Range("J1").NumberFormat = "dd/mm/yyyy hh""h""mm" <--- ICI

J'ai une question : est-ce possible que la dernière colonne soit formatée de la même manière (avec un "h" comme séparateur , genre : 22h52...et sans les secondes) ?
Si pas possible, est-ce possible de TOUT formater selon ce format : hh:mm ; genre : 22:52 (sans les secondes) partout dans le tableau pour + de facilités...?

Mais quoi qu'il en soit, je suis admiratif ! 😁👍

MERCI !!
 

Lorenzini

XLDnaute Occasionnel
D'où l'intérêt d'être clair sur le besoin ...
Non, selon ce que l'on souhaite faire (c'est le cas ici), pas le temps de prendre un café, le temps d'exécuter le traitement pour 10 000 lignes :)
Ne traiter que les lignes précédentes est évidemment plus compliqué (au niveau de code) que de traiter toutes les lignes, c'est ce qui est appliqué dans mon fichier pour le passage au statut Prêt comme pour l'annulation,
NouveauStatut = "prêt"
' on positionne à "prêt" les lignes précédentes qui ont le même chariot
NouveauStatut = "en cours"
' on positionne à "en cours" les lignes précédentes qui ont statut "prêt" et même date maj statut.
Faut-il supprimer la condition précédentes ?
je ne suis pas sûr de comprendre le "Faut-il supprimer la condition précédente ?" ...
En tout cas, cela fonctionne ; je vais me pencher sur le code (et voir pour solutionner les ######## en uniformisant les formatages des dates) .

Vraiment Merci ! Merci !!
 

Discussions similaires

Réponses
8
Affichages
215
Réponses
9
Affichages
839
Réponses
6
Affichages
447

Statistiques des forums

Discussions
315 098
Messages
2 116 197
Membres
112 680
dernier inscrit
AKDS