Gestion des heures

cj welch

XLDnaute Occasionnel
bonsoir le forum,

je voudrais modifier le fichier ci-joint que j'ai pu réaliser avec le concours de certain membre de ce forum.

Mon problème se situe principalement a chaque changement d'année, je suis obliger d'effacer les données manuellement de chaque feuille de mon classeur.

Je voudrais, si c'est possible, dans le feuille intro ajouter un code, quand je change d'année, qui m'efface les données enregistrées pour tous les feuilles qui comporte un mois.
Seulement, je voudrais effacer des cellules spécifiques que je détail dans la feuille intro

Cijoint.fr - Service gratuit de dépôt de fichiers


merci de votre aide

je reste a votre disposition

A+
 

ledzepfred

XLDnaute Impliqué
Re : Gestion des heures

salut cj welch,

rassure-toi je ne suis pas devenu "pisteur de tous les posts de cj welch".

As-tu fait appel à notre ami "Henry Gistrair de Macrow"
C'est typiquement une macro que tu peux monter grâce son aide précieuse.

ensuite il suffit de peaufiner le code donné.

a+
 

cj welch

XLDnaute Occasionnel
Re : Gestion des heures

salut ledzepfred,

je serais honoré que tu soi un pisteur de mes post, car ton efficacité et ton écoute n'est plus a démontrer ;).

concernant ta remarque, oui j'ai fait appel a ton ami "Henry Gistrair de Macrow". Seulement pour l'effacement des cellules simple sur une feuille, c'est ok ; mais pour les cases a cocher, c'est beaucoup plus compliquer car si la case n'est pas séléctionné, il ne doit pas y avoir d'action. Pour mémoire, j'ai environ 44 case par feuille.

Regarde le code que j'ai crée avec ton ami pour la feuille de janvier

Sub Macro1()
'
'
Range("J8:M14,J16:M22,J24:M30,J32:M38").Select
Range("J8:M14,J16:M22,J24:M30,J32:M38,J40:M45").Select
Range("J8:M14,J16:M22,J24:M30,J32:M38,J40:M45,P8:p47,Q8:Q47").Select
Selection.ClearContents
End Sub
Je n'arrive pas a étendre la selection aux autres feuilles sachant qu'elles sont identiques.



A+
 
Dernière édition:

ledzepfred

XLDnaute Impliqué
Re : Gestion des heures

RE,

tu as raison et tort!!
rien ne t'empêche de sélectionner une case à cocher durant l'enregistrement pour récupérer le code de sélection d'une case à cocher mais j'en conviens c'est pas la panacée.

Moi si j'avais créé ce fichier j'aurais nommé la case à cocher avec le numéro de ligne : au lieu d'avoir une case à cocher nommé checbox52 en ligne 14, je l'aurais nommée checkbox14, c'est beaucoup plus pratique ensuite pour faire quelque chose du genre

for i= 8 to 44
ActiveSheet.Shapes("Check Box " & i).Select
Selection.Value = False
next

Dans ton exemple s'il n'y a pas d'autre objet que les cases à cocher il suffit d'écrire pour toutes les cases à cocher du feuillet actif, leur affecter la valeur false

montre-nous ton code qu'Henry t'a fourni:D

EDIT :j'avais pas vu le code dans ton message

a+
 

ledzepfred

XLDnaute Impliqué
Re : Gestion des heures

re...

ai trouvé sur developpez.com FAQ MS-Excel - Club d'entraide des développeurs francophones(en tapant google:for each activesheet.shapes checkbox) ce code :

Code:
 Dim Cb As CheckBox 
    'Boucle sur les checkboxes formulaires de la Feuil1 
    For Each Cb In Feuil1.CheckBoxes 
        'si la case est cochée 
        '(utilisez xlOff pour vérifier le statut "décoché") 
        If Cb.Value = xlOn Then 
            Debug.Print Cb.Name 
        End If 
    Next Cb 
End Sub
Adapté à ton besoin cela donne

Code:
 Dim Cb As CheckBox 
    'Boucle sur les checkboxes formulaires de la Feuil1 
    For Each Cb In activesheet.CheckBoxes 
        Cb.Value = xloff
    Next Cb 
End Sub

concernant le fait que tu dois appliquer ton code effacement sur plusieurs feuillets, il faut simplement faire une boucle grâce à sheets.count (qui compte le nb de feuillets dans ton classeur)
du genre : si tu as 14 feuilles dans ton classeur et que la première feuille à traiter est positionnée après ta feuille info

Code:
For i = 1 To Sheets.Count - 2 '(14-2 égal 12)
ActiveSheet.Next.Select

'mon code à appliquer à chaque feuillet

Next

enfin ton code
Code:
Range("J8:M14,J16:M22,J24:M30,J32:M38").Select
Range("J8:M14,J16:M22,J24:M30,J32:M38,J40:M45").Se lect
Range("J8:M14,J16:M22,J24:M30,J32:M38,J40:M45,P8:P 47,Q8:Q47").Select
Selection.ClearContents

peut être simplifié en
Code:
Range("J8:M14,J16:M22,J24:M30,J32:M38,J40:M45,P8:Q47").ClearContents


A+
 
Dernière édition:

cj welch

XLDnaute Occasionnel
Re : Gestion des heures

salut ledzepfred,

j'ai consrtuis le code suivant :

Private Sub CommandButton1_Click()
r = MsgBox("Voulez vous lancer l'effacement ?", vbYesNo, "Effacement ?")
If r = 6 Then
For i = 1 To Sheets.Count - 2 '(14-2 égal 12)
ActiveSheet.Next.Select
Range("J8:M14,J16:M22,J24:M30,J32:M38,J40:M45,P8:Q47").ClearContents

Next

Dim Cb As CheckBox
'Boucle sur les checkboxes formulaires de la Feuil1
For Each Cb In activesheet.CheckBoxes
Cb.Value = xloff
Next Cb
End if
End Sub

Ce code semble marché mais la boucle ne s'arrete pas.
peut tu me dire ou est mon erreur ?

De plus, comment doit on faire pour attacher ce code a la liste déroulante


A+
 

ledzepfred

XLDnaute Impliqué
Re : Gestion des heures

salut,

essayes ceci :
Code:
Private Sub CommandButton1_Click()
Dim Cb As CheckBox 
r = MsgBox("Voulez vous lancer l'effacement ?", vbYesNo, "Effacement ?")
If r = 6 Then
     For i = 1 To Sheets.Count - 2 '(14-2 égal 12)
          ActiveSheet.Next.Select
          [COLOR="red"]Feuille=activesheet.name[/COLOR]
        [COLOR="red"]  With Sheets(Feuille)[/COLOR]
               .Range("J8:M14,J16:M22,J24:M30,J32:M38,J40:M45,P8:Q 47").ClearContents
               For Each Cb In [COLOR="Red"]Sheets(Feuille).[/COLOR]CheckBoxes 'Boucle sur les checkboxes formulaires de la Feuille active
                    Cb.Value = xloff
               Next Cb 
          [COLOR="red"]End With[/COLOR]
     Next[COLOR="red"] i[/COLOR]
End if
End Sub
il faut mettre la boucle sur les cases à cocher dans la boucle sheets.count pour que le code s'éxécute dans tous les feuillets.
Ta boucle infinie est due je pense au fait que c'est un commandbutton qui déclenche la macro, or si tu dis Range(blablabla) dans une procédure Private sub, excel va sélectionner la plage du feuillet sur lequel se trouve ton bouton quoi déclenche cette procédure (donc en fait tu lui dis active le feuille suivant puis sélectionnes la plage BLABLABLA il retourne donc sur le premier feuillet, la déclaration en variable du nom du feuillet actif et l'utilisation de with end with permet de solutionner le pb puisque là tu indiques à excel sur quel feuillet tu souhaites réaliser la macro.

J'ai pas testé mais ça doit le faire.

a+
 
Dernière édition:

cj welch

XLDnaute Occasionnel
Re : Gestion des heures

salut ledzepfred,

je viens de tester le code et malheuresement, j'ai un message d'erreur qui me renvoi a la ligne .Range("J8:M14,J16:M22,J24:M30,J32:M38,J40:M45,P8:Q 47").ClearContents

J'ai ensuite, isolé l'erreur pour voir si les cases a coché se dépointaient et la aussi cela n'a pas fonctionné. Je viens de changer des codes sur mon fichier et là j'ai compris
ta remarque :

for i= 8 to 44
ActiveSheet.Shapes("Check Box " & i).Select
Selection.Value = False
next

Je peut eventuellement modifier les noms des check box pour eventuellement utiliser ton code qui me semble plus logique.
Quand pense tu ?

Enfin, je me permet de te rappeler que je voudrais que cette macro fonctionne au changement d'année.

Dans l'attente de te lire

Cordialement
A+
 

ledzepfred

XLDnaute Impliqué
Re : Gestion des heures

cj welch,

pourquoi excel ne veut pas que tu effaces des données dans un feuillet,

sélcetionnes J8: M14 et appuies sur la touche Del (en manuel)....

que se passe-t'il?

ça marche pas hein mais maintenant tu sais pourquoi et quel code il faut ajouter pour que ça fonctionne....

Pour la date, il faut simplement que la macro compare la date du jour (en vba ça s'appelle Date) avec la date de dernière modification (voir ce lien https://www.excel-downloads.com/thr...ate-de-modification-dun-fichier-excel.100823/, un petit code de JCGL utile en la cirsconstance)
j'étudies également la possibilité de modifier les noms des checkbox par macro pour pas que tu y passes tes fêtes.

Dis-moi si tu as trouvé pour l'erreur sur range (c'est facile!!!)
A+
 
Dernière édition:

cj welch

XLDnaute Occasionnel
Re : Gestion des heures

re,

je viens en effet trouver l'erreur sur range. Pourquoi je ne l'ai pas vue plus tot. quelle c... que je suis.

Concernant la date, j'ai une list box en A2 et je voudrais simplement que lorsque je change l'année, le code s'active.

je vais aussi commencer a modifier le nom des checkbox pour ne pas abuser de ta gentillesse.

A+
 

ledzepfred

XLDnaute Impliqué
Re : Gestion des heures

re...

ben tu vois tu progresses, avoues que c'est plus jouissif que si on te donne la réponse toute cuite

pour les textbox, c'est comme tu veux mais il serait bon de voir si le code que je t'ai transmis fonctionne, fais un essai sur une copie de ton fichier
pour la date : il suffit de mettre une autre condition

Code:
if year(Date)<> year(Range("A2").value)

reste du code

end if

end sub

a+
 

ledzepfred

XLDnaute Impliqué
Re : Gestion des heures

re...

en faisant des tests sur la date j'ai découvert la macro Wo rkSheet_Change du feuillet intro, je ne comprends pas ta première condition :
Code:
If Application.Intersect(Target, Range("a2")) Is Nothing Then
End If
car qu'elle soit remplie ou pas ça ne conditionne pas la suite de l'execution de la macro
sinon le reste du code peut être simplifier par
Code:
Private Sub WorkSheet_Change(ByVal Target As Range)
If Application.Intersect(Target, Range("a2")) Is Nothing Then
End If
Dim I, J, F As Integer
Application.ScreenUpdating = False
For I = 1 To Sheets.Count - 2 '(14-2 égal 12)
    ActiveSheet.Next.Select
    feuille = ActiveSheet.Name
    With Sheets(feuille)
        .Unprotect
        For J = 8 To 53
            If .Range("c" & J).Value = "" Then
                .Rows(J).EntireRow.Hidden = True
            Else:
                .Rows(J).EntireRow.Hidden = False
            End If
        Next J
          .Protect
    End With
Next I
End Sub

sinon pour le sujet qui nous occupe, la condition suivante permet d'effectuer ce que tu veux

Code:
if year(Date)<> Range("A2").value
reste du code
end if

end sub

pourquoi utiliser un commandbutton et pas s'appuyer sur la précédente procédure simplifiée, ainsi en changeant A2, le code s'executerait...

a+
 
Dernière édition:

cj welch

XLDnaute Occasionnel
Re : Gestion des heures

salut ledzepfred,

Concernant ta dernière remarque
pourquoi utiliser un commandbutton et pas s'appuyer sur la précédente procédure simplifiée, ainsi en changeant A2, le code s'executerait...

C'est ce que je dit depuis le début, je me suis mal exprimé apparament. Excuse moi.

Concernant ta 1ère remarque
If Application.Intersect(Target, Range("a2")) Is Nothing Then
End If

Je suis incapable de te dire a quoi serre ce code. Tu as simplifi2 de façon incroyable le précedent code. Bravo. Tu as compris que le but est de masquer les lignes qui n'ont pas de chiffre. j'aimerais faire evoluer ce code pour les lignes TOTAL. En effet, pour que la ligne TOTAL reste affiché, j'ai inscrit en colonne C, un 1. Crois tu qu'il soit possible d'améliorer ce code pour que la ligne TOTAL s'efface s' il n'y a pas de jour avant ou si c'est un dimanche et ou un samedi.

Enfin, j'ai essayé le code

for i= 8 to 44
ActiveSheet.Shapes("CheckBox " & i).Select
Selection.Value = False
next

j'ai eu un message d'erreur me disant que l'element portant ce nom est introuvable. Comme je n'arrive pas pour le moment a changer le nom de mes checkbox, j'ai modifer le code et inscrit i=1 à 26, et la non plus cela n'as pas marché.
je n'arrive pas a modifier, le nom des checkbox :
- j'ouvre la boite de propirété, je modifie le nom et j'ai un message nom ambigue ;
- je fait la même chose et je bloc la macro qui porte le même nom et cela ne marche pas toujours
- je supprime le checkbox et j'en crèe un autre, cela ne marche plus
- j'arrive a changer le nom, une nouvelle ligne de code se crèe, je copie la partie manquante du code et ça ne marche encore pas
qu'est ce que j'ai fait comme erreur ? je n'arrive pas à la voire!

Dans l'attente de te lire

A+
 
Dernière édition:

ledzepfred

XLDnaute Impliqué
Re : Gestion des heures

salut cj welch,

renommer les checkbox n'est pas si simple, c'est pourquoi je t'avais proposé de le faire par macro (si tu sélectionnes checkbox5 et le modifies en 13, il faut au préalable renommer le 13 sinon tu aura l'erreur Nom ambigu et après il faut renommer les procédures) mais finalement tout cela ne sera pas necessaire, le code ci-dessous permet d'obtenir le resultat escompté sans prendre la peine de nommer les checkbox dans la procédure :

Code:
Dim cb As OLEObject
With Sheets(Feuille)
  For Each cb In .OLEObjects
    cb.Object.Value = False
  Next cb
End With

en ce qui concerne la ligne que tu comprends pas
Code:
If Application.Intersect(Target, Range("a2")) Is Nothing Then
elle signifie que le code de la procédure doit s'effectuer que si target qui est la cellule qui a été modifiée (c'est une procédure WorkSheet_Change) n'est pas la cellule A2, cette macro se déclenche dès qu'une autre cellule du feuillet est modifiée, mais si le End if était placée avant le End Sub, il ne s'éxecuterait dans sa totalité que dans ce cas, tel qu'il est placé cette condition ne sert à rien.

Du coup une question : tu souhaites masquer les lignes suite à quelle action

Le code pour la procédure d'effacement doit s'effectuer quand on modifie A2, il sera donc au final :

Code:
Private Sub WorkSheet_Change(ByVal Target As Range)
If Target.Address = "$A$2" And Target.Value <> Year(Date) Then
Dim cb As OLEObject
r = MsgBox("Voulez vous lancer l'effacement ?", vbYesNo, "Effacement ?")
 If r = 6 Then
   For i = 1 To Sheets.Count - 2 '(14-2 égal 12)
      ActiveSheet.Next.Select
      Feuille = ActiveSheet.Name
      With Sheets(Feuille)
        .Range("J8:M14,J16:M22,J24:M30,J32:M38,J40:M45,P8:Q47").ClearContents
        For Each cb In .OLEObjects
          cb.Object.Value = False
        Next cb
      End With
    Next i
  End If
End If
End Sub

reste à y integrer le code qui masque les lignes mais pour cela tu dois répondre à ma question précédente, on peut également l'améliorer mais j'aimerai que tu remettes le fichier avec des explications dans la feuille janvier pour que cela soit plus facile à comprendre

a+
 
Dernière édition:

Discussions similaires

Réponses
11
Affichages
403

Statistiques des forums

Discussions
312 286
Messages
2 086 812
Membres
103 392
dernier inscrit
doc_banane