Autres toutes version excel tester le calendar en mode modal et non modal sur range ou control dans userform

patricktoulon

XLDnaute Barbatruc
Bonjour a tous
j'ai pris le temps ce matin de voir un peu ce que je pourrais faire pour mon calendar
en effet il m'est souvent venu des demandes quand au fait que quand l'object appelant et fils d'un userform non modal
et effectivement mon calendar qui est en mode responsif(MODAL)(se comporte comme un msgbox) n'est pas compatible forcement
le conflit d'affichage d'un usf modal par dessus un usf non modal est déclenché
j'ai donc ici recommencé tout a zero (c'est une ébauche)mais il est parfaitement fonctionnel
dites moi ce que vous en pensez
on verra après pour les couleurs et les fériés les langue et region et tout le tointoin
merci pour les retours et suggestion a venir
 

Pièces jointes

  • calendar light.xlsm
    34.4 KB · Affichages: 42
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
bon je sort un peu de mon truc et j'ai regarder le tiens @Dudu2
1° j'ai réduit tes boutons jours_click a un seul (voir en haut de module)classement intra userform


remarque 1° l'annulation est impossible
en effet si je double click sur la cellule elle s'efface donc meme si je ferme avec la croix je retrouve pas ma date initialement présente dans la cellule

remarque n°2
ce redimensionnement selon les ligne valides en fonction des mois et années c'est un peu bof
vaut mieux avoir 42 boutons et changer les captions que de les déplacer c'est lourd


remarque n3°
pourquoi une partie de la mécanique est dans un module ?

je regarde le reste bien que ça semble être juste une pass pass entre control pour incrémenter me semble t il
voilà pour l'instant

ton model avec l'event bouton jour unique
 

Pièces jointes

  • Calendrier Personnalisé dudu2 v (2).xlsm
    50.2 KB · Affichages: 4

Dudu2

XLDnaute Barbatruc
Ok merci pour le bouton unique. C'est sûr que c'est plus condensé mais je ne l'ai pas fait car je ne comprends pas du tout le mécanisme:
VB:
Public WithEvents btj As MSForms.CommandButton
Dim cls(1 To 37) As New UserForm_Calendrier
...
For I = 1 To 37
Set cls(I).btj = Me.Controls("CB_Jour" & I)
Next

Le double-clic qui efface les cellules, c'est du code qui le fait explicitement avant d'afficher le UserForm pour partir en test sur une feuille nettoyée.

Dans le Module y a pas grand chose à part le stockage des paramètres d'appel en variables globales. C'est tout.
Je préfère passer par une fonction avec paramètres que d'appeler directement le UserForm.
 

patricktoulon

XLDnaute Barbatruc
Ok merci pour le bouton unique. C'est sûr que c'est plus condensé mais je ne l'ai pas fait car je ne comprends pas du tout le mécanisme:

tu ferais comment dans un module classe ?
exactement pareil
on instancie le nombre d'instance de classe ici c'est simple le nombre ne change pas et il est connu soit 37 boutons
la boucle entre chaque bouton dans son instance
et l'event unique est déclenche a chaque click sur un des 37 boutons
c'est exactement pareil qu'un module classe
j'ai vu des application.run aussi dans le userform qui run des sub du userform lui meme pourquoi passer par ce chemin ????
 

Dudu2

XLDnaute Barbatruc
Tu as sûrement raison mais cette instruction je ne la comprends pas:
VB:
Dim cls(1 To 37) As New UserForm_Calendrier
Ça veut dire quoi ? On instancie 37 UserForm_Calendrier ?
Et dans chacun d'eux on place un Bouton ?
Code:
For I = 1 To 37
    Set cls(I).btj = Me.Controls("CB_Jour" & I)
Next
Je pige pas.
 

patricktoulon

XLDnaute Barbatruc
non:!!!!
on instancie 37 instances DU MODULE CALENDRIER c'est pas la meme chose c'est pas 37 object form
dans les fonctions des instances le reste du userform est Inonu c'est pour cela que il est nommé explicitement
par exemple dans le btj_click on ne peut pas faire msgbox me.name de meme que dans une classe d'ailleurs me=nothing dans les classe
de la meme manière qu'avec une classe on instancie 37 instance du module classe
contrairement a ce que croient certains c'est bien 37 instances de classe userform_calendrier qui sont instanciées et non 37 userforms

alors oui c'est subtile
il faut garder en memoire que tout ce qui est declenché par une classe ne connait pas le reste du userform
sauf si l'object form lui meme inscrit dans les instances pour un event ou en tant qu'object

je te fait un tout petit model de rien du tout avec 2/3 controls pour t'expliquer si tu veux
 

patricktoulon

XLDnaute Barbatruc
tiens d'ailleurs pour t'en convaincre c'est simple
dans un fichier vierge met un userform met lui autant de controls que tu veux
ne met pas de code
exporte sur ton bureau le userform et ouvre le ".frm" avec bloque note
c'est que du texte ;) et il y a meme pas les controls
l'object form lui est dans le ".frx" c'est un clisd c'est du charabia avec bloque note
quand tu instancie x instances du module userform
tu ne fait pas un show que je sache
ben voilà en fait tu instancie que le module avec ses fonctions et sub si il y a ,tu n'instancie pas le frx

voilà voilà
et pour ceux qui en doute encore ils n'ont cas se rapprocher de la communauté MS
les insider devraient aussi avoir leur réponse;)
 

patricktoulon

XLDnaute Barbatruc
si je voulais instancier x instances de la forme
je ferais comme suit dans un module standard
VB:
Dim uf(1 To 3) As New UserForm1
Sub test()
    For i = 1 To 3
        With uf(i)
            .startupposition = 0
            .Left = 200 * (i - 1)
            .Top = 200
            .Caption = "instance de la forme" & i
            .Show 0
        End With
    Next
End Sub
et oui on fait le show qui n'est pas implémenté dans les event de l'userform c'est réservé a l'application
résultat
demo.gif


voila le show modal ou pas déclenche la mise en mémoire du handle de la fenêtre et bien évidemment son dessin à l’écran la forme existe alors ;)
 

Dudu2

XLDnaute Barbatruc
Ok merci pour ton explication.
Ça fait quand même répliquer 37 fois la classe (hors Forms) en terme de data et de code en mémoire. C'est pas totalement négligeable.

Y a encore un truc qui m'échappe.
Je déclare des variables au niveau de la Classe du UserForm pour conserver des valeurs pendant la durée de vie du UserForm, exemple: Private AnnéeJoursFériés As Long.
Si dans une des 37 instances de la Classe du UserForm sollicitée par un évènement sur son bouton de jour, je valorise cette donnée, sera-t-elle connue des autres instances ? A priori cette donnée est locale à l'instance concernée non ?
 

patricktoulon

XLDnaute Barbatruc
Ça fait quand même répliquer 37 fois la classe (hors Forms) en terme de data et de code en mémoire. C'est pas totalement négligeable.
que crois tu utiliser quant tu fait
exemple 3 boutons dans un userform
Code:
private sub bouton1_click()
end sub

private sub bouton2_click()
end sub

private sub bouton1_click()
end sub
et bien en fait en arriere plant tu utilise ( je dis ça en gros hein ....;)c'est un peu plus complexe que ça en fait et c'est en interne
Code:
public withevents bouton1 as msforms.ommandButton
public withevents bouton2 as msforms.ommandButton
public withevents bouton3 as msforms.ommandButton
' et dans le init interne
set userform1.bouton1=bouton1
set userform1.bouton1=bouton1
set userform1.bouton1=bouton1
bon je te l'accorde c'est vraiment basique comme explication
mais ce qui font des classe en C++ peut être meme en C# comprennent ce que je veux dire

Si dans une des 37 instances de la Classe du UserForm sollicitée par un évènement sur son bouton de jour, je valorise cette donnée, sera-t-elle connue des autres instances ? A priori cette donnée est locale à l'instance concernée non ?
ah... enfin un qui commence a comprendre ça fait plaisir d'entendre les bonnes questions
non!! c'est ce que je disais tout a l'heure quand je parlais de nommer explicitement dans le code
ceci dans le userform
VB:
Private AnnéeJoursFériés As Long.
tu dois le transformer en ceci
en public il sera accessible par toutes les instances
Code:
public AnnéeJoursFériés As Long.
et quand tu la modifie dans les event comme le btj_click ou une fonction ou sub
au lieu de faire comme si tu était dans le userform de base
Code:
AnnéeJoursFériés =2021
tu fait ceci
car la variable toutes les instance ont la leur( de copie) y compris celle de l'userform de base

sauf quand la nommant explicitement par le parent avec le nom du userform tu travaille uniquement avec celle ci dans toutes les instances
Code:
userform_calendrier.AnnéeJoursFériés=2021

et dans les fonction ou sub de l'instance en lecture
Code:
msgbox userform_calendrier.AnnéeJoursFériés



a savoir que par exemple ici btj_click appel une fonction dans le userform
dans la fonction appelée il ne doit pas y avoir de "Me" et tout ce qui peut être propre a l'userform soit tu créer une variable object dans la classe soit tu nomme explicitement un control , une variable par le nomuserform.variable , nomuserform.nomdelobject

en gros quand tu utilise un event ou fonction d'une instance et dans cet event ou fonction tu en appelle une autre (dans le module du userform)tu appelle celle de la meme instance qui ne connais rien des autres( voilà pourquoi il faut explicitement utiliser celle nommée par le parent explicite )
il faut s’entraîner ;)
 

patricktoulon

XLDnaute Barbatruc
tiens regarde cet exemple
teste de chaque cote haut et bas
et ensuite le haut gauche et le bas a droite et vise et versa
LOL
là c'est très simple tu devrais comprendre très vite
 

Pièces jointes

  • exemple classe intra userform pour dudu2.xlsm
    14.3 KB · Affichages: 4

Statistiques des forums

Discussions
312 330
Messages
2 087 337
Membres
103 524
dernier inscrit
Smile1813