Classes : lancement de fonction d'évènement en chaine
Bonjour,
(désolé pas de fichier en exemple car je ne peux rien télécharger)
Le problème est assez simple en soit :
Dans un userform, je créé par une classe plein de champs textbox/combobox/DTPicker
Tous ces champs appartienne donc à leur collection respective afin de n'avoir qu'une seul fonction pour chacun des type de champs créés.
Mon problème est sur le lancement en chaine des fonctions respective de ces champs.
Exemple avec3 champs:
DTPicker 1
DTPicker 2
DTPicker 3
Lorsque je change le DTPicker 1 je check la date et modifie le DTPicker2 si elle est supérieur. (je simplifie le code volontairement)
Sub Groupdtp1_Change()
'si changement du dtp1 alors
if userform.Controls("dtp" & 2).Value < userform.Controls("dtp" & 1).Value then
userform.Controls("dtp" & 2).Value = userform.Controls("dtp" & 1).Value
end if J'ai la même fonction pour le DTPicker 2 qui influe sur le DTP3.
Sub Groupdtp2_Change()
'si changement du dtp2 alors
if userform.Controls("dtp" & 3).Value < userform.Controls("dtp" & 2).Value then
userform.Controls("dtp" & 3).Value = userform.Controls("dtp" & 2).Value
end if Mon problème vient de l'enchainement. J'aurai cru qu'avec ces deux fonctions, si changement de DTP1 qui modifie le DTP2 alors elle appelle automatiquement l'évnnt changement du DTP2 pour modifier le DTP3 (et ainsi de suite si j'ai plus de DTP)
Or ce n'est pas le cas. la fonction de changement de DTP1 fait un aller simple et n'appelle pas l'event de changment de DTP2 même si je change sa valeur.
Normal ?
Y'a t'il une solution pour appeler le second event ? ajouter une ligne qui lance l'event ?
Merci d'avance pour votre aide!!!!
Florian
Bonjour Florian
A part si le fichier dépasse un certain poids et que vous vous trompez de bouton,
Je ne vois pas pourquoi vous ne pourriez pas le déposer
Des DTPicker je n'en n'utilise plus depuis des années, depuis que je suis passé à Office 64 bits
Mais je ne comprends pas cet évènement "Groupdtp1_Change()"
alors que vos contrôles se nomment à priori "dtp1", "dtp2", "dtp3"
De plus totalement inutile de mettre
userform.Controls("dtp" & 1)tout simplement
userform.Controls("dtp1")Ou encore plus simple
Me.dtp1A+
Bonjour Bruno !
Alors effectivement j'ai ete surement trop succint dans la description de mon probleme.
chaque dtpicker est en fait créer via un autre bouton via une classe. Donc chaque dtp appartient à une collection qui lui est propre afin de pouvoir associé a chaque type de dtpicker une fonction. Il peut ainsi avoir une infinité de dtp.
En réalité c'est pour réalisé des périodes qui ne de chevauche pas.
J'ai donc deux type de dtpicker qui sont les dtp_début et les dtp_fin.
en admettant que l'utilisateur veut mettre deux période il a ajouter donc via le bouton d'ajout un dtp_debut et un dtp_fin dans leur classe respective.
Afin de ne pas les chevaucher, c'est la variable j qui contrôle leur nombre et ainsi leur nom. D'où en réalité le nom qui est ==> "dtp_deb" & j et dtp_fin & j
et donc dtpdeb1 ne doit pas être supérieur à dtpfin1 qui ne doit pas être supérieur a dtpdeb2 qui ne doit pas être supérieur à dtpfin2 etc etc etc pour tout les dtp créé via le bouton.
comme ils appartiennent à une classe c'est donc via l'evenement de groupdtpdeb_change() et groupdtpfin_change() que les fonctions sont appelées. (Avec en entete de classe Public WithEvents groupdtpdeb As MSComCtl2.DTPicker)
l'idée étant toujours l'enchaînement des événements l'un appelant le second etc etc..
si dtpicker est obsolète je suis aussi curieux de savoir qu'est ce qui le remplace et cela resoudra peut etre mon probleme ! 🫠
merci pour ton aide en tout cas !
Bonjour,
Sans aucun fichier je n'irais pas plus loin et je ne serais pas le seul, navré
Les DTPicker je les ai remplacés par Textbox + USF Calendrier de Patrick Toulon (aujourd'hui)
https://www.excel-pratique.com/fr/telechargements/calendriers/calendrier-all-windows-no518
Hello Bruno,
J'ai fais quelques manip pour contourner mes blocage et upload ce fichier d'exemple.
dans le fichier il n'y a rien pour l'instant à part l'userform avec le bouton d'ajout de 'périodes' et les DTPicker avec leur fonction dans le module de classe.
En espérant que tu y vois plus clair.
Merci pour le lien, j'y regarderai plus en détail pour voir si ça peut m'aider.
Bonne journée,
Florian
alors finalement j'ai trouvé une solution en appelant des fonction dans des modules qui du coup eux me permettent de faire une boucle récursives sur mes DTPicker.
Donc cela ressemble à ça :
Dans le module de classe :
'fonction de modification de la date de début
Sub Groupdtpdeb_Change()
j = Groupdtpdeb.Tag
Call modifdatedeb(j)
End Sub
'fonction de modification de la date de fin
Sub Groupdtpfin_Change()
j = Groupdtpfin.Tag
Call modifdatefin(j)
End Subet dans le module :
Sub modifdatedeb(j)
If ajouter_ressource_projet.Controls("dtpdeb" & j).Value > ajouter_ressource_projet.Controls("dtpfin" & j).Value Then
ajouter_ressource_projet.Controls("dtpfin" & j).Value = ajouter_ressource_projet.Controls("dtpdeb" & j).Value
End If
Call modifdatefin(j)
End Sub
Sub modifdatefin(j)
maxj = Collectdtpdeb.Count
If maxj > Int(j) Then
If ajouter_ressource_projet.Controls("dtpdeb" & j + 1).Value < ajouter_ressource_projet.Controls("dtpfin" & j).Value Then
ajouter_ressource_projet.Controls("dtpdeb" & j + 1).Value = ajouter_ressource_projet.Controls("dtpfin" & j).Value
Call modifdatedeb(j + 1) 'récurssivité pour modifier la période suivant si la date est supérieure
End If
End If
End SubPAs sur que ça soit le mieux mais ça fonctionne ! N'hésite pas si tu vois plus simple ou plus optimisé à faire !
Un grand merci pour ton aide en tout cas :)
Florian