Bonsoir Jacques, Ronan et Philippe, et les Forumeurs (meuses) de la Nuit !
Et pour être encore plus perfectionniste !!
Option Explicit
Sub Compte()
Dim Plage_Nom As Range, Plage_Montant As Range, Valeur As Range
Dim Total_Montant As Double
Dim Ligne As Integer
Dim Doss As String
With Sheets("Feuil1")
Ligne = .Cells(65536, 1).End(xlUp).Row
If Ligne = 1 Then MsgBox "Compte Vide": Exit Sub
Set Plage_Nom = .Range("a2:a" & Ligne)
Set Plage_Montant = .Range("b2:b" & Ligne)
If Plage_Nom.Count = 1 Then Doss = " Dossier" Else Doss = " Dossiers"
.Cells(Ligne + 1, 1).Value = Plage_Nom.Count & Doss
For Each Valeur In Plage_Montant
Total_Montant = Total_Montant + Valeur
Next
.Cells(Ligne + 1, 2).Value = Total_Montant
End With
End Sub
On remarquera....
Faire un syntax comme suit :[/u]
"Dim plage_nom, plage_montant, valeur As Range"
équivaut à ne déclarer en tant que Range "valeur" et que "plage_nom" & "plage_montant" quand à elle sont Variant
Ensuite
Option Explicit en tête de module aurait obligé de déclarer "Ligne" qui ne l'était pas...
"Compteur = 0" ne sert à rien
"+ valeur.Value" "Value" n'est pas nécessaire si on a bien déclaré valeur.
Mais ceci dit çà fonctionnait tout de même bien sans tout çà, c'est juste pour montrer, disons, une approche de "perfectionnisme", quoique faire une macro en boucle pour çà, n'est pas non plus très "perfect" !! une formule pourrait le faire aussi, tout en gardant un calcul actif !
Alors je propose ceci plutot :
'
Option Explicit
Sub Compte_Thierry()
Dim L As Integer
Dim Doss As String
Dim Msg As Byte
Start:
With Sheets("Feuil1")
L = .Cells(65536, 1).End(xlUp).Row
If L = 1 Then MsgBox "Compte Vide": Exit Sub
If L = 2 Then Doss = " Dossier" Else Doss = " Dossiers"
If Range("A" & L).HasFormula = True Then
Msg = MsgBox("Un total de " & Range("A" & L) & " semble avoir déjà été appliqué en cellule A" & L _
& vbCrLf & "Voulez vous continuer et le supprimer ? ", vbQuestion + vbYesNo)
If Msg = 6 Then
.Range("A" & L & ":B" & L).Clear: GoTo Start
Else: Exit Sub
End If
End If
.Range("A" & L + 1).Formula = "=CONCATENATE(SUBTOTAL(3,A2:A" & L & "),""" & Doss & """)"
.Range("B" & L + 1).Formula = "=SUM(B2:B" & L & ")"
End With
End Sub
'
C'est plus simple, et surtout la feuille garde des calculs actifs... En prime il y a un test si un total à déjà été fait en bas de colonne...
Bonne Nuit à tous et toutes
@+Thierry