Bonjour Zinou019,
Ma proposition en pièce jointe.
J'ai apporté à ton classeur les modifications suivantes :
- J'ai supposé que la colonne "MAT." contenait un matricule identique pour les enfants d'une même famille (nécessaire car tu veux compter le nombre d'enfants de cette famille entre 6 et 18 ans)
- J'ai ajouté une feuille "Paramètre" dans laquelle se trouve 2 cellules colorisées avec les couleurs désirées et nommées afin de pouvoir les récupérer dans le code VBA (Cette technique te permet de modifier les couleurs de fonds rouge et orange pour d'autres couleurs si tu le désires).
- J'ai ajouté un bouton permettant d'exécuter le code de colorisation.
- Lors de l'ouverture du classeur, le code VBA de colorisation est automatiquement exécuté.
Ci dessous le code VBA commenté :
Option Explicit
'Déclaration des constantes pour tout le module
Const c6Ans = 6
Const c18Ans = 18
Sub Recoloriser()
Application.Cursor = xlWait
mefAges
Application.Cursor = xlDefault
MsgBox "Fin du traitement de colorisation", vbExclamation, "OK"
End Sub
Sub mefAges()
'Déclaration des constantes - A ajuster si besoin
Const cSheetNumber = 1
Const cColMatricule = 1
Const cColDateNaissance = 4
Const cColNombre = 9
Const cColCouleurDeb = 3
Const cColCouleurFin = 8
'Déclaration des variables utilisées dans la suite de la procédure
Dim oSheet As Worksheet
Dim oRange As Range
Dim lRowMax As Long
Dim lRow As Long, iNb As Integer
Dim lCouleur6Ans As Long, lCouleur18Ans As Long
Dim i As Long
Dim lRowDeb As Long
Dim sMatricule As String
Dim lAge As Integer
'Initialisation des couleurs à utiliser
lCouleur6Ans = ThisWorkbook.Names("Couleur6Ans").RefersToRange.Interior.Color
lCouleur18Ans = ThisWorkbook.Names("Couleur18Ans").RefersToRange.Interior.Color
'Affectation de la feuille à modifier
Set oSheet = ThisWorkbook.Worksheets(cSheetNumber)
'Recherche de la dernière ligne renseignée dans la feuille
lRowMax = oSheet.Cells(oSheet.Rows.Count, 1).End(xlUp).Row
'On initialise toutes les couleurs de fond en transparent
Set oRange = oSheet.Range(oSheet.Cells(2, cColCouleurDeb), oSheet.Cells(lRowMax, cColCouleurFin))
oRange.Interior.ColorIndex = 0
'On efface le nombre d'enfants allocataires
Set oRange = oSheet.Range(oSheet.Cells(2, cColNombre), oSheet.Cells(lRowMax, cColNombre))
oRange.Value = ""
'On initialise les variables du traitement
sMatricule = ""
iNb = 0
lRowDeb = 2
'On boucle sur toutes les lignes renseignées du tableau
For i = 2 To lRowMax
'On affecte la plage de cellules à coloriser
Set oRange = oSheet.Range(oSheet.Cells(i, cColCouleurDeb), oSheet.Cells(i, cColCouleurFin))
'On récupère l'âge à partir de la date de naissance
lAge = recupAge(oSheet.Cells(i, cColDateNaissance).Value)
'On colorise le fond de la plage de cellules en fonction de l'âge récupéré
Select Case lAge
Case Is = c6Ans
oRange.Interior.Color = lCouleur6Ans
Case Is = c18Ans
oRange.Interior.Color = lCouleur18Ans
End Select
'Dans le cas où le matricule n'est pas le même que le précédent
If sMatricule <> CStr(oSheet.Cells(i, cColMatricule).Value) Then
'Si le nombre d'enfants entre 6 et 18 ans est plus grand que 0, on l'indique dans la première ligne de la famille précédente
If iNb > 0 Then
oSheet.Cells(lRowDeb, cColNombre).Value = iNb
End If
'On affecte le nouveau matricule dans la variable
sMatricule = CStr(oSheet.Cells(i, cColMatricule).Value)
'Si l'enfant a entre 6 et 18 ans, on donne la valeur 1 au nombre d'enfant
If lAge = c6Ans Then
iNb = 1
End If
'On stocke le numéro de la première ligne pour la famille
lRowDeb = i
Else
'Si le matricule est identique à celui stocké et si l'enfant a entre 6 et 18 ans on incrémente de 1
If lAge = c6Ans Then
iNb = iNb + 1
End If
End If
Next
'Si le nombre d'enfants entre 6 et 18 ans est plus grand que 0, on l'indique dans la première ligne de la dernière famille
If iNb > 0 Then
oSheet.Cells(lRowDeb, cColNombre).Value = iNb
End If
End Sub
'Fonction retournant 6, 18 ou 0 suivant la date de naissance de l'enfant
Function recupAge(dDateNaissance As Variant) As Long
Dim lDiff As Long
'On s'assure la la valeur en entrée est bien une date
If IsDate(dDateNaissance) Then
'On calcule l'age par différence en années entre la date de naissance et la date du jour
lDiff = DateDiff("yyyy", CDate(dDateNaissance), Now())
'On affecte la valeur de retour suivant le résultat obtenu
Select Case lDiff
Case Is >= 18
recupAge = c18Ans
Case Is >= 6
recupAge = c6Ans
Case Else
'Dans le cas où l'enfant a moins de 6 ans on renvoie 0
recupAge = 0
End Select
Else
'Dans le cas où la valeur en entrée n'est pas une date, on renvoie 0
recupAge = 0
End If
End Function