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

patricktoulon

XLDnaute Barbatruc
re
Patricktoulon pense que
si on travaille bien on ramène ça a moins de 100 lignes pour tout le userform et ce sera compréhensible même pour un débutant... Ben alors ça ça m'étonnerait fortement😜
ben pourtant si
et là il ne s'agit pas d'être expert ou pas en vba il s'agit avant tout de raisonnement
et d'avoir une vue globale sur l'intention de résultat
pour cela je couche toujour mon projet sur un papier blanc voir un block note avant même d’écrire la moindre ligne de code ca aussi pas besoins d'être expert en vba
ensuite dans chaque etape de projet examiner les méthodes dispo (là il faut etre averti en vba quand même) mais tu a moult membres qui se feront un plaisir de t'aider

après on couche le programme en vba
selon le même ordre que tu a fait sur papier ou bloknot

je suis plutôt bon en vba mais pas le meilleur si je sais pas je cherche et je pose des questions
mais je te garanti que tu apprends plus vite le vba qui est un language assez facile par rapport à d'autres si tu fait comme ça


un exemple concernant ta serie de textbox
imaginons que j'ai 50 textbox (et ca fait beaucoup comme tableau en terme de colonnes déjà
au lieu de faire 50 fois ceci pour 50 textbox
textbox1=cells(ligne,1).value
textbox2=cells(ligne,2).value
textbox3=cells(ligne,1).value
'etc...50 fois


je fait plutôt
je tag les controls avec le numero de colonne correspondante
le textbox1 je lui met 1 dans le tag dans le 2 je met 2 et ainsi de suite (il n'est pas obligé que les colonnes se suivent comme l'index des textbox )

une fois que j'ai bien tagué mes textbox et autres controls (ca marche pour tous)
et bien je fait
for each ctrl in me.controls
if ctrl.tag<>"" then ctrl.value=cells(ligne,val(ctrl.tag)).value
next

terminé
;comme je te l'ai dis ca fait 3 lignes qui font la même chose que tes 50 lignes

tu vois c'est pas si compliqué pas besoins d'être un expert vba juste raisonner avec une vue d'ensemble
allez sur 50 on rajoute peut etre une dizaine au cas ou faudrait formater la valeur

au puré ça fait 13 lignes c'est pas bon ça
allez on en rajoute une on met un commentaire de code histoire de se rappeler
voilà 14 lignes

et ces mêmes 3 lignes peuvent faire pour 150 controls
c'est quand même plus pratique à déboguer que touts tes events disséminés un peut partout dans ton code et dans le désordre non?

imagine un gars dans un an ou deux qui viendrais modifier ou déboguer quelque chose dans mon code et dans le tiens
d'après toi comment réagira t il devant ton code et devant le mien
et soyons clairs ce n'est pas du grand codage de super pro c'est la base du B à BA
ce que l'on apprend quand on débute
 
Dernière édition:

patricktoulon

XLDnaute Barbatruc
allez je te montre comment on peut ajouter le formatage
on reprend nos 50 textboxs
on reprends nos 3 lignes
et j'ajoute le formatage delon la colonne
VB:
for each ctrl in me.controls
select case val(ctrl.tag)
case 1 to 4,  8 to 10 :v=format(cells(ligne,val(ctrl.tag)).value,"dd/mm/yyyy")'colone 1 à 4 et  8 à 10

case 15 to 20,22 to 25, 33 to 37:v=format(cells(ligne,val(ctrl.tag)).value,"#0.00 €"'colonne 15 à 20 , 22 à 25 , et 33 à 37
'etc..
'etc
case else: v=""
end select
if ctrl.tag<>"" then ctrl.value=v
next

voila terminé
 

vgendron

XLDnaute Barbatruc
Pour l'utilisation du tag avec numéro de colonne, très bien, sauf que la. ca va etre un peu plus compliqué à cause de la gestion des enfants..
les 4 enfants sont sur 4 lignes différentes.. mais utilisent les memes colonnes..
ca impliquerait "juste" une boucle supplémentaire pour faire varier le numéro de ligne en fonction du numéro d'enfant..
et la. finalement je pense qu'on en revient à ta proposition: reprendre tout depuis le début (ou presque):)
 

patricktoulon

XLDnaute Barbatruc
et ben que cela te tienne
je tag dans le textbox 1 erfant 1:5
dans le 2d je tag 2:5 etc..etc..
dans la boucle toujours pareille
VB:
for each ctrl in me.controls
x=splitctrl.tag,":")
colonne=x(1):ligneplus=x(0)

select case val(x(1))
case 1 to 4,  8 to 10 :v=format(cells(ligne+x(0),x(1),"dd/mm/yyyy")'colone 1 à 4 et  8 à 10

case 15 to 20,22 to 25, 33 to 37:v=format(cells(ligne+x(0),x(1),"#0.00 €"'colonne 15 à 20 , 22 à 25 , et 33 à 37
'etc..
'etc
case else: v=""
end select
if ctrl.tag<>"" then ctrl.value=v
next
et ce que tu ne doit pas sauter de ligne tu met 0:numero dec colonne
terminé là aussi
LOL

c'est pas du grand codage vous pouvez pas le nier
c'est simplement que j'ai prévu l'organisation de ma mécanique avant c'est tout
une vue globale du projet
 
Dernière édition:

vgendron

XLDnaute Barbatruc
J'avais envie de m'amuser à le faire pour le second formulaire.. mais.. j'ai l'impression que celui ci ne sert à rien
à part un bouton et 8 textbox en moins.. je ne vois pas de différence..
j'attend juste de finaliser la première version avec les calculs..
 

patricktoulon

XLDnaute Barbatruc
c'est ce que je voulais dire toute à l'heure
il ya deux userform identique
avec une seul variable un seul peut servire a ajouter ou modifier
tout ça pour dire que vous decouvrez au fure et à mesure ce que je vous explique
par ce que tout ce travail de raisonnement de projet n'a pas été fait avant

ce projet a été conçu au fur et à mesure de la découverte du besoins
forcement bis répétita on fait 10 fois les mêmes chose que l'on a oublié 100 lignes plus tard
on passe par des chemins a double voir triple reprise par ce que on avait pas prévu ceci ou cela
résultat on arrive a une grosse ratatouille a laquelle on rajoute une tambouille inintelligible que même l'auteur ne saura plus déboguer

  1. raisonnement
  2. projet de a a z
  3. méthode étapes +prévoyance ajout ou suppression ou modification
  4. test sur maquette des macros ou fonction perso responsives
  5. rigueur même si c'est du code basic
  6. organisation du code dans le module
c'est pas si compliqué quand on y réfléchi une boite avec des Lego que l'on range proprement par couleur

le language object vba n'est rien d'autre que ça pour moi
 

patricktoulon

XLDnaute Barbatruc
j'ai un exemple me semble t il c'est eric C ou eric4 (j'en suis pas sur je me souviens plus)
il avait un userform similaire (des dizaine de controls faisant la même chose )
le code plus de 900 lignes
avec une classe je lui ai ramener cela a 80 lignes dans un module classe
et de facon a ce que lui même n'etant pas un expert en vba puisse comprendre et deboguer ou apporter de futures modification
il m'a redemander 1 an plus tard une modif qu'il n'arrivait pas a faire
j'etais pas souvent la alors il c'est débrouillé tout seul
quand j'ai pu intervenir il n'avait plus besoins de moi


ça veut dire que non seulement je lui ai fait un code perenne mais même si c'etait assez complexe il avait les moyens de comprendre tout seul
je pense que c'est ça faire son boulot (d'aide)correctement
ça ramène bien au proverbe qui dit
"vaut mieux apprendre a un homme a pécher que lui donner du poisson"
 

Clemee61

XLDnaute Junior
Si un jour vous passez avec vos enfants ou petits enfants à Saint Jean de Monts, il faudra passer sur la plage (Cale 8) me réclamer une demi-heure de trampoline et autre jeux gratuit. ;)

Alors pour les calculs effectivement c'est complexe :

La Txt_TOTAL c'est facile, je rempli à la main donc aucun calcul à faire.

Pour la Txt_Total_Club : je voudrais un calcul qui se fait automatiquement. J'ai commencé à m'y pencher sur un petit programme séparer pour essayer sans tous mon code. Sur la fiche d'inscription j'ai préparé à droite des textbox (qui serviraient pour les calculs et seraient hors champs visuel)

Il s'agit d'additionner les prix pour chaque enfant (Text_Tarif_Enfant1, 2, 3 et 4). S'il n'y a qu'un enfant c'est le tarif indiqué, s'il y en a deux c'est l'addition moins 5%, s'il il en a trois c'est l'addition moins 10 % et moins 15 % pour 4 enfants. Je pense pourvoir trouver une formule qui dit SI 4 enfants ALORS additionne et multiplie par 0,85, Si 3 enfants ALORS additionne et multiplie par 0,90...

Là ou je sèche c'est que pour trouver le tarif je dois avoir le nombre de jours de l'enfant. Hors avec Datediff je ne peux pas écarter les dimanches apparemment. et avec Workday je ne m'en sors pas. Il me faut le nombre de jour sans les dimanches pour pouvoir faire le calcul.

Pour le calcul j'ai mes tarifs de références dans l'onglet Données_ref. (tableau M2 à BJ17). Il faudrait aller chercher le chiffre qui correspond au croisement du nombre de jour et de la formule choisie. (j'ai plus ou moins réussi sur mon fichier de travail mais plus ou moins ça ne suffit pas).
ça donne quelque chose comme ça :

J'ai enlevé les cases jaunes et la CB car je n'ai pas de terminal à carte bleu, j'ai mis une colonne CB au cas ou un jour j'investisse là dedans. :)

Je met le fichier ainsi que mon fichier de travail pour trouver le tarifs (c'est plus pour montrer que je m'arrache avec mes petits moyens que pour aider à trouver une solution) 😌
 

Pièces jointes

  • Inscriptions 2023 H Ver5.xlsm
    291.7 KB · Affichages: 3
  • Calcul tarifs 2023 goelands.xls
    263.5 KB · Affichages: 3

Clemee61

XLDnaute Junior
En ce qui concerne le coté méthodo. Je suis bien conscient qu'écrire 50 lignes quand on peut en faire trois c'est pas bien malin. La simplicité de faire copier coller en changeant juste un numéro fini par donner une usine à gaz. Mais quand je lis ta solution "simple"... Je vois bien aussi que ce qui te paraît évident ne l'est ps forcément pour moi.
Mais promis je vais faire des efforts. Je vais commencé par essayer de comprendre tes exemples mais déjà le terme "taguer" c'est floue.
 

vgendron

XLDnaute Barbatruc
en PJ
j'ai supprimé les deux formulaires "doublons"
et j'ai modifié la procédure d'appel qui définit la feuille de travail "WsSource"

j'ai modifié la macro d'impression des 4 feuilles (plus qu'une seule macro)
j'ai modifié la macro mail: plus besoin de copier les mails à droite pour supprimer les doublons et finalement effacer
la macro "Doit" peut aussi etre optimisée pour ne travailler que sur la table de données

pour les calculs, pas encore regardé

les macros Listes peuvent aussi etre réduites en une
la nuance que je vois, c'est le critère d'age à récuperer sur la feuille "Données Ref"

bon bah. ca va etre l'heure de l'apéro !:)
 

Pièces jointes

  • Inscriptions 2023 H Ver6.xlsm
    285.2 KB · Affichages: 1

Clemee61

XLDnaute Junior
Bon apéro !

Pour la macro d'impression j'ai vu... super !

Le mail impeccable aussi, pour l'instant il est en A2 de la première feuille mais je le mettrai dans l'onglet mail.

Pour les listing il y a des bugs. L'idée est d'éditer une feuille d'appel par tranche d'âge de groupe et en prenant en compte les dates d'inscription (la date du jour doit être supérieure ou égale à la date de début et inférieur ou égale à la date de fin de séjour). J'ai l'idée et comme d'hab ça se complique au moment de coder.

Par contre mon cœur s'est arrêté quand j'ai compris ce que vous appeliez doublons ! 😨
En fait chaque année je met dans l'onglet "SaisonPrecedente" les inscriptions de l'année précédente.
Lorsqu'un client de l'année précédente viens, je prend ma recherche de saison précédente (un doublon pour vous) pour trouver le numéro de client puis j'importe les renseignements administratifs et sur les enfants (qui sont dans l'onglet SaisonPrécédente : l'autre doublon pour vous) .
Alors évidemment c'est encore une usine à gaz ! 🤯
Dans l'idéal il faudrait qu'à chaque nouvelle entrée, cela remplisse aussi une base client avec tous les renseignements (en se basant sur le numéro de téléphone ou le Nom de l'adulte par exemple). Mais ma solution me convenait assez bien, je n'avais qu'à prendre ma base de client de la saison précédente et la recopier dans l'onglet approprié.
 

Clemee61

XLDnaute Junior
Houaou et le code diminue diminue...diminue.
Ce qui m'impressionne c'est que moi il me faut des jours et des jours pour créer une usine à gaz et vous vous n'arrêtez pas d'améliorer ou plutôt de recréer en quelques heures (voire minutes).
 

Statistiques des forums

Discussions
311 733
Messages
2 082 011
Membres
101 866
dernier inscrit
XFPRO