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

Clemee61

XLDnaute Junior
Sur une autre version j'avais tenté de faire une feuille pour avec toute les données pour pouvoir les trier notamment par date décroissante et voir rapidement les inscrits du jour.
Je n'avais pas réussi et abandonné. Sur le fichier que je joins je l'ai remis. Si vous voulez bien y jeter un coup d'œil.
Si j'abuse ou si vous en avez assez je comprendrais. 🙏
 

vgendron

XLDnaute Barbatruc
ok, je viens de vérifier
le nombre de jours SANS dimanche est ok
par contre, les tarifs: n'étaient pas pris
1) sur la bonne ligne (l'ordre des formules (matin, apres midi...) doit etre le meme entre le tableau "Formule Club" et le tableau "Tarif" DOIT etre le meme
à noter: qu'il n'y a pas de tarif pour une formule membre==> Ca risque de provoquer un bug

2) et pas sur la bonne colonne (décalage manquant)
ici, c'est rectifié
 

Pièces jointes

  • Inscriptions 2023 H Ver9.xlsm
    310.6 KB · Affichages: 2

vgendron

XLDnaute Barbatruc
Bonjour,
bah déjà. par rapport à la version initiale du demandeur:
le nombre global de lignes est divisé par deux puisque la moitié des formulaires ont été supprimés
ensuite
pour le formulaire de saisie: on est passé de 1374 lignes à 403 lignes soit division par /3
pour les 15 modules d'origine: on passe de 430 lignes à 200 soit division par /2

donc à la grosse.. un nombre de ligne / 4 tout en ajoutant une gestion du format de saisie, plus une exploitation des tables structurées (ce qui n'était pas le cas) et une clarification du code qui est plus propre.

Donc. ok, ce n'est pas aussi court que ce que tu suggères, mais avoue que c'est déjà pas si mal pour une demande initiale qui n'était QUE de mettre des dates dans des boites...

et oui, on peut toujours faire mieux

PS: j'avais commencé à appliquer un tag sur tous les controls
déjà, c'est long à faire; surtout quand on est pas sur de quelle colonne alimente quel control (seul l'auteur du fichier peut le savoir à coup sur)
et ca oblige à revoir plus ou moins le projet.
Et perso.. si je devais reprendre le fichier complet, je donnerais des noms de controls qui correspondent aux noms des colonnes.. ainsi, si la colonne change de place, le code n'est pas impacté.. ce qui n'est pas le cas avec les tags qu'il faudrait ajuster..

Enfin, si ton impatience est motivée pour pouvoir dire "Je vous l'avais dit, ma solution est plus courte"
bah c'est pas la peine, on le sait bien que c'est plus court: on sait compter et on a bien conscience que 50 lignes, c'est plus long que 5..

Bon.. allez la France ! (Biathlon)
 

patricktoulon

XLDnaute Barbatruc
non @vgendron c'est pas pour narguer

c'est juste pour voir si ce que j'ai dis a été assimilé

le noms des colonnes dans le tag ,oui je te l'accorde c'est même mieux en effet
au cas ou déplace les colonnes
mais le principe est le même
mais je ne m'ennuie pas avec ça moi je rempli la ligne en un coup
 

Clemee61

XLDnaute Junior
Bonjour,
bah déjà. par rapport à la version initiale du demandeur:
le nombre global de lignes est divisé par deux puisque la moitié des formulaires ont été supprimés
ensuite
pour le formulaire de saisie: on est passé de 1374 lignes à 403 lignes soit division par /3
pour les 15 modules d'origine: on passe de 430 lignes à 200 soit division par /2

donc à la grosse.. un nombre de ligne / 4 tout en ajoutant une gestion du format de saisie, plus une exploitation des tables structurées (ce qui n'était pas le cas) et une clarification du code qui est plus propre.

Donc. ok, ce n'est pas aussi court que ce que tu suggères, mais avoue que c'est déjà pas si mal pour une demande initiale qui n'était QUE de mettre des dates dans des boites...

et oui, on peut toujours faire mieux

PS: j'avais commencé à appliquer un tag sur tous les controls
déjà, c'est long à faire; surtout quand on est pas sur de quelle colonne alimente quel control (seul l'auteur du fichier peut le savoir à coup sur)
et ca oblige à revoir plus ou moins le projet.
Et perso.. si je devais reprendre le fichier complet, je donnerais des noms de controls qui correspondent aux noms des colonnes.. ainsi, si la colonne change de place, le code n'est pas impacté.. ce qui n'est pas le cas avec les tags qu'il faudrait ajuster..

Enfin, si ton impatience est motivée pour pouvoir dire "Je vous l'avais dit, ma solution est plus courte"
bah c'est pas la peine, on le sait bien que c'est plus court: on sait compter et on a bien conscience que 50 lignes, c'est plus long que 5..

Bon.. allez la France ! (Biathlon)
Alors c'est sûr que je n'imaginais pas en posant une question pour ajouter une date dans une case de mon formulaire que j'aurais droit à un tel lifting du code ! 😊 Je ne vais certainement pas m'en plaindre bien au contraire.
J'aimerais savoir ce que tu entends par "donner des nom de controls qui correspondent aux noms de colonnes.". J'essaierai sûrement progressivement d'améliorer le code pour qu'il soir "propre" (et puis ça m'entraine sur un projet qui me tiens à cœur).
En ce qui concerne le calcul du prix j'ai une erreur : "13 incompatibilité de type"
Sur le DOIT, il s'agit de faire apparaitre les fiches des cases non égale à 0 dans la colonne "doit" du fichier. Là tout le monde apparait
Mais je vais regarder de prêt parce que dans un autre onglet j'aimerais faire apparaitre tout le monde pour pouvoir faire des tris (sans risque de les faire sur la feuille principale).
Et bravo Julia Simon du coup ! (Toujours Biathlon 🎿)
 

vgendron

XLDnaute Barbatruc
il y a plusieurs sujets... je vais essayer de te donner quelques éléments

1) il vaut toujours mieux (ou très souvent) utiliser des tables structurées
ce que tu as fait sur la feuille "Inscriptions"
ainsi, les formules, mises en formes sont automatiquement recopiées dès qu'une nouvelle ligne de données est inscrite
En règle générale, il vaut mieux ne PAS mettre de lignes vides dans une telle table
les noms de colonnes (entetes) sont UNIQUES: tu ne peux pas avoir deux colonnes avec le meme nom

tu peux traiter JUSTE les données plutot que faire du A2:A7000 .copy par exemple

une table structurée, en VBA = listobjecs()
ce qui est pratique, c'est que si tu veux mettre une donnée à la 20eme colonne (qui s'appelle TrucMuche)
tu peux utiliser la syntaxe
listbobjects("NomTable").databodyrange(ligne,20) ==> mais si tu déplaces la colonne.. bah il faut modifier le 20 dans le code
ou
Listobjects("NomTable").listcolumns(20).databodyrange(ligne) ==> meme punition

MAIS
Listobjects("NomTable").listcolumns("TrucMuche").databodyrange(ligne) ==> ici, le fait d'utiliser le nom de la colonne cible.. bah. tu te fous de savoir ou elle est dans la table.... donc. si elle bouge.. pas besoin de modifier le code
bon. il faut quand meme s'assurer que le Nome de la colonne cible est écrit EXACTEMENT comme dans la table (un espace peut faire toute la différence)
ensuite.. évidemment, si tu changes le nom de la colonne (TrucMuche), il faut aussi le modifier dans le code
y a quand meme un minimum..

et donc.. si le control s'appelle comme le nom de la colonne, une boucle sur tous les controls du formulaire permettrait de remplir les colonnes assez facilement
la propriété tag des controles resterait donc dispo pour les checks de saisie par exemple
dans ton cas. ce serait quand meme un peu plus compliqué puisqu'il y a 4 enfants et que leurs controls associés utilisent les memes colonnes.. il y aurait "une extraction du nom de la colonne a faire"
meme chose que le split (tag) proposé par Patrick
si tu veux un peu de lecture sur les tables strucuturées:


2) le nom des controls
leur donner un nom explicite==> tu l'as très bien fait,
mais ca peut être amélioré
ex une règle que j'utilise
un triplon pour donner le type de control
Tbx pour TextBx
Cbx pour ComboBox
Cbn pour CommandButton
Lbl pour Label
Lvw pour ListView
Lbx pour ListBox

puis le nom en lui meme qui indique clairement de quoi on parle
exemple pour les textbox qui te servent pour la date de naissance
plutot que les appeler Text_Age, je les aurais appelés: Txt_Naiss
tous les combobox
Cbx_.

d'ailleurs, si je ne me trompe pas, en fait dans la version ci jointe, j'ai modifié les combobox
j'ai aussi modifié l'apparence du formulaire en utilisant des frames.. j'avais dans l'idée d'afficher les frames enfants uniquement s'ils ont été saisis.. mais bon...

pour en revenir aux calculs
il faudrait que tu expliques, total par total comment tu calcules, qui alimente quoi...
expliquer en meme temps l'utilisation de "Séjour 1"
Je vois dans la section Paiement en bas à gauche
3 Totaux: Total_Club - Nat et Par
TotalClub est calculé comment? à partir du nb de jour * tarifs * réduction?
Total Nat = ?
Total Par =Durée * Parasol (section à part..?

en fait, il y a beaucoup de case de calculs qui ne se mettent à jour que si on clique dessus..



pour le filtre "Doit": il faut juste revoir le filtre pour ne plus voir apparaitre les lignes = "-"

dans la PJ, j'ai aussi corrigé le bouton "Effacer tout" qui n"effacait pas tout.. notamment les combo
 

Pièces jointes

  • Inscriptions 2023 H Ver9.xlsm
    310.3 KB · Affichages: 4

vgendron

XLDnaute Barbatruc
pour la macro "Doit" corrigée ca donne ca
VB:
Sub Doit() ' Macro doit 'pb de copie entre les feuilles==> le nombre de colonnes et les entetes ne correspondent pas entre les deux feuilles
    Application.ScreenUpdating = False 'empêche de voir l'execution des tâches
        
    With Sheets("Inscriptions").ListObjects("t_Inscriptions")
        .Range.AutoFilter Field:=21, Criteria1:=">0", Operator:=xlAnd, Criteria2:="<>-"
        On Error GoTo fin 'dans le cas ou le filtre ne donne aucune ligne
        Set ZoneToCopy = .DataBodyRange.SpecialCells(xlCellTypeVisible) 'on affecte le résultat du filtre à "ZoneToCopy"
    End With
    
    With Sheets("Doit").ListObjects(1) 'avec la table de l'onglet "Doit"
        .DataBodyRange.Offset(1, 0).ClearContents 'on vide la table SAUF la première ligne de données (sinon bug du à une ligne de donnée "Virtuelle")
        .Resize Range("$A$1:$AF$2") 'redimensionne à 1 ligne d'entete + 1 ligne de données
        LastLine = .ListRows.Count 'indice de la dernière ligne
                
        NbLigne = 0 'initialisation
        For N = 1 To ZoneToCopy.Areas.Count 'pour chaque "sous zone" de la plage "ZoneToCopy"
            NbLigne = ZoneToCopy.Areas(N).Rows.Count
            ReDim TabFinal(1 To NbLigne, 1 To 32) 'on créé le tableau du nombre de lignes NbLigne
            For i = 1 To UBound(TabFinal, 1) 'on remplit le tabeau
                For j = 1 To UBound(TabFinal, 2)
                    TabFinal(i, j) = ZoneToCopy.Areas(N).Item(i, j) 'Nom
                Next j
            Next i
            .DataBodyRange(LastLine, 1).Resize(UBound(TabFinal, 1), UBound(TabFinal, 2)) = TabFinal 'on colle le tableau dans la table
            LastLine = .ListRows.Count + 1 'indice de la dernière ligne de la table
        Next N
    End With
fin:
    Application.ScreenUpdating = True
    Sheets("Doit").Activate
End Sub
 

Clemee61

XLDnaute Junior
pour la macro "Doit" corrigée ca donne ca
VB:
Sub Doit() ' Macro doit 'pb de copie entre les feuilles==> le nombre de colonnes et les entetes ne correspondent pas entre les deux feuilles
    Application.ScreenUpdating = False 'empêche de voir l'execution des tâches
       
    With Sheets("Inscriptions").ListObjects("t_Inscriptions")
        .Range.AutoFilter Field:=21, Criteria1:=">0", Operator:=xlAnd, Criteria2:="<>-"
        On Error GoTo fin 'dans le cas ou le filtre ne donne aucune ligne
        Set ZoneToCopy = .DataBodyRange.SpecialCells(xlCellTypeVisible) 'on affecte le résultat du filtre à "ZoneToCopy"
    End With
   
    With Sheets("Doit").ListObjects(1) 'avec la table de l'onglet "Doit"
        .DataBodyRange.Offset(1, 0).ClearContents 'on vide la table SAUF la première ligne de données (sinon bug du à une ligne de donnée "Virtuelle")
        .Resize Range("$A$1:$AF$2") 'redimensionne à 1 ligne d'entete + 1 ligne de données
        LastLine = .ListRows.Count 'indice de la dernière ligne
               
        NbLigne = 0 'initialisation
        For N = 1 To ZoneToCopy.Areas.Count 'pour chaque "sous zone" de la plage "ZoneToCopy"
            NbLigne = ZoneToCopy.Areas(N).Rows.Count
            ReDim TabFinal(1 To NbLigne, 1 To 32) 'on créé le tableau du nombre de lignes NbLigne
            For i = 1 To UBound(TabFinal, 1) 'on remplit le tabeau
                For j = 1 To UBound(TabFinal, 2)
                    TabFinal(i, j) = ZoneToCopy.Areas(N).Item(i, j) 'Nom
                Next j
            Next i
            .DataBodyRange(LastLine, 1).Resize(UBound(TabFinal, 1), UBound(TabFinal, 2)) = TabFinal 'on colle le tableau dans la table
            LastLine = .ListRows.Count + 1 'indice de la dernière ligne de la table
        Next N
    End With
fin:
    Application.ScreenUpdating = True
    Sheets("Doit").Activate
End Sub
Ca marche impeccable :)
 

patricktoulon

XLDnaute Barbatruc
re
une table structurée, en VBA = listobjecs()
ce qui est pratique, c'est que si tu veux mettre une donnée à la 20eme colonne (qui s'appelle TrucMuche)
tu peux utiliser la syntaxe
listbobjects("NomTable").databodyrange(ligne,20) ==> mais si tu déplaces la colonne.. bah il faut modifier le 20 dans le code
ou
Listobjects("NomTable").listcolumns(20).databodyrange(ligne) ==> meme punition

MAIS
Listobjects("NomTable").listcolumns("TrucMuche").databodyrange(ligne) ==> ici, le fait d'utiliser le nom de la colonne cible.. bah. tu te fous de savoir ou elle est dans la table.... donc. si elle bouge.. pas besoin de modifier le code
bon. il faut quand meme s'assurer que le Nome de la colonne cible est écrit EXACTEMENT comme dans la table (un espace peut faire toute la différence)
ensuite.. évidemment, si tu changes le nom de la colonne (TrucMuche), il faut aussi le modifier dans le code
y a quand meme un minimum..
ouais OK si tu veux
quelques autres méthodes d’accès
VB:
Sub test()

MsgBox Range("Tableau1[[#All],[trucmuche]]")(20).Address
MsgBox Range("Tableau1").ListObject.ListColumns("trucmuche").Range.Cells(20).Address
MsgBox Range("Tableau1").ListObject.ListColumns("trucmuche").Range(20).Address

End Sub
et quelques autres encore
;)
 

Clemee61

XLDnaute Junior
Oh la la à chaque fois que je te lis j'ai honte d'écrire si peux de lignes ! Merci du temps que tu prends pour m'expliquer clairement.
Avec les liens et les explications que tu me donnes en #56, j'ai du travail pour un bout de temps (pas plus de trois - quatre ans ;))
J'ai compris le principe de ce que tu m'écris, c'est déjà bien mais de là à mettre en application...:p

Pour tous les calculs :
- Il y a celui que je rentre à la main à partir d'un tableau papier : Txt_Sous_Tot_Par
- Celui que je rentre à la main à partir des données de la fiche d'inscription : Txt_TOTAL
- Celui qui n'est qu'une copie du chiffre dans Txt_Sous_Tot_Par. Oui bon bah là je te vois venir... A quoi ça sert d'avoir deux fois la même case. C'était "esthétique". Mais je vais supprimer la Txt_Sous_Tot_Par qui ne sert à rien en fait.
- Celui qui est une addition des chiffres rentrés à la main pour la natation : Txt_Total_Nat = Txt_Tarif1 + Txt_Tarif2 + Txt_Tarif3 + Txt_Tarif4.
- Celui qui est compliqué : Txt_Total_Club qui est l'addition du total club de chaque enfant.
Deux étapes pour calculer :
+ étape 1 : pour chaque enfant le prix correspond à la somme indiquée dans le tableau qui croise le nombre de jours ouvrés et la formule choisie (matin, journée, après-midi ou membre)
+ étape 2 : addition des sommes de chaque enfant et applications du pourcentage de réductions en fonction du nombre d'enfants (2 enfants - 5%, 3 enfants -10%, 4 enfants -50%)
(Pour une famille de plus de 4 frères et sœurs on ferait dans les notes)
 

Statistiques des forums

Discussions
312 084
Messages
2 085 194
Membres
102 812
dernier inscrit
abdouami