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.dtp1

A+

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

9exemple.xlsm (76.44 Ko)

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 Sub

et 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 Sub

PAs 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

Rechercher des sujets similaires à "classes lancement fonction evenement chaine"