XL 2010 Créer ListObject + Ligne Total

cathodique

XLDnaute Barbatruc
Bonjour,

Je transforme une plage en tableau structuré en utilisant le bout de code ci-dessous.
Mais je rencontre une difficulté (en fait 2):
1- Pourquoi lors de l'activation de la ligne 'Totals', le mot 'Total' ne s'affiche pas en 1ère colonne
2- Aucun résultat ne s'affiche dans la ligne total
VB:
With ShBilan
' Définir la plage pour le ListObject
      Set Rng = .Range("A" & dl + 1).Resize(UBound(Tall), UBound(Tall, 2))
      ' Créer le ListObject
      .ListObjects.Add(xlSrcRange, Rng, , xlYes).Name = "Tall"
      .ListObjects("Tall").TableStyle = "TableStyleLight16"
      .ListObjects("Tall").ShowAutoFilter = False
      ' Activer la ligne Totaux
      .ListObjects("Tall").ShowTotals = True
      ' Ajouter des formules de somme dans la ligne Totaux pour chaque colonne
      For i = 2 To .ListObjects("Tall").ListColumns.Count
         .ListObjects("Tall").ListColumns(i).TotalsCalculation = xlTotalsSum
      Next i
End With

En vous remerciant par avance.

Bon week-end.
 
Solution
Ah oui dans ton fichier il y a des apostrophes dans les titres, il faut les doubler :
VB:
      With .ListObjects("Tall").Range
         For i = 2 To .Columns.Count
            .Cells(.Rows.Count, i) = "=SUBTOTAL(109," & "[" & Replace(.Cells(1, i), "'", "''") & "])"
         Next i
      End With

cathodique

XLDnaute Barbatruc
Bonjour cathodique,

A la fin remplace la boucle par :
VB:
With .ListObjects("Tall").Range
    For i = 2 To .Columns.Count
        .Cells(.Rows.Count, i) = "=SUBTOTAL(109," & "[" & .Cells(1, i) & "])"
    Next i
End With
A+
Bonjour @job75 ,

Merci beaucoup. Mais le code plante, erreur 1004: Erreur définie par l'application ou par l'objet

Bonne journée.
 

Pièces jointes

  • Ligne Total VBA.xlsm
    18.8 KB · Affichages: 5

job75

XLDnaute Barbatruc
Ah oui dans ton fichier il y a des apostrophes dans les titres, il faut les doubler :
VB:
      With .ListObjects("Tall").Range
         For i = 2 To .Columns.Count
            .Cells(.Rows.Count, i) = "=SUBTOTAL(109," & "[" & Replace(.Cells(1, i), "'", "''") & "])"
         Next i
      End With
 

Pièces jointes

  • Ligne Total VBA.xlsm
    16.7 KB · Affichages: 9

cathodique

XLDnaute Barbatruc
Ah oui dans ton fichier il y a des apostrophes dans les titres, il faut les doubler :
VB:
      With .ListObjects("Tall").Range
         For i = 2 To .Columns.Count
            .Cells(.Rows.Count, i) = "=SUBTOTAL(109," & "[" & Replace(.Cells(1, i), "'", "''") & "])"
         Next i
      End With
Stp, comment t'es-tu rendu compte qu'il y avait des apostrophes dans les titres.

Tout le tableau est obtenu par code. Je ne vois pas les apostrophes.
Pour infos, les titres de lignes et de colonnes ont été extraites de 2 dictionnaires.
Est-ce la cause de la présence de ces apostrophes?

En tout cas, chapeau ton code fonctionne parfaitement.
 

TooFatBoy

XLDnaute Barbatruc
Bonjour,

1- Pourquoi lors de l'activation de la ligne 'Totals', le mot 'Total' ne s'affiche pas en 1ère colonne
Bizarre : chez moi il s'affiche.

2- Aucun résultat ne s'affiche dans la ligne total
Bizarre : chez moi il y a un total qui s'affiche, mais seulement pour la dernière colonne.


La ligne des totaux que tu ajoutes en fin de TS est capable de calculer toute seule la somme d'une colonne, donc inutile d'y mettre une formule, autant laisser Excel déterminer ladite formule. ;)

Je te propose donc ceci :
VB:
Sub MonTbS()
'
    With shBilan

        ' Définir la plage pour le ListObject
        Set Rng = .Range("A3:J6")

        ' Créer le Tableau Structuré
        .ListObjects.Add(xlSrcRange, Rng, , xlYes).Name = "Tall"
        .ListObjects("Tall").TableStyle = "TableStyleLight16"
        .ListObjects("Tall").ShowAutoFilter = False

        ' Activer la ligne Totaux
        .ListObjects("Tall").ShowTotals = True

        ' Écrire "TOTAUX" dans la colonne "Espèce"
        Range("Tall[[#Totals],[Espèce]]").Value = "TOTAUX"

        ' Mettre un total dans la ligne des totaux, de la colonne "Entrée" à la colonne "Décès"
        For Each Cellule In Range("Tall[[#Headers],[Entrée]:[Décès]]")
            Range("Tall[#Totals]").ListObject.ListColumns(Cellule.Value).TotalsCalculation = xlTotalsCalculationSum
        Next Cellule

   End With

End Sub
 

Pièces jointes

  • Ligne Total VBA (TFB-001).xlsm
    22.9 KB · Affichages: 0
Dernière édition:

Staple1600

XLDnaute Barbatruc
Bonsoir le fil

@cathodique
Une variante syntaxique (avec contrainte à la fin (*) )
VB:
Sub Essai_A()
With Feuil1.ListObjects.Add(xlSrcRange, Feuil1.Range("A3:J6"), , xlYes)
    .Name = "Tall"
    .TableStyle = "TableStyleLight16"
    .ShowAutoFilter = 0: .ShowTotals = -1
    .TotalsRowRange.FillRight 'Dommage !
    .TotalsRowRange.Cells(1).Value = "TOTAUX"
End With
End Sub
(*)
qui oblige à jouer de la souris
Pas trouvé de syntaxe VBA pour éviter la boucle comme le fait @TooFatBoy

EDITION: Avec une boucle pour éviter le désagrément indiqué dans le SPOILER
Code:
Sub Essai_B()
With Feuil3.ListObjects.Add(xlSrcRange, Feuil3.Range("A3:J6"), , xlYes)
    .Name = "Tall": .ShowAutoFilter = 0: .ShowTotals = -1
    c = .ListColumns.Count
    For i = 1 To c
        If Application.WorksheetFunction.IsNumber(.ListColumns(i).DataBodyRange(1)) Then
            .ListColumns(i).TotalsCalculation = xlTotalsCalculationSum
        End If
    Next i
    .TotalsRowRange(1).Value = "TOTAUX": .TableStyle ="TableStyleLight16"
End With
End Sub
 
Dernière édition:

job75

XLDnaute Barbatruc
Bonjour cathodique,

Puisque la formule existe en J7, avec AutoFill on évite la boucle :
VB:
Sub MonTbS()
    With ShBilan
        ' Définir la plage pour le ListObject
        Set Rng = .Range("A3:J6")
        ' Créer le ListObject
        .ListObjects.Add(xlSrcRange, Rng, , xlYes).Name = "Tall"
        .ListObjects("Tall").TableStyle = "TableStyleLight16"
        .ListObjects("Tall").ShowAutoFilter = False
        ' Activer la ligne Totaux
        .ListObjects("Tall").ShowTotals = True
        ' Ajouter des formules de somme dans la ligne Totaux pour chaque colonne
        With .ListObjects("Tall").Range
            .Cells(.Rows.Count, .Columns.Count).AutoFill .Cells(.Rows.Count, 2).Resize(, .Columns.Count - 1), xlFillValues
        End With
    End With
End Sub
Nota : le calcul était en mode manuel, je l'ai passé en automatique.

A+
 

Pièces jointes

  • Ligne Total VBA.xlsm
    17.3 KB · Affichages: 7

patricktoulon

XLDnaute Barbatruc
bonjour
quand on arrive à la formile et l'autofill c'est un ts alors utilisez les noms
VB:
Sub MonTbS()
    With ShBilan
        ' Définir la plage pour le ListObject
        Set Rng = .Range("A3:J6")
        ' Créer le ListObject
        .ListObjects.Add(xlSrcRange, Rng, , xlYes).Name = "Tall"
        .ListObjects("Tall").TableStyle = "TableStyleLight16"
        .ListObjects("Tall").ShowAutoFilter = False
        ' Activer la ligne Totaux
        .ListObjects("Tall").ShowTotals = True
        ' Ajouter des formules de somme dans la ligne Totaux pour chaque colonne
        With Range("Tall[[#Totals],[Entrée]]")
            .FormulaR1C1 = "=SUM(R[-3]C:R[-1]C)"
            .AutoFill Destination:=Range("Tall[[#Totals],[Entrée]:[Décès]]"), Type:=xlFillDefault
        End With
   End With
   End Sub
 

TooFatBoy

XLDnaute Barbatruc
J'avais cherché une syntaxe pour mettre toutes les sommes sur la lignes des totaux, sans utiliser de boucle, mais n'en trouvant pas je m'étais résolu à utiliser une boucle. :(

En utilisant la solution de job75 donnée en #12 n'utilisant pas de boucle, ma proposition deviendrait celle-ci :
VB:
Sub MonTbS()
'
    With shBilan

        ' Définir la plage pour le ListObject
        Set Rng = .Range("A3:J6")

        ' Créer le Tableau Structuré
        .ListObjects.Add(xlSrcRange, Rng, , xlYes).Name = "Tall"
        .ListObjects("Tall").TableStyle = "TableStyleLight16"
        .ListObjects("Tall").ShowAutoFilter = False

        ' Activer la ligne Totaux
        .ListObjects("Tall").ShowTotals = True

        ' Écrire "TOTAUX" dans la colonne "Espèce"
        Range("Tall[[#Totals],[Espèce]]").Value = "TOTAUX"

        ' Mettre un total dans la ligne des totaux de la colonne "Entrée"
        .ListObjects("Tall").ListColumns("Entrée").TotalsCalculation = xlTotalsCalculationSum
        ' Recopier la cellule de totaux de la colonne "Entrée", de la colonne "Entrée" à la colonne "Décès"
        Range("Tall[[#Totals],[Entrée]]").AutoFill Range("Tall[[#Totals],[Entrée]:[Décès]]"), xlFillValues

   End With

End Sub
 

Pièces jointes

  • Ligne Total VBA (TFB-002).xlsm
    22.1 KB · Affichages: 2

Discussions similaires

Statistiques des forums

Discussions
315 095
Messages
2 116 158
Membres
112 673
dernier inscrit
ìntellisoft