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

XL 2019 Sous Total

  • Initiateur de la discussion Initiateur de la discussion Paulle
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Paulle

XLDnaute Occasionnel
Bonsoir,

La formule "=SOUSTOTAL() " pour une colonne n'additionne pas les lignes masquées.

Est-il possible d'obtenir le total d'une ligne ignorant les colonnes masquées.

Merci.
 
Solution
Bonjour Paulle, le forum,

Utilisez le fichier (3) joint avec la macro du 2ème bouton :
VB:
Sub Afficher_Tout()
With [Tableau1]
    .Columns.Hidden = False
    MAJ_Somme
    .AutoFilter: .AutoFilter 'ôte le filtrage automatique
End With
Application.Goto [A1], True 'cadrage
[A2].Select
End Sub

Les 2 boutons et la zone de texte ont la propriété "Ne pas déplacer ou dimensionner avec les cellules".

Sinon ils seraient modifiés quand on masque des colonnes du tableau.

A+
Bonjour sylvanu,

Les colonnes s'affichent, mais pas les lignes qui ont été masquées.
Comme cela ne fonctionnait pas je l'ai mis en commentaire.
 

Pièces jointes

  • 7.jpg
    22.3 KB · Affichages: 54
J'ai tenté une macro "Sub Afficher()", les colonnes masquées s'affichent mai les lignes masquées le restent.
Il y a pourtant une solution dans le classeur de #21.

Enrichi (BBcode):
Sub AfficherToutesLesLignes()
' Afficher toutes les lignes
Dim LigneTS As Long
Dim MaSomme
    Application.ScreenUpdating = False
    On Error Resume Next
    For LigneTS = 1 To Range("Tableau1").ListObject.ListRows.Count
        MaSomme = WorksheetFunction.Sum(Range("Tableau1").ListObject.ListRows(LigneTS).Range)
        Sheets(Range("Tableau1").Parent.Name).Range("Tableau1[#Headers]").Resize(1, 1).Offset(LigneTS, -1).Value = MaSomme
    Next LigneTS
    Range("Tableau1").Rows.Hidden = False
End Sub
 
Dernière édition:
Oups, exact car vous avez un filtre actif sur colonne Somme du à la macro MAJ somme, qu'il faut retirer :
VB:
Sub Afficher()
If ActiveSheet.FilterMode Then ActiveSheet.ShowAllData
With Range("Tableau1")
        .EntireColumn.Hidden = False
        .EntireRow.Hidden = False
End With
End Sub
 
J'ai copié dans le fichier et quand je réinitialise j'obtiens cela.

J'avoue être un peu perdu.
 

Pièces jointes

  • 77.jpg
    128.6 KB · Affichages: 55
J'ai copié dans le fichier et quand je réinitialise j'obtiens cela.
Ma macro ne s'appelle pas "Afficher", mais "AfficherToutesLesLignes".
Donc renomme-la en "Afficher", ce sera peut-être plus simple pour la tester.

De toute façon, pour afficher les lignes du TS, c'est juste la ligne que j'ai mise en rouge en #32.
A toi de la mettre où tu veux dans ton code. 😉
 
Avant d'aller dormir :
VB:
Sub Afficher()
With [Tableau1]
    .AutoFilter: .AutoFilter 'ôte le filtrage automatique
    .Rows.Hidden = False
    .Columns.Hidden = False
End With
End Sub
Bonne nuit.
 
Bonjour Job,

En ligne "L" j'ai copié la colonne "A" pour avoir les valeurs de départ.
Et pour que le tableau soit réinitialisé, je dois faire cela.

Début : je sélectionne une ou plusieurs colonnes.

1-MAJSomme
2-Réinitialisé ( la colonne "A" n'est pas égale à "L")
3-MAJSomme (les lignes restent masquées)
4-Réinitialisé (c'est réinitialisé. "A"="L").

Pour que cela se fasse automatiquement, j'ai ajouté cette macro :

Sub Reinitial()
Call Afficher
Call MAJ_Somme
Call Afficher
End Sub

Penses-tu que c'est correcte ?
 

Pièces jointes

Il me semble avoir correctement suivis tes instructions, mais cela ne réinitialise pas le feuille.
L'instruction que je t'ai donnée n'est pas faite pour réinitialiser la feuille, mais pour afficher toutes les lignes du TS qui ont été masquées.

Or tu ne masques aucune ligne dans ta macro MAJ_Somme(), donc tu ne peux démasquer aucune ligne.
 
Bonjour Paulle, le forum,

Utilisez le fichier (3) joint avec la macro du 2ème bouton :
VB:
Sub Afficher_Tout()
With [Tableau1]
    .Columns.Hidden = False
    MAJ_Somme
    .AutoFilter: .AutoFilter 'ôte le filtrage automatique
End With
Application.Goto [A1], True 'cadrage
[A2].Select
End Sub

Les 2 boutons et la zone de texte ont la propriété "Ne pas déplacer ou dimensionner avec les cellules".

Sinon ils seraient modifiés quand on masque des colonnes du tableau.

A+
 

Pièces jointes

Bonjour à toutes & à tous, bonjour @Paulle
Voici une autre approche :
Je modifie le menu contextuel "Colonne" lorsque je suis sur la feuille concernée (CodeName= Sh_Test), quand tu masques ou tu affiches des colonnes je mets à jour un nom "Masque" qui vaut 0 pour les colonnes du tableau masquées et 1 pour celles qui sont visibles.
La colonne somme fait un SOMMEPROD de chaque ligne et du nom "Masque".
De plus quand tu masques des colonnes du tableau il est filtré sur les sommes non nulles, quand tu réaffiches toutes les colonnes le filtre est enlevé.
Cela ne demande pas d'actions supplémentaires de la part de l'utilisateur.

Voici le code du module standard :
VB:
Sub DéfMasque()
     Dim C As Range
   
     txt = ""
     For Each C In [TS_test[#Headers]].Offset(0, 1).Resize(1, [TS_test[#Headers]].Columns.Count - 1)
          txt = txt & "," & Abs(Not C.EntireColumn.Hidden)
     Next
     txt = "={" & Mid(txt, 2) & "}"
     ThisWorkbook.Names.Add "Masque", txt

End Sub

Sub ChangeMenuContextuelColonnes()

     Dim menuCol As CommandBar
     Dim Ctrl As CommandBarControl

     Set menuCol = Application.CommandBars("Column")
   
     menuCol.Reset
     On Error Resume Next
     menuCol.Controls("Masquer").Delete
     menuCol.Controls("Afficher").Delete
     On Error GoTo 0
   
   
    With menuCol.Controls.Add(Type:=msoControlButton, Temporary:=True)
        .Caption = "&Masquer (personnalisé)"
        .OnAction = "AfficherMasquer"
        .Parameter = "Masquer"
        .BeginGroup = True
    End With
   
    With menuCol.Controls.Add(Type:=msoControlButton, Temporary:=True)
        .Caption = "&Afficher (personnalisé)"
        .OnAction = "AfficherMasquer"
        .Parameter = "Afficher"
    End With
   
End Sub


Sub AfficherMasquer()
   
     Paramètre = CommandBars.ActionControl.Parameter
     Selection.EntireColumn.Hidden = Paramètre = "Masquer"
   
     If Intersect(Selection.EntireColumn, Sh_Test.[TS_Test]) Is Nothing Then Exit Sub
     DéfMasque
   
     With Sh_Test.[TS_Test].ListObject
          AvecMasqués = False
          For Each C In Sh_Test.[TS_Test].EntireColumn
               If C.Hidden Then AvecMasqués = True: Exit For
          Next
          If AvecMasqués Then
               .Range.AutoFilter Field:=.ListColumns("Somme").Index, Criteria1:="<>0"
          Else
               If .AutoFilter.FilterMode Then
                   .AutoFilter.ShowAllData
               End If
          End If
     End With
End Sub

Et celui des événements du Classeur :
Code:
Private Sub Workbook_Deactivate()
          Application.CommandBars("Column").Reset
End Sub

Private Sub Workbook_Open()
     If ActiveSheet Is Sh_Test Then ChangeMenuContextuelColonnes
End Sub

Private Sub Workbook_SheetActivate(ByVal Sh As Object)
     If Sh Is Sh_Test Then
          ChangeMenuContextuelColonnes
     Else
          Application.CommandBars("Column").Reset
     End If
End Sub

Voir le fichier joint
À bientôt
 

Pièces jointes

Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
12
Affichages
436
  • Question Question
Microsoft 365 formule addition
Réponses
4
Affichages
111
  • Question Question
Microsoft 365 Formule Excel
Réponses
4
Affichages
246
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…