SOMME SI ENS en Vba

moutchec

XLDnaute Occasionnel
bonjour à tous,
je cherche un code VBA pour remplacer les formules en colonne B de la feuille "recap" avec mise à jour à l'activation de la feuille.
j'ai parcouru quelques fils sur le forum mais pas de solution de ce type.
merci d'avance.
Moutchec.
 

Pièces jointes

  • TEST.xlsx
    12 KB · Affichages: 56

Dranreb

XLDnaute Barbatruc
Bonsoir.
VB:
Option Explicit

Private Sub Worksheet_Activate()
Dim Parti As GigIdx.SsGr, T(1 To 500, 1 To 2), L As Long
For Each Parti In GigIdx.Gigogne(Feuil1.[B2:C2], 1)
   L = L + 1
   T(L, 1) = Parti.ID
   T(L, 2) = Parti.Somme(2)
   Next Parti
Me.[A2].Resize(UBound(T, 1), UBound(T, 2)).Value = T
End Sub
 

Pièces jointes

  • GigIdx.xlsm
    70.2 KB · Affichages: 69

job75

XLDnaute Barbatruc
Bonjour le forum,

Un classique dans l'utilisation des tableaux VBA :
Code:
Private Sub Worksheet_Activate()
Dim t, d As Object, i&, a, b
t = Feuil1.[A1].CurrentRegion.Resize(, 3)
Set d = CreateObject("Scripting.Dictionary")
d.CompareMode = vbTextCompare 'la casse est ignorée
Application.ScreenUpdating = False
For i = 2 To UBound(t)
  d(t(i, 2)) = d(t(i, 2)) + IIf(IsNumeric(t(i, 3)), t(i, 3), 0)
Next
If FilterMode Then ShowAllData 'si la feuille est filtrée
Range("A2:B" & Rows.Count) = "" 'RAZ
If d.Count = 0 Then Exit Sub
a = d.keys: b = d.items: ReDim t(UBound(a), 1) 'base 0
For i = 0 To UBound(a)
  t(i, 0) = a(i): t(i, 1) = b(i)
Next
[A2].Resize(i, 2) = t
[A2].Resize(i, 2).Sort [A2], xlAscending, Header:=xlNo 'tri facultatif
End Sub
Edit : ajouté If FilterMode Then ShowAllData 'si la feuille est filtrée

L'exécution est très rapide même avec un grand nombre de lignes.

Bonne journée.
 

Pièces jointes

  • TEST(1).xlsm
    23.3 KB · Affichages: 76
Dernière édition:

job75

XLDnaute Barbatruc
Re,

Pour tester j'ai copié le tableau source sur 90 000 lignes.

L'inconvénient du TCD c'est qu'il faut alors changer la source de données.

Ceci étant fait l'actualisation prend chez moi 0,16 seconde.

Avec mon fichier du post #7 le résultat est obtenu en 0,35 seconde.

A+
 

job75

XLDnaute Barbatruc
Re,

Mais avec le TCD si l'on change la source de données automatiquement :
Code:
Private Sub Worksheet_Activate()
Me.PivotTables(1).ChangePivotCache ThisWorkbook.PivotCaches.Create(xlDatabase, Feuil1.[A1].CurrentRegion)
End Sub
le résultat s'obtient chez moi en 0,49 seconde, c'est un peu moins rapide que par tableaux VBA.

A+
 

Statistiques des forums

Discussions
312 103
Messages
2 085 319
Membres
102 862
dernier inscrit
Emma35400