• 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+
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
 
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
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
    77.jpg
    128.6 KB · Affichages: 55
VB:
Sub Afficher()
With Range("Tableau1")
        .AutoFilter
        .EntireColumn.Hidden = False
        .EntireRow.Hidden = False
        .AutoFilter
End With
End Sub
Test5.gif
 
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

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
432
  • Question Question
Microsoft 365 formule addition
Réponses
4
Affichages
110
  • Question Question
Microsoft 365 Formule Excel
Réponses
4
Affichages
245
Réponses
5
Affichages
209
Retour