XL 2019 Remplir plusieurs labels d'un Useform avec les dates d'un calendrier automatique

Clemee61

XLDnaute Junior
Bonjour,
J'ai un fichier Excel dans lequel j'ai crée une fiche d'inscription. Lorsqu'une personne se présente elle donne ses coordonnées que je rempli dans des texteBox et j'ai besoin de mettre une date d'arrivée et de départ. J'ai mis un calendrier automatique qui fonctionne car j'ai repris le travail d'un internaute mais sans le maitriser. J'essai de faire appel à ce même calendrier pour remplir d'autre case (en jaune dans ma fiche). Je ne m'en sors pas.
J'ai essayé de repartir d'autres exemples trouvés sur le forum mais rien y fait. Je suis bloqué depuis une semaine.
Quelqu'un peut-il m'aider ?
Je joins mon fichier avec tout le code (c'est un peu une usine à gaz mais j'ai mis en jaune "pétant" les cases incriminées !)
Cordialement,
Cédric
 

Pièces jointes

  • Inscriptions 2023 H.xlsm
    442.9 KB · Affichages: 31

vgendron

XLDnaute Barbatruc
Hello

avec un autre calendrier issu de ce forum et créé par PatrickToulon (le calendrier est dispo dans les ressources du forum)

je n'ai pas fait la modif pour tous les texbox du formulaire, il y en a un peu partout et c'est pas facile de se retrouver dans le code
 

Pièces jointes

  • Inscriptions 2023 H.xlsm
    477.9 KB · Affichages: 3

patricktoulon

XLDnaute Barbatruc
bonsoir
j'ai ajouté le calendar
j'ai tagué "date" dans le (controltiptex puisque le tag était utilisé ) des textbox
regardez ce que j'ai ajouté comme code dans le userform ficheInscription
les 5 textbox date fonctionnent au click droite
j'ai placé la totalité du code ajouté en haut de module userform ficheinscription
 

Pièces jointes

  • Inscriptions 2023 H.xlsm
    478.4 KB · Affichages: 7

vgendron

XLDnaute Barbatruc
Hello Patrick

j'ai également vu que les tag étaient "remplis" par du 27 ou 5.. mais je n'ai trouvé aucune utilisation de ce tag dans le code global: aurais je manqué quelque chose??
du coup.. j'ai remplacé les tag....
 

vgendron

XLDnaute Barbatruc
Ce que j'ai commencé à faire
en utilisant un module de classe pour tous les controles de saisies des dates, monétaires et autres numériques

en cliquant gauche dans un textbox de date, il faut taper la date
en cliquant droite dans un textbox de date, le calendrier s'affiche directement
==> mais dans ce cas, le calendrier s'ouvre deux fois... je n'ai pas encore compris pourquoi

j'ai fait un gros travail de mise en forme du code pour revoir toute l'indentation.. sinon. on ne s'y retrouve pas
20 modules avec une macro chacun.. c'est dur..
surtout quand plusieurs macros se ressemblent comme deux gouttes d'eau==> autant les rassembler et nommer le module correctement
 

Pièces jointes

  • Inscriptions 2023 H Ver2.xlsm
    343.4 KB · Affichages: 4

patricktoulon

XLDnaute Barbatruc
Bonjour vgendron
oui j'ai vu les codes , c'est le boxon
la répétition (2fois) je l'ai eu moi aussi alors j'ai utilisé l'event de sortie (le mouseUp)
j'avoue je ne sais pas trop pour quoi mais j'ai déjà vu ça
ça arrive quad plusieurs controls sont enregistrés dans la même instance de classe mais là c'est pas le cas alors ma fois c'est une énigme

moi j'ai classé les textboxs dans le userform même
par exemple pour celui que j'ai fait (le userform FicheInscription)

voilà le code que j'ai ajouté pour les 5 boutons
en fait je classe les bouton dans le module userform lui même
VB:
Public WithEvents tbxdate As MSForms.TextBox
Dim cl(10) As New FicheInscription


Private Sub tbxdate_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
If Button = 2 Then tbxdate = Calendar.ShowX(tbxdate, 2, 0, 1)
End Sub

Private Sub UserForm_Activate()
For Each ctrl In Me.Controls
If ctrl.ControlTipText = "date" Then A = A + 1: Set cl(A).tbxdate = ctrl
Next
End Sub
et rien de plus : les 5 fonctionnent
on pourrait aussi mettre l'event keypress (numerique forcé) aussi dedans et supprimer les events originaux


pour le reste oui il y a des fonctions ou macro en double qui pourraient très bien en être qu'une argumenté pour les différences

il y a du boulot pour nettoyer tout ça
;)
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
re
tiens pour m'amuser j'ai supprimé tout les events textbox date et je met le mien soit 2 events
et j'ai le control de validité de date en prime
comme ça il peut taper ou se servir du calendar
VB:
Public WithEvents tbxdate As MSForms.TextBox
Dim cl(10) As New FicheInscription


Private Sub tbxdate_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    With tbxdate
        v = .Value
        Select Case KeyCode
        Case 96 To 105
            If Len(v) = 2 Or Len(v) = 5 Then v = v & "/"
            v = v & Chr(KeyCode - 48)
            If Val(v) > 31 Then v = ""
       If Len(v) >= 5 Then If Mid(v, 4, 2) > 12 Then v = Left(v, 3)
        KeyCode = 0
        Case 8: v = Left(v, InStrRev(v, "/") + 1)
        Case 46
        Case Else: KeyCode = 0
        End Select
         If Len(v) = 2 Or Len(v) = 5 Then v = v & "/"
          .Value = Mid(v, 1, 10)
    If Len(v) = 10 And Not IsDate(v) Then .Value = "": Beep: MsgBox "la date saisie n'est pas valide"
    End With
End Sub

Private Sub tbxdate_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)
    If Button = 2 Then tbxdate = Calendar.ShowX(tbxdate, 2, 0, 1)
End Sub


Private Sub UserForm_Activate()
    For Each ctrl In Me.Controls
        If ctrl.ControlTipText = "date" Then A = A + 1: Set cl(A).tbxdate = ctrl
    Next
End Sub

imagine si on fait ça pour les toglebutton ou les textbox sous_total..
ça va faire du vide hein ;)
 

Clemee61

XLDnaute Junior
Bonjour à tous les deux qui avez retouché le code,
Il ne faut pas dormir trop longtemps avec vous... ça carbure ! ;)
Recevoir une correction de calendrier de Patricktoulon, c'est comme un sportif d'un petit club d'athlé local qui reçoit des conseils de Kevin Mayer ou le judoka de Teddy Riner... Enfin vous comprenez l'idée : je suis plus que ravi et impressionné o_O ...Visiblement vgendron est une pointure aussi.
Pour ma part vous l'aurez compris j'ai beaucoup galéré pour avoir une fiche qui fonctionne. J'ai augmenté petit à petit le nombre d'informations à y entrer et en dehors du code de calendrier j'ai tout fait avec mes petits moyens.
J'ai vu les transformations apportées à mon code. C'est un peu comme si j'étais sur la table d'opération, éveillé, et que j'écoutais les chirurgiens au dessus de mon ventre discuter de la meilleure option pour atteindre et améliorer le coeur : ça fait peur car on sent qu'on ne maitrise pas suffisamment pour comprendre (en tout cas pas avec le temps que j'y consacre qui est pourtant déjà important).
Je vais prendre du temps pour étudier toutes les transformations et je pense revenir vers vous pour quelques questions.
Merci encore et à bientôt,
Cédric
 
Dernière édition:

vgendron

XLDnaute Barbatruc
Hello

Regarde la nouvelle PJ, j'ai un peu progressé dans l'identification et simplification du code

j'ai quand meme quelques questions
(je ne parle ici que du formulaire de saisie (Fiche Inscription))

Dans la table "Inscriptions", si j'ai bien compris le N° Client (colonne A) est le meme pour les 4 enfants (ou 1 ou 2 ou 3)
donc; dans le formulaire.. il n'est pas utile de lister TOUTES les lignes de la colonne A parce que:
==>1: ca te donne des doublons
==>2: selon que tu selectionnes le 1er ou 3eme enfant, le formulaire n'est pas correctement rempli
ex: pour le client 5, il y a 4 enfants: tu selectionnes le 2eme enfant==> le formulaire est rempli avec les enfants 2 3 et 4 (le 1er est oublié)

==> j'ai donc modifié le remplissage du combo de recherche pour avoir un remplissage sans doublon==> ca correspond au premier enfant

comme tu as très bien utilisé le nommage des différents controles de ton formulaire, j'ai juste modifié le nom de ceux qui correspondent au premier enfant, en rajouttant l'indice 1
dans le code: on peut donc faire une boucle de 1 à 4 sur les controles
plutot que
Txt_Nom=cells(1,1)
Txt_Nom2=Cells(2,1)
Txt_Nom3=Cells(3,1)
Txt_Nom4=Cells(4,1)

on a une boucle
for i=1 to 4
me.controls("Txt_Nom" &i)=cells(i,1)
next i

va voir le code du bouton "Aller a"

Bouton "Modifier" et bouton "Nouveau"
à priori, ils font la meme chose: à savoir sauvegarder les infos du formulaire dans la feuille Excel
la seule différence: c'est la ligne
Nouveau==> nouvelle ligne en bas du tableau
Modifier==> numéro de la ligne selectionné
on pourrait donc largement simplifier en rassemblant ces deux macros, en indiquant le numéro de ligne
Mais: je vois des différences (oublis??)
va voir le code: j'y ai aussi mis des commentaires/questions
 

Pièces jointes

  • Inscriptions 2023 H Ver3.xlsm
    304.5 KB · Affichages: 4

Clemee61

XLDnaute Junior
En fait je reviens assez rapidement parce-que la fiche ne fonctionne plus :

- Si je met juste un nom et une date de naissance, ça bug ici
.DataBodyRange(derligne, 40) = Txt_Total_Club1.Value
Comme je n'ai pas retrouvé de Txt_Total_Club1 je l'ai remplacé par Txt_Total_Club et ça va un peu plus loin

Mais ça bloque à nouveau sur :
.DataBodyRange(derligne, 11) = IIf(LabelDatDeb = "", "", CDate(LabelDatDeb))
Et là je ne vois pas comment aller plus loin

Sinon je me demande pourquoi maintenant dans ma première Combobox (ComboBox_Formule_Club) apparait automatique "journée" plutôt que du vide.

Enfin est-il possible de sortir du calendrier au clic sur la date choisie plutôt que d'être obligé de sortir en recliquant sur la croix ?

Cordialement,
Cédric
 

Clemee61

XLDnaute Junior
Hello

Regarde la nouvelle PJ, j'ai un peu progressé dans l'identification et simplification du code

j'ai quand meme quelques questions
(je ne parle ici que du formulaire de saisie (Fiche Inscription))

Dans la table "Inscriptions", si j'ai bien compris le N° Client (colonne A) est le meme pour les 4 enfants (ou 1 ou 2 ou 3)
donc; dans le formulaire.. il n'est pas utile de lister TOUTES les lignes de la colonne A parce que:
==>1: ca te donne des doublons
==>2: selon que tu selectionnes le 1er ou 3eme enfant, le formulaire n'est pas correctement rempli
ex: pour le client 5, il y a 4 enfants: tu selectionnes le 2eme enfant==> le formulaire est rempli avec les enfants 2 3 et 4 (le 1er est oublié)

==> j'ai donc modifié le remplissage du combo de recherche pour avoir un remplissage sans doublon==> ca correspond au premier enfant

comme tu as très bien utilisé le nommage des différents controles de ton formulaire, j'ai juste modifié le nom de ceux qui correspondent au premier enfant, en rajouttant l'indice 1
dans le code: on peut donc faire une boucle de 1 à 4 sur les controles
plutot que
Txt_Nom=cells(1,1)
Txt_Nom2=Cells(2,1)
Txt_Nom3=Cells(3,1)
Txt_Nom4=Cells(4,1)

on a une boucle
for i=1 to 4
me.controls("Txt_Nom" &i)=cells(i,1)
next i

va voir le code du bouton "Aller a"

Bouton "Modifier" et bouton "Nouveau"
à priori, ils font la meme chose: à savoir sauvegarder les infos du formulaire dans la feuille Excel
la seule différence: c'est la ligne
Nouveau==> nouvelle ligne en bas du tableau
Modifier==> numéro de la ligne selectionné
on pourrait donc largement simplifier en rassemblant ces deux macros, en indiquant le numéro de ligne
Mais: je vois des différences (oublis??)
va voir le code: j'y ai aussi mis des commentaires/questions
Ah mince j'ai posté un nouveau message sans voir ton message suivant... je regarde
 

vgendron

XLDnaute Barbatruc
par rapport à ton post 12
les premiers points de blocages que tu observes sont normalement rectifiés sur la dernière version que tu n'avais pas vue

pour le combo qui s'initialise sur Journée: il faut vider sa propriété (Valeur)

pour le pb du calendrier.. justement c'est ce que j'indiquais plus haut et dont on discutait avec Patrick:
c'est un comportement inattendu et incompris pour l'instant
 

patricktoulon

XLDnaute Barbatruc
utiliser le mouseup pour le calendrier
le mouse up est un events de sortie
dans la version que j'ai donné il ne se répète pas l'affichage ;)mais pour être honnête il faudrait repartir de zero car il y a beaucoup de control qui font la même chose
on pourrait réduire le code de moitié et le rendre plus intelligible pour le lecteur
si vous vous sentez on repart de zero

en post #8 je vous montre aussi comment je restreint les textbox en numérique(date) avec control de validité de date dans l'events keydown dans un select case
bien évidement les keypress disparaissent ils ne sont plus nécessaires

bien que avec le calendar normalement il serait judicieux de supprimer la saisie manuelle
ce qui allègerait encore plus le code
 
Dernière édition:

Statistiques des forums

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