Autres [Résolu]un seul evenement control gerant x controles identiques SANS MODULE CLASSE

patricktoulon

XLDnaute Barbatruc
bonjour a tous
dranreb propose un calendrier conçu dans un userform
et utilise un mappage "withevents" dans un userform
je ne comprends pas bien comment il fait sans instancier de classe avec un seul "withevents" dans le userform
si quelqu'un sait un petit exemple simplifié serait le bien venu
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
oui c'est une sorte de boucle mais l'UC n'est pas surchargé car en fait la boucle se fait en interne avec le on_update
je sais pas si tu est allé voir les gif dans Cjoin ton calendrier oscille entre 25% et 81% au repos avec cette méthode c'est insignifiant
je t'en cherche d'autre ;)
le mien est quasiment fini il me manque le calcul de certain jour férié canadien
 

Roland_M

XLDnaute Barbatruc
Bonjour,

c'est Dranreb qui m'avait filé cette astuce, boucle withevents, pour éviter un module de classe !
j'ai gardé les deux méthodes, celle de Dranreb et celle où je répète les 31 Sub des boutons(c'est pas gênant non plus, je les crée automatiquement)

pour la démonstration ci-joint mon calendrier autonome avec la méthode Dranreb(boucle withevents) et userform modal, fermeture après saisie
ça fonctionne parfaitement !
c'est vrai que c'est plus gourmand, mais franchement le temps de saisir une date, ça va quoi, je ne vois pas où est le problème !?

EDIT: Par contre "voilà une classe sans classe " de Patrick je vais y regarder car ça m'intéresse !

RE-EDIT: je viens d'essayer et ça fonctionne bien ! je trouve ça génial !
le problème c'est comme tu dis (Patrick):
'dans cet evenement tout les controls qui n'auraient pas été mappé doivent etre precedé de leur parent jusqu'au userform(ex:fmSTD_Calendrier.frame1.textbox2)

je ne me vois pas renommer tous les contrôles de mon calendrier, ça risque d'être laborieux !
 

Pièces jointes

  • CalendrierAutonome_RolM_VA_AvecToggleBout.xlsm
    88.7 KB · Affichages: 25
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re Bonjour a tous les deux
roland chez moi aussi le model de danreb fonctionne très bien mais il est plus que gourmand après ca semble pas gêner plus que ca dranreb

perso je pense que pour un controls puisque c'est ca et seulement ca (un control calendrier) c'est un peu gros

je m'en suis aperçu quand je l'ai testé sur le pc portable c'est un petit hp a 450€ autant te dire que j'ai 4 giga de mémoire et 500 Giga de disque et un W10 taillé a la serpette et bien il souffre j'ai même eu un white screen pendant quelque secondes
mon pc fixe ca le chatouille c'est normal c'est un gamer et est équipé en conséquence mais je vois bien le compteur(gadget windows) aiguille crève le plafond et revient a moitié de temps en temps

perso moi ça me préoccupe un control qui pompe plus que l'application elle même

tandis qu'une classe même dans le userform contrairement a ce que crois dranreb ne mémorise pas x userform mais x map de l'userform , c'est différent et ça reste fixe et ça pèse deux cacahuètes

les classes c'est fait justement pour ça autant les utiliser surtout que la c'est juste les conditions : 42 jetons qui exécutent la même chose ,2 combo et spinbutton

l'avantage ben quand tu fait rien ou meme quand tu le charge l' encéphalogramme est plat ;)

après il fonctionne très bien j'ai rien a dire

sauriez vous ou je peut trouver les formules pour calculer certains jour fériés canadien?
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
je reviens sur ce qu'a dit dranreb
Je ne vais quand même pas charger 31 exemplaires de tout le calendrier juste pour que chacun me traite un seul de ses boutons de jour !
l'exemple que j'ai donné prouve irréfutablement que ca ne mémorise pas x userforms mais bien des maps des controls
sinon dans la sub label1 serait reconnu sans qu'on soit obligé de préciser le parent puisque (je le rappelle)tout est dans l'userform
 

Roland_M

XLDnaute Barbatruc
re

je reviens sur "une classe sans classe"
j'ai essayé en rajoutant ex:fmSTD_Calendrier.frame1.textbox2 . . .

mais il y a un problème sérieux concernant les variables
j'ai deux dates déclarées
CalDateDEBUT As Date, CalDateFIN As Date
elles sont initialisées dans Activate et gardent bien entendu ces valeurs tout le temps de l'utilisation du calendrier
et j'en ai d'autres ainsi nécessaire au calendrier.

quand je sélectionne un jour sur le calendrier, j'ai un plantage !?
je me suis rendu compte que mes variables perdaient leurs valeurs ! donc valeur 0 date "00:00:00"
ça m'a l'air chaotique !? c'est bien dommage !

EDIT: c'est le cas pour toutes les variables initialisées au début et utiles au calendrier !
toutes remises à zéro ! ça peut pas aller !
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
demo d'utilisation de la classe avec mon model
mon code commence comme ca
apres cela tout les bouton sont gérés par Private Sub bout_Click()
VB:
Option Explicit

Public region As Variant    'region 0,1,2
Public Result As Variant    ' ou date ou ancienne date ou rien
Dim posLeft As Long, posTop As Long, Obj As Object
Public Oldvalue
Public WithEvents Bout As MSForms.Label    'map pour 42 bouton
Private clavier(43) As New calendar    'tableau d'instance de l'userform



Private Sub UserForm_Activate()
    Dim I&
    config
    If TypeName(Obj) = "Range" Then placementRange Obj Else placementUF Obj
    Oldvalue = Obj.Value
    ldate = IIf(region > 0, "Aujourd'hui", "Todays is") & vbCrLf & IIf(region = 0, Format(Date, "mm/dd/yyyy"), IIf(region = 1, Date, Format(Date, "yyyy-mm-dd")))
    Me.Caption = IIf(region = 0, "Calendar", "Calendrier")

    'mappage pour evenement unique (42 boutons) (intra userform sans module classe)
    For I = 1 To 42: Set clavier(I).Bout = Me.Controls("j" & I): Next

End Sub

'evenement unique pour 42 boutons
Private Sub bout_Click(): putDate Bout: End Sub
Public Sub putDate(ByVal q As Object)
    Dim Forme
    Forme = Switch(calendar.region = 0, "mm/dd/yyyy", calendar.region = 1, "dd/mm/yyyy", calendar.region = 2, "yyyy-mm-dd")
    If TypeName(Obj) = "Range" Then
        calendar.Result = CDate(DateSerial(calendar.Cbyear.Value, calendar.Cbmonth.ListIndex + 1, q.Caption))
    Else
        calendar.Result = Format(DateSerial(calendar.Cbyear.Value, calendar.Cbmonth.ListIndex + 1, q.Caption), Forme)
    End If
    calendar.Hide
End Sub
demo
demo3.gif


ça n'a rien de chaotique si tu maîtrise les modules classe pour Control il ne devrait pas y avoir de soucis
alors oui en effet le fait d'appeler le userform par la méthode dranreb fait que certaine variable ou Control ne se réinitialise pas l'ors du prochain apel
c'est pour ça que je décharge le userform en externe sur l’événement du control appelant ou range

mais pour être honnête plus ça va plus je constate que cette méthode n'apporte que des inconvénients aussi séduisante soit elle
problème pour décharger sur userform appelant modal
problème de décharge variables
problème de décharge Control(les combos)
etc..etc...
bref
avec mon ancienne méthode
Code:
with calendar
   set .obj=target'ou le control textbox
   .result=target.value
   .show
   target.value=.result
   unload calendar
end with
et ça s’arrête la pas de code dans le userform ni de variable autre a mémoriser etc....etc.....
d'ailleurs cette méthode c'est pas moi qui l'ai inventé ,elle fait l'objet d'un tutoriel très complet sur DVP
je trouve plus le lien c'est dommage
elle repose finalement que sur un principe ,c'est le mode modal qui fait que :tant que le userform n'est pas hide ça fait rien
ça boucle pas
ça mémorise rien a part result
ça pompe rien
et c'est exactement le comportement de certaines boites de dialogue que tu a certainement déjà utilisé
 

Roland_M

XLDnaute Barbatruc
re

j'ai bien compris ! pas de soucis avec les contrôles !
mais on a besoin de certaines conditions, de mini maxi selon les besoins
mon calendrier sert à l'entreprise de mon fils et j'ai besoin de ces tests
sinon comment je fais sans ça:
Private CalDateDEBUT As Date, CalDateFIN As Date, CalDateSELECT As Date
Private CalBaseAnneeMini%, CalBaseAnneeMaxi%, CalPremANNEE%, CalDernANNEE%, I%, J%, M%
Private PositionUserf$, DateSelectUser As Variant, UserformActif As Boolean
Private PosUserfAppelTop@, PosUserfAppelLeft@, AnneeNVM% '#NVM# Util_Roland_M

ta proposition ne pourrait pas malheureusement m'être utile !
mon calendrier est un calendrier personnalisé !
toi tu proposes un calendrier simple sans paramètres perso.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Bonjour.
Ce que je ne comprends pas bien c'est pourquoi tu as besoin de gérer ça dans le calendrier, puisque lui ne permet toujours de saisir qu'une seule date à un instant donné. Alors ce me semblerait du ressort de procédures extérieures à lui.
 

Roland_M

XLDnaute Barbatruc
Bonjour Dranreb

effectivement comme on fait avec une boîte de dialogue style Calendar ou autres
mais au départ ce calendrier je l'ai créé avec plusieurs classeurs à mon ancienne entreprise, mon fils aujourd'hui,
puis j'ai pensé le récupérer pour en faire un autonome c'est pour ça que je l'adapte afin qu'il soit toujours compatible !

mais je vais revoir pour en faire un autre sur cette même base mais débarrassé de ces obligations !
 

patricktoulon

XLDnaute Barbatruc
re
bien que finalement ca ne concerne pas le sujet de cette discussion roland je te répond rien ne t’empêche: avec la méthode de dranreb ou la mienne de garder des paramètres variables ou autre en mémoire
tu dis pas de parametre perso dans mon calendrier
moi je te dis que je gère les formats US,FR,CA sans sourciller sur range ou msforms.control avec une variable "region"

après on parle de quoi d'une application planning ou d'un pseudo control calendrier
un calendrier tu l'ouvre ,tu choisi une date,il se ferme et tu dispose de son RETURN
une date de debut et de fin ca se fait sur 2 élémentS distinct (2 textboxs,2cellules)

je vois mal cliquer sur une cellule choisir 2 date et que ça retranscrive sur deux éléments (range ou control)

quand tu veux changer l'une ou l'autre tu change les deux??? :p

mais la on pollue la discussion avec ce qui n'a rien a voir avec le titre c'est dommage dans l'autre je pourrais même plus vous dire ou aller chercher la solution de dranreb ou la mienne et dans celle ci on est en train de faire pareil
ouvrons une discussion propre au problème , on s'y retrouvera certainement mieux (ainsi que :et surtout) les autres lecteurs qui viendraient chercher une réponse
 

Roland_M

XLDnaute Barbatruc
re

oui Patrick, sur le fond tu as raison, mais si tu veux ce calendrier était personnalisé, c'est pour ça.

par exemple dans un classeur particulier l'utilisateur ne pouvait pas pouvoir choisir une autre date que l'année du classeur
car ce sont des classeurs de données classés par année, par exemple 2018 et pas autre chose
pour moi c'était plus simple de bloquer les limites plutôt que laisser choisir n'importe quoi et en sortie afficher un message pour qu'il recommence
pareil avec date mini et maxi il faut bien passer les valeurs
pareil avec date déb et fin il faut bien passer les valeurs

Si Lionel voit le message ça va le faire rire, il sait pourquoi !
je lui dis souvent de laisser un peu de liberté aux utilisateurs mais ici il s'agit des valeurs acceptables.
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
bonjour Arthour
@Roland
juste deux variable limite c'est tout
et pourquoi pas dans ton contexte supprimer les combo années et coder l'année en dur tout simplement

je suis en train de chercher le truc pour la perte de mémoire entre la sub de lancement (méthode dranreb) et la sortie
surtout que !!!!!!!!!!!
en fait il perd pas la mémoire on l'a simplement lors de l'affichage suivant

j'ai essayé le showX en sub,function,property get
rien y fait
mais ca je le répète c'est une autre discussion que j'ouvre tout de suite
 

Statistiques des forums

Discussions
311 725
Messages
2 081 947
Membres
101 849
dernier inscrit
florentMIG