XL 2016 Pb planning lors demande de congés sur 2 mois différents

younik

XLDnaute Nouveau
Bonjour,

Je n'arrive pas a résoudre un problème sur une feuille de planning qui utilise un code VBA pour remplir les cellules avec le motif d'absence d'un salarié.
Tout fonctionne correctement quand les date sont sur un mois .

Par contre il me rajoute toujours un congé en fin du mois suivant qui n'a pas lieu d'être..

Je ne vois pas comment éviter cela.

Je vous met le fichier en copie .

Younik
 

Pièces jointes

  • Planning.xlsm
    674.7 KB · Affichages: 14

sousou

XLDnaute Barbatruc
bonjour
Modifie comme ceci et fait des tests
Sub ddeConge()
' ne pas ajouter d'autres onglets avant le premier mois ou changer la valeur suivante
origineOnglet = 1
For Each cel In Sheets("Congés").Range("F5:F500")
If cel.Value <> "" Then

For quand = cel.Offset(0, -2) To cel.Offset(0, -1)
onglet = Month(quand) + origineOnglet
Sheets(onglet).Select
nom = Sheets("congés").Range("B4")
If TYPEJOUR(CDate(quand)) = 0 Then 'Lundi à vendredi ou jours feries
jour = Day(CDate(quand))
' MsgBox jour
'Else
' Debug.Print quand

' End If

Set colJour = Sheets(onglet).Rows(12).Find(Format(jour, "00"), LookIn:=xlValues)
Set ligneNom = Sheets(onglet).Columns(1).Find(nom, LookIn:=xlValues)
If colJour Is Nothing Or ligneNom Is Nothing Then
MsgBox "Erreur demande sur ligne " & cel.Row
Else

Debug.Print onglet, Sheets(onglet).Name, jour, nom, colJour.Column, ligneNom.Row
Sheets(onglet).Cells(ligneNom.Row, colJour.Column).Offset(0, 0) = cel.Value

End If
End If
Next
End If
Next
 

vgendron

XLDnaute Barbatruc
Hello

une proposition de code corrigé

1) utiliser les tables structurées: t_Congés dans ta feuille congés
pS: les colonnes à droite pour lister les jours de congés, servent vraiment à quelque chose ??


j'ai pas creusé, mais dans ton code initial,
-tu prends toujours le nom en B4 de la feuille Congés
==> si tu as plusieurs employés à traiter, les congés seront toujours affectés au meme employé.
il me semble que lorsque tu determines l'onglet, tu le fais sur la date de début. au lieu de la date en cours de traitement "Quand"
 

Pièces jointes

  • Planning.xlsm
    713.5 KB · Affichages: 6

younik

XLDnaute Nouveau
Merci Vgendron

Oui dans premier temps je voulais faire le test sur un employé je n'avais pas fini mon script.

Mais je vois que tu as adapté merci en tout cas tout est fonctionnel.

Pour les colonnes à droite c'était un test que j'avais fait à l'origine mais effectivement ça ne sert pas

Merci beaucoup
Je suis débutant donc j'avance à petit pas.
 

younik

XLDnaute Nouveau
Bonjour,
Je sollicite à nouveau votre aide en VBA j'ai bien avancé dans mon fichier .

Je voudrais permettre dans mon tableau de données que je puisse faire une mise à jour ou suppression .

Sois sous forme de bouton ou lorsque le tableau est mise à jour.

Merci d'avance pour vos idées
Yannick
 

Pièces jointes

  • Planning.xlsm
    676.1 KB · Affichages: 4

vgendron

XLDnaute Barbatruc
bonjour

déjà, pourquoi n'as tu pas utilisé le code que je t'ai fourni? (peut etre t'es tu trompé de fichier?)

et.. comme je ne vois pas vraiment l'évolution du fichier.. je ne vois pas vraiment ce que tu veux faire.
supprimer ou modifier une ligne de quel tableau (quelle feuille?)
 

younik

XLDnaute Nouveau
bonjour

déjà, pourquoi n'as tu pas utilisé le code que je t'ai fourni? (peut etre t'es tu trompé de fichier?)

et.. comme je ne vois pas vraiment l'évolution du fichier.. je ne vois pas vraiment ce que tu veux faire.
supprimer ou modifier une ligne de quel tableau (quelle feuille?)
Pourtant j'ai bien utilisé ton code
Oui pardon je n'ai pas assez détaillé
sur la feuille congés je voudrais que les mise à jour du tableau soit reporté sur les mois concernés et supprime les dates de celle qui ont été supprimés.

Je sais pas si c'est claire
 

vgendron

XLDnaute Barbatruc
Je pense que tu t'es encore trompé ;)

pas grave.. j'ai réalisé la macro pour supprimer la ligne qui est selectionnée dans la table

sur le meme principe que la première macro: au lieu de mettre le congé, on met ..rien.. = on efface

VB:
Sub SupprimerCongé()

    If ActiveCell.ListObject Is Nothing Then
        MsgBox "Cliquez sur la ligne à supprimer"
        Exit Sub
    End If
    
    With Sheets("Congés").ListObjects("t_Congés") 'avec la table strucuturée "t_Congés" de la feuille "Congés"
        LigToSup = ActiveCell.Row - .Range.Row
        TypeCongés = .DataBodyRange(LigToSup, 4) 'on récupère le type de congés
        Nom = .DataBodyRange(LigToSup, 1) 'on récupère le nom
        deb = .DataBodyRange(LigToSup, 2) 'la date de début de congés
        fin = .DataBodyRange(LigToSup, 3) ' date de fin de congés
        .ListRows(LigToSup).Delete
    End With
    
    For quand = deb To fin 'pour chaque jour de congés
        onglet = Format(Month(quand), "00") 'on récupère l'onglet sur lequel enregistrer le jour
        If TYPEJOUR(CDate(quand)) = 0 Then '
            With Sheets(onglet) 'avec l'onglet
                Set ColJour = .Rows(12).Find(Format(Day(quand), "00"), LookIn:=xlValues) 'on cherche la colonne du jour
                Set LigneNom = .Columns(1).Find(Nom, lookat:=xlWhole) 'on cherche la ligne du nom
                If ColJour Is Nothing Or LigneNom Is Nothing Then
                    MsgBox "Erreur demande sur ligne " & i
                Else
                    .Cells(LigneNom.Row, ColJour.Column).Offset(0, 0) = "" 'on efface le congé
                End If
            End With
        End If
    Next quand

End Sub
 

vgendron

XLDnaute Barbatruc
pour modifier.. par contre...
en l'état, ca correspond à supprimer d'abord la ligne et la recréer..

sinon pour modifier il faudrait
1) effacer les congés déjà enregistrés (= macro supprimer MAIS SANS la supression de la ligne dans la table)
2) macro enregistrer les congés..: 1ere macro déjà faite
 

vgendron

XLDnaute Barbatruc
ca donnerait "simplement" ceci
VB:
Sub SupprimerModifierCongé()
    
    If ActiveCell.ListObject Is Nothing Then
        MsgBox "Cliquez sur la ligne à modifier/supprimer"
        Exit Sub
    End If
    Supprimer = MsgBox("Souhaitez vous Supprimer la ligne (OUI) ou Modifier la ligne(NON)", vbYesNo) = vbYes
    With Sheets("Congés").ListObjects("t_Congés") 'avec la table strucuturée "t_Congés" de la feuille "Congés"
        LigToSup = ActiveCell.Row - .Range.Row
        TypeCongés = .DataBodyRange(LigToSup, 4) 'on récupère le type de congés
        Nom = .DataBodyRange(LigToSup, 1) 'on récupère le nom
        deb = .DataBodyRange(LigToSup, 2) 'la date de début de congés
        fin = .DataBodyRange(LigToSup, 3) ' date de fin de congés
        If Supprimer Then
            .ListRows(LigToSup).Delete
        End If
    End With
    
    
    For quand = deb To fin 'pour chaque jour de congés
        onglet = Format(Month(quand), "00") 'on récupère l'onglet sur lequel enregistrer le jour
        If TYPEJOUR(CDate(quand)) = 0 Then '
            With Sheets(onglet) 'avec l'onglet
                Set ColJour = .Rows(12).Find(Format(Day(quand), "00"), LookIn:=xlValues) 'on cherche la colonne du jour
                Set LigneNom = .Columns(1).Find(Nom, lookat:=xlWhole) 'on cherche la ligne du nom
                If ColJour Is Nothing Or LigneNom Is Nothing Then
                    MsgBox "Erreur demande sur ligne " & i
                Else
                    .Cells(LigneNom.Row, ColJour.Column).Offset(0, 0) = "" 'on efface le congé
                End If
            End With
        End If
    Next quand
    If Not Supprimer Then ddeConge 'comme il s'agit d'une modif, on relance la macro pour enregistrer les nouveaux congés
End Sub
 

Discussions similaires

Statistiques des forums

Discussions
315 093
Messages
2 116 132
Membres
112 667
dernier inscrit
foyoman