Sub Worksheet_Activate()
    LireDonnées                         ' On actualise quand on sélectionne la feuille
End Sub
Sub Worksheet_Change(ByVal Target As Range)
    If Target.Count > 1 Then Exit Sub   ' On actualise quand on change l'objet de la recette ou dépense
    If Not Intersect(Target, Range("A27,I27")) Is Nothing Then
         LireDonnées
    End If
End Sub
Sub LireDonnées()
Dim IndexRec%, IndexDep%, ColRecettes%, ColDépenses%, i%, Ligne%, Recette$, Dépense$, Mois$
Application.ScreenUpdating = False
On Error Resume Next
[Recettes].ListObject.DataBodyRange.Delete                              ' On efface les tableaux
[Dépenses].ListObject.DataBodyRange.Delete
IndexRec = 30: IndexDep = 30: ColRecettes = 4: ColDépenses = 12
For i = 1 To 13                                                         ' Pour tous les onglets
    Mois = [Onglets].Cells(i, 1)                                        ' On récupère le nom de l'onglet
    Recette = [A27]: Dépense = [I27]
    With Sheets(Mois)
        Ligne = 8
        While .Cells(Ligne, ColRecettes) <> ""                          ' On récupère toutes les recettes demandées
            If .Cells(Ligne, ColRecettes) = Recette Then
                Range(Cells(IndexRec, "A"), Cells(IndexRec, "G")) = _
                .Range(.Cells(Ligne, "A"), .Cells(Ligne, "G")).Value
                IndexRec = IndexRec + 1
            End If
            Ligne = Ligne + 1
        Wend
        Ligne = 8
        While .Cells(Ligne, ColDépenses) <> ""                          ' On récupère toutes les dépenses demandées
            If .Cells(Ligne, ColDépenses) = Dépense Then
                Range(Cells(IndexDep, "I"), Cells(IndexDep, "O")) = _
                .Range(.Cells(Ligne, "I"), .Cells(Ligne, "O")).Value
                IndexDep = IndexDep + 1
            End If
            Ligne = Ligne + 1
        Wend
    End With
Next i
End Sub