Microsoft 365 Absences dans Planning

eric72

XLDnaute Accro
Bonjour à tous,
Je suis toujours avec mon Planning, ça avance bien mais je rencontre de nouveau un problème, je m'explique:
- Onglet Planning, quand je sélectionne une semaine d'une année, je récupère bien tous les plannings de chacun, en parallèle j'ai un tableau qui s'appelle TbCauseAbs que je remplis pour inscrire les congés, les maladie etc...
- J'aimerais dans mon "Planning" que lorsqu'un collaborateur apparait dans le planning, si une absence est renseignée pour cette date que cela s'incrive dans les colonnes correspondantes à savoir pour le lundi (d:g) pour le mardi (l:eek:) etc...
- J'ai débuté une macro (module1) avec "test" et "NoterAbsence" mais cela ne correspond pas.
- J'ai trouvé une idée qui ne fonctionne pas pleinement:
VB:
Sub test()
Dim NomEquipier As Integer, RangDuJour As Integer, c As Range, madate As Long

Set c = Sheets("Données").Range("TbAbsence").Find(what:=Sheets("Planning").Range("e4").Value, lookat:=xlWhole)
If Not c Is Nothing Then

madate = Sheets("Planning").Range("e4").Value
Application.Calculation = xlCalculationManual
    Application.EnableEvents = False
    For NomEquipier = 1 To 20
            For RangDuJour = 1 To 6
                NoterAbsence NomEquipier, RangDuJour
            Next RangDuJour
    Next NomEquipier
    Application.Calculation = xlCalculationAutomatic
    Application.EnableEvents = True
End If
End Sub
Sub NoterAbsence(NomEquipier As Integer, RangDuJour As Integer)
Dim LigCible As Long, ColCible As Long, madate As Long, datejourL As String, datejourM As String, datejourMe As String, datejourJ As String, datejourV As String, datejourS As String
Dim OffsetLig As Long, OffsetCol As Long, c As Range, c2 As Range

With Sheets("Planning")

    madate = Sheets("Planning").Range("e4").Value
    OffsetLig = 1 * (NomEquipier - 1)
    OffsetCol = 8 * (RangDuJour - 1)
        If RangDuJour = 1 Then 'Récupérer LUNDI
            datejourL = Sheets("Planning").Range("d5")
                .Cells(8 + OffsetLig, 4 + OffsetCol).Value = "IFERROR(INDEX(TbAbsence[#All],MATCH(1,(datejourL>=TbAbsence[[#All],[Date début]])*(TbAbsence[[#All],[Date fin]]>=datejourL)*(TbAbsence[[#All],[Nom]]=8 + OffsetLig, 2 + OffsetCol).Value,"""")"
    End If
End With
End Sub

Avez-vous une petite idée?
Merci beaucoup une nouvelle fois
 

Pièces jointes

  • test.xlsm
    343.2 KB · Affichages: 13
Solution
Re ;)

La macro de #13 doit aussi pouvoir s'écrire comme ceci (pour éviter la boucle FOR qui doit être plus lente) :
VB:
Sub Archive_Absence()
'
Dim LigCible As Long, ColCible As Long, MaDateDebut As Long, MaDateFin As Long

    Application.ScreenUpdating = False

    MaDateDebut = CDate(UsfAjoutAbsence.TxtDebut)
    MaDateFin = CDate(UsfAjoutAbsence.TxtFin)

    LigCible = Application.Match(UsfAjoutAbsence.CbNom, Sheets("Archives").Range("C:C"), 0)
    ColCible = Application.Match(MaDateDebut, Sheets("Archives").Range("2:2"), 0)

    Sheets("Archives").Cells(LigCible + 1, ColCible).Resize(1, MaDateFin - MaDateDebut + 1).Value = UsfAjoutAbsence.CbCause

End Sub

eric72

XLDnaute Accro
Tu veux dire "à part le fait que tu ne gères aucune éventuelle erreur de valeur non trouvée dans la feuille" ?

Rien ne me choque, je ne suis pas assez jeune pour ça. ;)
En revanche, comme dit plus haut, je suis surpris que ton nombre de copies soit correct. Mais si tel est le cas, alors tant mieux. 👍
décidemment tu ne veux vraiment pas me dire ce qui ne va pas, dommage!
 

TooFatBoy

XLDnaute Barbatruc
Re ;)

La macro de #13 doit aussi pouvoir s'écrire comme ceci (pour éviter la boucle FOR qui doit être plus lente) :
VB:
Sub Archive_Absence()
'
Dim LigCible As Long, ColCible As Long, MaDateDebut As Long, MaDateFin As Long

    Application.ScreenUpdating = False

    MaDateDebut = CDate(UsfAjoutAbsence.TxtDebut)
    MaDateFin = CDate(UsfAjoutAbsence.TxtFin)

    LigCible = Application.Match(UsfAjoutAbsence.CbNom, Sheets("Archives").Range("C:C"), 0)
    ColCible = Application.Match(MaDateDebut, Sheets("Archives").Range("2:2"), 0)

    Sheets("Archives").Cells(LigCible + 1, ColCible).Resize(1, MaDateFin - MaDateDebut + 1).Value = UsfAjoutAbsence.CbCause

End Sub
 

eric72

XLDnaute Accro
Re ;)

La macro de #13 doit aussi pouvoir s'écrire comme ceci (pour éviter la boucle FOR qui doit être plus lente) :
VB:
Sub Archive_Absence()
'
Dim LigCible As Long, ColCible As Long, MaDateDebut As Long, MaDateFin As Long

    Application.ScreenUpdating = False

    MaDateDebut = CDate(UsfAjoutAbsence.TxtDebut)
    MaDateFin = CDate(UsfAjoutAbsence.TxtFin)

    LigCible = Application.Match(UsfAjoutAbsence.CbNom, Sheets("Archives").Range("C:C"), 0)
    ColCible = Application.Match(MaDateDebut, Sheets("Archives").Range("2:2"), 0)

    Sheets("Archives").Cells(LigCible + 1, ColCible).Resize(1, MaDateFin - MaDateDebut + 1).Value = UsfAjoutAbsence.CbCause

End Sub
Bonjour,
En effet c'est mieux, je prends, en fait tu attendais que je me débrouille et après tu apportes la solution!!! ;)
Merci beaucoup encore une fois (on est pas a l'abri que j'ai encore besoin de ton aide dans les jours à venir)
Bonne journée
 

Membres actuellement en ligne

Statistiques des forums

Discussions
314 708
Messages
2 112 096
Membres
111 416
dernier inscrit
philipperoy83