Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

XL 2016 fichier de statistiques par semaine dans l'année en vba

mastergate

XLDnaute Nouveau
bonjour a tous,
je suis novice en vba, je cherche a créer un fichier de statistique suivant des règles définit.
Ce fichier me servira a créer des stats par semaine,
j'ai le bouton (avec vba) qui me permet de créer une nouvelle feuille identique avec en nom le numéro de la semaine,
jai des boutons permettant de mettre a jour des données rentrées par jour,

Ma demande est celle si, j'aimerais savoir en vba s'il existe une façon de faire pour que mes boutons journalier(lundi, mardi, ...) ne puissent mettre a jour que le jour correspondant en choisissant le numéro de la semaine que l'on veut mettre a jour???

et aussi, sur la nouvelle feuille créer (ex: semaine 10) existe t il une fonction qui permettrait de geler le numéro de semaine (c2) pour ne pas que cela ce mette a jour si on consulte cette feuille après???

merci d'avance pour l'aide que vous pourrez m'apporter
 

Pièces jointes

  • demande excel.xlsm
    45.9 KB · Affichages: 21
Solution
Bonne Nuit @mastergate , bonne nuit les noctambules ...

La réponse à tes 2 questions est Oui, bonne nouvelle non ?
Ma démarche :

J'ai d'abord nommer tes boutons Bt_Lundi, Bt_Mardi, ... Ça se fait en sélectionnant le bouton et en tapant le nom dans la zone de nom, sans oublier de valider par ENTREE :


Ensuite j'ai créé une macro unique pour tous les jours, elle détecte le bouton qui l'a lancé grâce à la propriété...

mastergate

XLDnaute Nouveau
bonsoir a toi,

je comprend mieux pourquoi la feuille table était inutilisable, pas la bonne version... mais non, les cellules catégories et motifs ne changent pas, au pire on en rajoutera pas la suite ?? je devrais agrandir les zones de recherches et de copies ...
donc je peut la supprimer dans ta dernière version..

je vais essayer d'être plus clair dans mes propos,
- en début de semaine, le matin du lundi par exemple, il se peut qu'un collègue remplisse le fichier stat,
- a la fin de la journée un autre collègue peut remplir les stats mais pas forcement en voyant qu'ils ont été remplis le matin.
-donc le bouton "lundi" sert a remplir les cellules remplies le soir en complétant les cellules remplie par la suite, malheureusement je n'ais pas trouver de fonction qui permettrait de faire un ajout (je m'explique, si le matin on met 2 dans le motif A, et le soir on remet un chiffre dans le motif A, je cherchait à ajouter les valeurs, mais pas trouver, donc je cherche juste a faire une mise a jour pour les cellules vides de la journée, cellules B C ou autre, le rajout dans le A sera manuel)



A+
 
Dernière édition:

AtTheOne

XLDnaute Accro
Supporter XLD
Petite chose que j'ai remarqué, pourquoi le feuille "semaine" est a chaque fois protégés ??? il faut a chaque fois enlever la protection pour remplir les données pour un jour ??? Est ce normal ???
Bonjour @mastergate
Il me semble que les cellules destinées à recevoir des saisies sont déprotégées.
La protection, c'est pour s'assurer que personne n'altère les formules, les catégories, les motifs de la feuille Semaine.
Si j'ai omis de déprotéger les cellules de saisie (sous les jours de la semaine), retire la protection de la feuille, sélectionne les cellules de saisie (toutes du lundi au dimanche), et fait format de cellule, protection, et décoche la case verrouillée.
Puis réactive la protection de la feuille.
Les utilisateurs pourront saisir les statistiques sans problème, mais ne pourront pas modifier les cellules qui sont restées verrouillées (par défaut toutes les cellules sont verrouillées).

Amicalement
Alain
PS je suis toujours sans PC, donc impossible de faire des vérifications.
 

mastergate

XLDnaute Nouveau
Bjr Alain,

J'ai tester de déverrouiller les cellules du lundi au dimanche, mais après avoir créer une semaine, le verrouillage revient (si on met oui pour réinitialiser l'onglet), et j'ai remarqué aussi, qu'a la création de la nouvelle semaine la colonne des sommes n'est pas copier ???

Et petite question d'un collègue, serais t il possible d'inverser le sens des feuilles (au lieu d'avoir Feuille_1,2,3,... avoir feuilles _3,2,1) pour éviter daller chercher la dernière feuille dans la liste ???

Je sais que tu n'est pas encore sous ordi (tu avais dit 10 jours) je suis patient ...
Profite...
A+
 

AtTheOne

XLDnaute Accro
Supporter XLD
Bonjour Hervé (@mastergate )
Bon j'ai retrouvé mon PC !

Je me suis rendu compte que lors de mon dernier envoi je ne t'avais pas joins le bon fichier (d'où pas mal d'incompréhensions)

Pour plus de clarté j'ai renommé la feuille de saisie "SAISIES STAT HEBDO", la plage de saisie de cet onglet est déverrouillée et le demeure même après réinitialisation. Le reste de la feuille est verrouillé lorsque la feuille est protégée.

Les enregistrements hebdo sont rangés dans l'ordre inverse des N° de semaine. C'est vrai que c'est plus pratique. Elles sont protégées en écriture (même les données)

On pourrait faire des saisies incrémentales où en cours de journée chacun rentrerait ses données et les enregistrerait en utilisant le bouton du jour. La macro pourrait alors additionner les valeurs de la feuille de saisie aux valeurs déjà présentes dans la feuille hebdomadaire de la semaine en cours, puis elle effacerait les données enregistrées de la feuille de saisie :
Je rentre mes données dans la feuille de saisie, j'enregistre mon travail du lundi , la feuille Semaine_x est mise à jour, la feuille de saisie est nettoyée. Plus tard dans la journée tu entres tes données, tu enregistres ton travail du lundi, tes valeurs sont additionnées aux miennes, la feuille de saisie et nettoyée etc..​
Est-ce-que cela te conviendrait ?
En fait il faudrait penser l'ergonomie en fonction de votre façon de travailler, est-ce que vous avez chacun vos statistiques à saisir ou est-ce-que c'est une information globale dont tout le monde dispose et que tout le monde peut saisir ?

Amicalement
Alain
 

Pièces jointes

  • Stat Jour ou Semaine Mois.xlsm
    77 KB · Affichages: 6

mastergate

XLDnaute Nouveau
Bonjour Alain,

Je vient de tester ton dernier fichier, mais la problème de la protection est toujours présent quand je lance le fichier ??? après j'enlevé la protection, je remplie et quand je clique sur un jour pour mettre a jour, la protection revient, donc a chaque fois je dois enlever la protection pour remettre les données??? ca vient peut être de mon ordi ? ou de la version 2016???

Pour les stats, c'est des informations globales (on travaille en équipe, et on enregistre les stats généralement en fin de journée mais ceux présent au bureau peuvent avoir déjà remplis des données..). Je pense qu'on va éviter de ce compliquer la vie en pensant a additionner mais l'idée me taraudait déjà dans la tête...

Et une erreur se déclenche la 1er fois que je lance le fichier :
ThisWorkbook => Application.goto to.Worksheets,

suis obliger d'arrêter le débogage, et après l'erreur ne se redéclanche plus ??? est ce normal ca ???

En tout cas, le boulot effectué est excellent et énorme. un grand merci pour ton aide
 

AtTheOne

XLDnaute Accro
Supporter XLD
Bonjour Hervé (@mastergate), bonjour à tous
Et une erreur se déclenche la 1er fois que je lance le fichier :
ThisWorkbook => Application.goto to.Worksheets,
Chez moi aussi, quand j'ouvre le fichier téléchargé. Je pense que cela provient du mode protégé, lorsque l'on ouvre le fichier juste après l'avoir téléchargé.
Ouvre le fichier, désactive le mode protégé, -> Bug, mets fin au débogage, enregistre le fichier sous, ferme EXCEL, Rouvre le fichier enregistré, ça ne devrait plus se produire.

J'ai du mal à comprendre, c'est du basique les cellules déverrouillées d'une feuille protégée sont modifiables, ce ne peut pas être lié à la version d'excel, ça existe depuis toujours. Et cela fonctionne parfaitement sur mes 2 versions d'Excel (2007 et 2021) : Le fait que la feuille soit protégée n’empêche pas la saisie dans les cellules déverrouillées.
Mais peut-être ne parle-t-on pas de la même feuille : ce qui est vrai pour la feuille "SAISIES STAT HEBDO" (les cellules destinées aux saisies ne sont pas verrouillées) ne l'est pas pour les feuilles "Semaine_x" qui sont entièrement protégées (toutes leurs cellules sont verrouillées).

Fais un essai sur un Classeur vierge :
  • Sélectionne une plage de cellules
  • Fais format de cellule, protection, décoche verrouillée.
  • Active la protection de la feuille (Révision, Protéger la feuille)
Tu dois pouvoir faire des saisies dans la plage que tu as déverrouillée, mais pas ailleurs.

Tiens moi au courant
Amicalement
Alain
 

Pièces jointes

  • Stat Jour Semaine Mois.xlsm
    79.5 KB · Affichages: 11
Dernière édition:

mastergate

XLDnaute Nouveau
Bonjour, je vient de récupérer la dernière version du fichier, et oui le bug est revenu.
J'ai fait ta méthode que tu m'as donnée, pour le moment ca marche.... A voir pour la suite !!

Sur cette dernière version, je n'ai plus le soucis de la protection sur la feuille de saisies hebdo !! tant mieux, vais pouvoir mettre en forme le reste des données a remplir....
En tout cas, je te remercie énormément pour ton aide précieuse, va vraiment falloir que je me remette au VBA si des fois, je dois refaire un autre fichier...

Je revient vers toi pour te donner des nouvelles ..

Amicalement

Hervé

PS : ou pourrais je trouver des aides pour me former (pas autant que toi) sur vba
 

AtTheOne

XLDnaute Accro
Supporter XLD
Bonjour Hervé (@mastergate)
Bonjour tout le monde.
Content de savoir que ça va dans le bon sens.
Pour le VBA, il y a déjà des tutos sur ce site, puis en faisant une recherche du style Tuto EXCEL VBA sur le Net tu trouveras plein de sites intéressants.
(Je ne les cite pas, ce ne serait pas conforme au règles d'XLD)
Bon courage pour la suite.
Amicalement
Alain
 

mastergate

XLDnaute Nouveau
Bonjour, je revient vers toi car on rencontre un petit soucis dans le fichier ??? J'espère que tu vas pouvoir m'aiguiller??
on a changer le titre d'une ligne du fichier, et on as une erreur 1004 qui fait bugguer le fichier, on peut plus créer de nouvelle feuille "semaine" ???

Copier /Coller de l'endroit ou il y a l'erreur (sur ligne Wsh.copy......)

'Copie de la feuille de saisie avant la dernière feuille du classeur
WSh.Copy After:=F02_Stats_Mensuelles
ActiveSheet.Name = Nom

Set Créer_Feuille = Worksheets(Nom)
With Créer_Feuille

'Figer l'année
.Range(Adr_N°_An).Value = .Range(Adr_N°_An).Value
'Figer le N° de Semaine
.Range(Adr_N°_S).Value = Sem

j'espère que tu pourras me dire quoi modifier pour réparer l'erreur???
 

AtTheOne

XLDnaute Accro
Supporter XLD
Re Bonsoir Hervé (@mastergate )
Si l'erreur provient de la ligne : WSh.Copy After:=F02_Stats_Mensuelles
je soupçonne une suppression de la feuille "Stats_Mensuelles" suivit d'une recréation, le Code Name de la feuille "F02_Stats_Mensuelles" ne doit plus exister :

Tu peux corriger cela en redonnant le bon code name à cette feuille :

Ou en remplaçant dans le code "WSh.Copy After:=F02_Stats_Mensuelles" la chaîne "F02_Stats_Mensuelles" par le nouveau code name.
Tiens moi au courant
Amicalement
Alain
 

mastergate

XLDnaute Nouveau
Je te remercie de tes conseils, je les garde sous le coude, mais hier j'ai regarder et en cherchant bien, le collègue qui avait changer la ligne, avait cliquer sur protection du dossier complet au lieu de la protection de la feuille... Ce qui gênait le reste des manip sur le fichier, mais j'ai cherché longtemps, comme quoi un simple clic inopportun peut généré une gène ... mais merci quand même d'avoir pris du temps pour m'aider...

juste une remarque, le fichier marche super, mais certaine données qui sont sur un semaine a cheval entre 2 mois (exemple la semaine 13) sont pas forcement comptabilisées dans le bon mois : dans la semaine 13, on as écrit des stats pour le 1 er avril, mais c'as a été comptabiliser dans le mois de mars... juste une petite erreur, j'ai été dans les stats mensuels et fait la modif manuellement ...

Mais merci quand même..

Hervé
 

AtTheOne

XLDnaute Accro
Supporter XLD
Bonsoir Hervé (@mastergate )

Il y a en effet 2 bugs dans la macro de stats mensuelles.
Les corrections sont en gras et en rouge dans le code qui suit.
Tu peux faire un copier coller de la totalité de ce code dans le module "M02_Stat_Mensuelles" à la place de l'ancienne macro :
Enrichi (BBcode):
Sub Stat_Mensuelles()

Dim WSh As Worksheet, Wsh_Stat_Mensuelles As Worksheet, i As Byte, j As Byte, Tb_Mois_Disp()
     'Recherche de la feuille de stat mensuelles
     Set Wsh_Stat_Mensuelles = Nothing
     On Error Resume Next
          Set Wsh_Stat_Mensuelles = ThisWorkbook.Worksheets(Sh_Stat_Mensuelles)
     On Error GoTo 0
     If Wsh_Stat_Mensuelles Is Nothing Then
          MsgBox "On ne trouve pas la feuille de statistiques mensuelles !"
          Exit Sub  'Sortie si echec
     End If
     Wsh_Stat_Mensuelles.Protect UserInterfaceOnly:=True
     'Recherche de Feuilles 'Semaine_x'
     i = 0
     For Each WSh In ThisWorkbook.Worksheets
          If WSh.Name Like "Semaine_*" Then
               i = i + 1
               ReDim Preserve TBS(1 To i): ReDim Preserve TBA(1 To i): ReDim Preserve TBD(1 To i): ReDim Preserve TBF(1 To i)
               TBS(i) = CByte(Replace(WSh.Name, "Semaine_", ""))                 'liste des N° de semaine disponibles
               TBA(i) = WSh.Range(Adr_N°_An).Value                               'liste des années pour ces semaine (pour cas 1er janvier)
               TBD(i) = CLng(Lundi_An_Semaine(CDate(TBA(i)), CByte(TBS(i))))     'liste des débuts de semaine (date des lundis en long)
               TBF(i) = TBD(i) + 6                                               'liste des fins de semaine (date des dimanches en long)
          End If
     Next
     If i = 0 Then
          MsgBox "Aucune statistisque hebdomadaire enregistrée !"
          Exit Sub 'Sortie si echec
     End If
     With WorksheetFunction
          Année = .Max(TBA)   'année en cours
          Premier_J = CDate(.Min(TBD))
          Dernier_J = CDate(.Max(TBF))
         
          'Mois disponible pour l'enregistrement
          Tb_Mois = Array("Janvier", "Février", "Mars", "Avril", "Mai", "Juin", "Juillet", "Aoüt", "Septembre", "Octobre", "Novembre", "Décembre")
          j = 0
          For i = 1 To 12
               If DateSerial(Année, i, 1) >= Premier_J And .EoMonth(DateSerial(Année, i, 1), 0) <= Dernier_J Then
                    j = j + 1
                    ReDim Preserve Tb_Mois_Disp(1 To j)
                    Tb_Mois_Disp(j) = Tb_Mois(i - 1)
               End If
          Next i
     End With
     If j = 0 Then
          MsgBox "Pas assez de statistiques hebdomadaire pour enregistrer un mois !"
          Exit Sub 'Sortie si aucun mois complet
     End If
     Tb_Mois = Tb_Mois_Disp   'Tb_Mois ne contient que les mois disponibles
    
     'Affichage du formulaire de sélection du mois à enregistrer
     With UsF_Mensuelles
          SDéb = -1: SFin = -1
          .CbB_Liste_Mois.List = Tb_Mois
          .Show
     End With
     Unload UsF_Mensuelles
     If SDéb = -1 And SFin = -1 Then Exit Sub   'Sortie si aucune période choisie
   
     ReDim Tb_Stat_S(1 To Nb_Lgn_Stat, 1 To 1)
     ReDim Tb_Stat_Mois(1 To UBound(Tb_Stat_S, 1), 1 To 1)
   
     'Cas de la 1ère semaine :
     JS = Weekday(DateSerial(Année, Mois_Choisi, 1), vbMonday)
     If JS > 1 Then
          If Not FeuilleExiste("Semaine_" & SDéb) Then
               MsgBox "Il manque l'enregistrement de la semaine " & SDéb
               Exit Sub
          End If
          'Si le jour de début de mois n'est pas un Lundi
          'Ne prendre que les jours du mois
          Set WSh = ThisWorkbook.Worksheets("Semaine_" & SDéb)
          WSh.Protect UserInterfaceOnly:=True
          With WSh.Evaluate(Plg_Données)
               'on mémorise toutes les donnée de la semaine
               Tb_Svg = .Value
               'on efface les données de l'année antérieure
              .Columns(1).Resize(, JS - 1).ClearContents
               'on mémorise la colonne Total
               Tb_Stat_S = .Columns(8).Value
               'On ajoute les valeurs au tableau de stat mensuelles
               For i = 1 To Nb_Lgn_Stat
                    Tb_Stat_Mois(i, 1) = Tb_Stat_Mois(i, 1) + Tb_Stat_S(i, 1)
               Next i
               'On retablit les données effacées
               .Value = Tb_Svg
          End With
          'Pour la boucle sur les semaines complètes on incrémente Sdéb de 1
          SDéb = SDéb + 1
     End If
   
     'Cas de la dernière semaine
     JF = Weekday(WorksheetFunction.EoMonth(DateSerial(Année, Mois_Choisi, 1), 0), vbMonday)
     If JF < 7 Then
          If Not FeuilleExiste("Semaine_" & SFin) Then
               MsgBox "Il manque l'enregistrement de la semaine " & SFin
               Exit Sub
          End If
          'Si le jour de fin de mois n'est pas un dimanche
          'Ne prendre que les jours du mois
          Set WSh = ThisWorkbook.Worksheets("Semaine_" & SFin)
          WSh.Protect UserInterfaceOnly:=True
          With WSh.Evaluate(Plg_Données)
               'on mémorise toutes les donnée de la semaine
               Tb_Svg = .Value
               'on efface les données du mois suivant
               .Columns(1).Offset(, JF).Resize(, 7 - JF).ClearContents
               'on mémorise la colonne Total
               Tb_Stat_S = .Columns(8).Value
               'On ajoute les valeurs au tableau de stat mensuelles
               For i = 1 To Nb_Lgn_Stat
                    Tb_Stat_Mois(i, 1) = Tb_Stat_Mois(i, 1) + Tb_Stat_S(i, 1)
               Next i
               .Value = Tb_Svg
          End With
          'Pour la boucle sur les semaines complètes on décrémente SFin de 1
          SFin = SFin - 1
     End If
   
     'Boucle sur les semaines complètes
     For i = SDéb To SFin
          If Not FeuilleExiste("Semaine_" & i) Then
               MsgBox "Il manque l'enregistrement de la semaine " & i
               Exit Sub
          End If
          Set WSh = ThisWorkbook.Worksheets("Semaine_" & i)
          With WSh
               'on mémorise la colonne Total
               Tb_Stat_S = .Evaluate(Plg_Données).Columns(8).Value
               'On ajoute les valeurs au tableau de stat mensuelles
               For j = 1 To Nb_Lgn_Stat
                    Tb_Stat_Mois(j, 1) = Tb_Stat_Mois(j, 1) + Tb_Stat_S(j, 1)
               Next j
          End With
     Next i
             
     With Wsh_Stat_Mensuelles.Evaluate(Plg_Stat_Mensuelles)
          .Columns(Mois_Choisi).Value = Tb_Stat_Mois
     End With

End Sub

Ça devrait mieux se passer avec ces deux corrections

Amicalement
Alain
 

Pièces jointes

  • Stat Jour Semaine Mois corrigé.xlsm
    81.5 KB · Affichages: 2

mastergate

XLDnaute Nouveau
Bonjour,
je te remercie pour ces modifs, effectivement les résultats sont bien modifiés et exacts..

Nouvelle question, on me demande de rajouter des lignes, et évidemment par ordre alphabétique, est ce que je peut en insérer ou non, et les macros les prendront elles en comptes ??? après je peut aller modifier manuellement les anciennes semaines (on est pas encore a la 35 -ème semaine... )
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…