Option Explicit
Public Sub BilanTaches()
'déclaration des variables
Dim laTache As Range, totalTache As Double
'se positionner sur la première tache (AH4)
Set laTache = ThisWorkbook.Sheets("Janvier").Range("AH4")
'boucler sur toutes les taches
While laTache.Text <> ""
'récupérer le total de la tache
totalTache = SommerHeures(laTache)
'écrire le résultat une case en dessous
laTache.Offset(1, 0) = totalTache
'passer à la tache suivant
Set laTache = laTache.Offset(0, 1)
Wend
End Sub
Private Function SommerHeures(tache As Range) As Double
'déclaration des variables
Dim laCell As Range, zoneRecherche As Range, memAdressePremCell As String, motRecherche As String
'initialiser les variables
motRecherche = tache.Text 'on recherche la tache
Set zoneRecherche = ThisWorkbook.Sheets(tache.Parent.Name).Range("B:AF") 'dans les colonnes B à AF de la feuille traitée
'rechercher avec la méthode Find la première cellule contenant le mot recherché dans la feuille active
' xlWhole signifie qu'on recherche la totalité du contenu de la cellule (texte exact)
' le remplacer xlPart pour rechercher une partie du contenu de la cellule
Set laCell = zoneRecherche.Find(motRecherche, , xlValues, xlWhole)
'si une cellule a été trouvé
If Not laCell Is Nothing Then
'mémoriser l'adresse de cette première cellule trouvée
memAdressePremCell = laCell.Address
'boucler sur toutes les cellules contenant le texte recherché
Do
'traiter la cellule trouvée
'ici, on va rajouter au total la valeur de la cellule située 2 cases en dessous
SommerHeures = SommerHeures + laCell.Offset(2, 0).Value
'trouver la cellule suivante contenant le texte recherché
Set laCell = zoneRecherche.FindNext(laCell)
'boucler jusqu'à qu'on revienne sur la première cellule trouvée
Loop Until laCell.Address = memAdressePremCell
End If
End Function