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

XL 2010 Gestion absence enseignant

snoop974

XLDnaute Nouveau
Bonjour ! Voilà mon problème. J'ai un planning de gestion des absences, en colonne j'ai les dates et en ligne le non des enseignants. Pour chaque enseignant je met dans la cellule ou il est absent et je met une lettre représentant le motif d’absence (C, RDVP, P...). Je souhaiterais dans une autre feuille faire un tableau de suivis des absences. C'est a dire une feuille avec pour chaque enseignant les date sou il sera absent, avec nom enseignant avec ces dates d'absence.

Toto | 01/05/2024 | 26/08/2024 | 14/11/2024 ...........

je vois à peu près ce qu'il faudrait faire mais je trouve pas les fonction à mélanger, genre rechercher les colonne non vide correspondant à enseignant et remonter la colonne(date), mais bon je tourne en rond. peut être si possible une autre ligne avec le motif si possible, mais bon c'est pas le plus important.

Merci d'avance pour vos idées
 

job75

XLDnaute Barbatruc
Bonjour snoop974, le forum,

Voyez le fichier joint et le code de la feuille Filtre (clic droit sur l'onglet et Visualiser le code) :
VB:
Private Sub Worksheet_Activate()
Worksheet_Change [B1] 'lance la macro
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
Dim critere$, lig&, i&
critere = UCase([B1]) & "*"
lig = 1
Application.ScreenUpdating = False
Application.EnableEvents = False 'désactive les évènements
If Target.Address = "$B$1" Then [B1].Select
Rows("2:" & Rows.Count).Delete 'RAZ
With Sheets("Source")
    If .FilterMode Then .ShowAllData 'si la feuille est filtrée
    .Cells(1, 3).Resize(, .Columns.Count - 2).Copy Cells(1, 3)
    For i = 2 To .Cells(.Rows.Count, 2).End(xlUp).Row
        If UCase(.Cells(i, 2)) Like critere And Application.CountA(.Cells(i, 3).Resize(, .Columns.Count - 2)) Then
            lig = lig + 1
            .Rows(i).Copy Cells(lig, 1)
        End If
    Next i
End With
For i = Cells(1, Columns.Count).End(xlToLeft).Column To 3 Step -1
    If Application.CountA(Columns(i)) < 2 Then Columns(i).Delete
Next i
With [B1].Validation 'liste de validation
    .Delete 'RAZ
    .Add xlValidateList, Formula1:="=B2:B" & lig
    .ShowError = False
End With
Application.EnableEvents = True 'réactive les évènements
End Sub
Il s'exécute quand on active la feuille ou qu'on modifie une cellule.

La feuille est filtrée à partir du texte entré en B1 qui contient une liste de validation.

A+
 

Pièces jointes

  • Test.xlsm
    22.2 KB · Affichages: 13

job75

XLDnaute Barbatruc
Au lieu d'une liste de validation on peut utiliser une ComboBox (liste déroulante) :
VB:
Private Sub Worksheet_Activate()
ComboBox1_Change 'lance la macro
End Sub

Private Sub ComboBox1_GotFocus()
ComboBox1_Change 'lance la macro
End Sub

Private Sub ComboBox1_Change()
Dim critere$, lig&, i&
critere = UCase(ComboBox1) & "*"
lig = 1
Application.ScreenUpdating = False
Rows("2:" & Rows.Count).Delete 'RAZ
With Sheets("Source")
    If .FilterMode Then .ShowAllData 'si la feuille est filtrée
    .Cells(1, 3).Resize(, .Columns.Count - 2).Copy Cells(1, 3)
    For i = 2 To .Cells(.Rows.Count, 2).End(xlUp).Row
        If UCase(.Cells(i, 2)) Like critere And Application.CountA(.Cells(i, 3).Resize(, .Columns.Count - 2)) Then
            lig = lig + 1
            .Rows(i).Copy Cells(lig, 1)
        End If
    Next i
End With
For i = Cells(1, Columns.Count).End(xlToLeft).Column To 3 Step -1
    If Application.CountA(Columns(i)) < 2 Then Columns(i).Delete
Next i
If lig > 1 Then ComboBox1.List = Range("B2:C" & lig).Value Else ComboBox1.Clear
End Sub
 

Pièces jointes

  • Test(1).xlsm
    65.1 KB · Affichages: 9

Discussions similaires

Réponses
9
Affichages
459
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…