Bonjour,
Je souhaite utiliser la fonction SousTotalSomme de Jacques Boisgontier dans un de mes classeurs.
Cette fonction est celle ci : SousTotSomme(champ As Range, champSomme As Range)
Lorsque je dépasse 52 cellules dans le champ , j'ai une erreur #VALEUR! dans toutes les cellules.
Je précise que je colle cette fonction dans une zone couvrant 20 lignes et 2 colonnes, alors qu'il n'y a que 13 valeurs différentes dans champ. Donc, il y a la place pour récupérer toutes les valeurs.
Par ailleurs, dans le champsomme, toutes les valeurs sont numériques et correctes, et avec les premières 52 cellules, toutes les valeurs de champ (13) sont déjà présentes.
Pour éviter d'aller chercher le classeur correspondant, je remets ci dessous le code de cette fonction :
Question subsidiaire .... Comme éviter l'affichage de zéro dans les cellules excédentaires ? (20 lignes mais seulement 13 lignes utilisées pour le moment) : avec un formatage personnalisé des cellules peut être ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 Function SousTotSomme(champ As Range, champSomme As Range) Application.Volatile Set d = CreateObject("Scripting.Dictionary") a = champ b = champSomme For i = LBound(a) To UBound(a) clé = a(i, 1) d(clé) = d(clé) + b(i, 1) Next i Dim temp() ReDim temp(1 To Application.Caller.Rows.Count, 1 To 2) i = 1 For Each c In d.keys temp(i, 1) = c temp(i, 2) = d(c) i = i + 1 Next Call tri(temp, 1, d.Count) SousTotSomme = temp End Function Sub tri(a, gauc, droi) ' Quick sort ref = a((gauc + droi) \ 2, 1) g = gauc: d = droi Do Do While a(g, 1) < ref: g = g + 1: Loop Do While ref < a(d, 1): d = d - 1: Loop If g <= d Then temp = a(g, 1): a(g, 1) = a(d, 1): a(d, 1) = temp temp = a(g, 2): a(g, 2) = a(d, 2): a(d, 2) = temp g = g + 1: d = d - 1 End If Loop While g <= d If g < droi Then Call tri(a, g, droi) If gauc < d Then Call tri(a, gauc, d) End Sub
Partager