Microsoft 365 Macro : Somme automatisée sur plusieurs feuilles.

AntoineLTO

XLDnaute Nouveau
Bonjour à toutes, à tous,

Je commence par dire que je suis nouveau sur les macros, j'y avais touché il y a plusieurs années mais mes souvenirs ce sont envolés... Depuis je pioche à gauche à droite les différentes informations nécessaires pour des tâches basiques.

J'ai besoin aujourd'hui d'automatiser certaines tâches et notamment l'ajout de somme.

Tout d'abord dans mon classeur j'ai effectué des filtres, toujours sur les mêmes critères aux mêmes endroits, cela fonctionne mais je pense que mon code est sujet à futures erreurs puisque je ne comprends pas pourquoi ma "range" ne pose pas de problème car elle était adaptée à la première feuille mais pas aux suivantes. Le nombre de lignes peut varier à la hausse comme à la baisse dans le tableau source et d'un mois à l'autre donc que mettre à la place de $Z$384 pour englober n'importe quel scénario ? .

VB:
Sub Tridesfeuilles()
'
' Tri des feuilles
'

' Filtre pour 23101

    Sheets("23101").Select
    ActiveSheet.Range("$A$2:$Z$384").AutoFilter Field:=1, Criteria1:="<>BC*", Criteria2:="<>NR*"
    ActiveSheet.Range("$A$2:$Z$384").AutoFilter Field:=3, Criteria1:="FACTU"
    ActiveSheet.Range("$A$2:$Z$384").AutoFilter Field:=10, Criteria1:="CVENT"
   
' Filtre 61501

    Sheets("61501").Select
    ActiveSheet.Range("$A$2:$Z$384").AutoFilter Field:=1, Criteria1:="<>BC*", Criteria2:="<>NR*"
    ActiveSheet.Range("$A$2:$Z$384").AutoFilter Field:=3, Criteria1:="FACTU"
    ActiveSheet.Range("$A$2:$Z$384").AutoFilter Field:=10, Criteria1:="CVENT"
   
' Filtre 61503

    Sheets("61503").Select
    ActiveSheet.Range("$A$2:$Z$384").AutoFilter Field:=1, Criteria1:="<>BC*", Criteria2:="<>NR*"
    ActiveSheet.Range("$A$2:$Z$384").AutoFilter Field:=3, Criteria1:="FACTU"
    ActiveSheet.Range("$A$2:$Z$384").AutoFilter Field:=10, Criteria1:="CVENT"
   
' Filtre 61558

    Sheets("61558").Select
    ActiveSheet.Range("$A$2:$Z$384").AutoFilter Field:=1, Criteria1:="<>BC*", Criteria2:="<>NR*"
    ActiveSheet.Range("$A$2:$Z$384").AutoFilter Field:=3, Criteria1:="FACTU"
    ActiveSheet.Range("$A$2:$Z$384").AutoFilter Field:=10, Criteria1:="CVENT"
   
' Filtre 61559

    Sheets("61559").Select
    ActiveSheet.Range("$A$2:$Z$384").AutoFilter Field:=1, Criteria1:="<>BC*", Criteria2:="<>NR*"
    ActiveSheet.Range("$A$2:$Z$384").AutoFilter Field:=3, Criteria1:="FACTU"
    ActiveSheet.Range("$A$2:$Z$384").AutoFilter Field:=10, Criteria1:="CVENT"
   

End Sub

Enfin, une fois ce tri fait je souhaite que, pour les données restantes, faire la somme deux lignes en dessous de la colonne O. Le code que j'utilise fonctionne pour la première feuille, mais j'imagine qu'il n'est pas possible d'enchainer l'opération sans compartimentages supplémentaires.

Le code pour les sommes :
Code:
Sub Rajoutdessommes()
'
' Rajout des sommes
'

'

Dim DerLig As Long
    With Worksheets("23101") 'A adapter
        'Rechercher de la dernière ligne renseignée
        DerLig = .Range("O" & .Rows.Count).End(xlUp).Row
        'Indiquer la somme 2 lignes en-dessous
        .Range("O" & DerLig + 2) = Application.WorksheetFunction.Sum(Range("O3:O" & DerLig))
    End With

Dim DerLig As Long
    With Worksheets("61501") 'A adapter
        'Rechercher de la dernière ligne renseignée
        DerLig = .Range("O" & .Rows.Count).End(xlUp).Row
        'Indiquer la somme 2 lignes en-dessous
        .Range("O" & DerLig + 2) = Application.WorksheetFunction.Sum(Range("O3:O" & DerLig))
    End With
   
Dim DerLig As Long
    With Worksheets("61503") 'A adapter
        'Rechercher de la dernière ligne renseignée
        DerLig = .Range("O" & .Rows.Count).End(xlUp).Row
        'Indiquer la somme 2 lignes en-dessous
        .Range("O" & DerLig + 2) = Application.WorksheetFunction.Sum(Range("O3:O" & DerLig))
    End With
   
Dim DerLig As Long
    With Worksheets("61558") 'A adapter
        'Rechercher de la dernière ligne renseignée
        DerLig = .Range("O" & .Rows.Count).End(xlUp).Row
        'Indiquer la somme 2 lignes en-dessous
        .Range("O" & DerLig + 2) = Application.WorksheetFunction.Sum(Range("O3:O" & DerLig))
    End With
   
Dim DerLig As Long
    With Worksheets("61559") 'A adapter
        'Rechercher de la dernière ligne renseignée
        DerLig = .Range("O" & .Rows.Count).End(xlUp).Row
        'Indiquer la somme 2 lignes en-dessous
        .Range("O" & DerLig + 2) = Application.WorksheetFunction.Sum(Range("O3:O" & DerLig))
    End With
End Sub

Si je ne suis pas clair, dites moi. Je précise que j'ai trouvé le code pour la somme sur ce forum, d'où les commentaires répétés.

Dans tous les cas merci pour le temps que vous m'accorderez.
Cordialement,
 

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

Il ne s'agit pas de tri mais de filtrage.

Vous avez excel 365, et je suppose dans vos feuilles des tableaux de données, aussi je vous suggèrerai d'utiliser les Tableaux Structurés.

Mais en attendant et sans avoir pu tester sur un classeur exemple, vos lignes pour filtrer les données, je les écrirais comme ci-dessous :
VB:
Sub FiltrerFeuilles()
    Dim Feuille As Worksheet
    '
    ' Boucler sur les feuilles idoines
    '
    For Each Feuille In ThisWorkbook.Sheets(Array("23101", "61501", "61503", "61508", "61559"))
        With Feuille.Range("$A$2").CurrentRegion
            .AutoFilter Field:=1, Criteria1:="<>BC*", Criteria2:="<>NR*"
            .AutoFilter Field:=3, Criteria1:="FACTU"
            .AutoFilter Field:=10, Criteria1:="CVENT"
        End With
    Next
End Sub


Cordialement
 
Dernière édition:

AntoineLTO

XLDnaute Nouveau
Bonjour,

Il ne s'agit pas de tri mais de filtrage.

Vous avez excel 365, et je suppose dans vos feuilles des tableaux de données, aussi je vous suggèrerai d'utiliser les Tableaux Structurés.

Mais en attendant et sans avoir pu tester sur un classeur exemple, vos lignes pour filtrer les données, je les écrirais comme ci-dessous :
VB:
Sub FiltrerFeuilles()
    Dim Feuille As Worksheet
    '
    ' Boucler sur les feuilles idoins
    '
    For Each Feuille In ThisWorkbook.Sheets(Array("23101", "61501", "61503", "61508", "61559"))
        With Feuille.Range("$A$2").CurrentRegion
            .AutoFilter Field:=1, Criteria1:="<>BC*", Criteria2:="<>NR*"
            .AutoFilter Field:=3, Criteria1:="FACTU"
            .AutoFilter Field:=10, Criteria1:="CVENT"
        End With
    Next
End Sub



Cordialement
Bonjour,

Merci pour votre réponse. Votre code pour les filtres fonctionne et apparait bien plus concis que le mien.
J'ai pris bonne note de la page concernant l'utilisation des tableaux structurés.
 

Discussions similaires

Réponses
2
Affichages
99