Somme en VBA et condition

nak

XLDnaute Occasionnel
Bonjour à tous,

Je cherche une formule VBA pour faire la somme des nombres de B2:B en prenant en compte qu'une seule fois chaque prénoms en A:A.
J'aimerais une méthode avec du VBA car mon tableau change énormément et peut comporter plusieurs centaines de lignes.
Je vous joins un petit tableau pour l'exemple.

Quelqu'un peut-il me dépanner ?

Merci

A+
 

Pièces jointes

  • somme_condition.xls
    17 KB · Affichages: 26

_Thierry

XLDnaute Barbatruc
Repose en paix
Re : Somme en VBA et condition

Bonjour Nak, le Forum

Voici une solution avec l'utisation d'une Collection (avec une Gestion d'Erreur pour passer outre l'erreur pour les Doublon de Nom dans la Clef de la Collection, le tout récupéré grace à la fonction Split, et tout en Tableau pour gagner du temps)

Code:
Option Explicit

Sub TheCalculator()
Dim TabList As Variant
Dim i As Integer
Dim Counter As Double
Dim Container As Variant, MyItem As Variant
With Worksheets("FEUIL1")
TabList = .Range("A2:B" & .Range("A65536").End(xlUp).Row)
End With
Dim ColList As New Collection
    On Error Resume Next
    For i = 1 To UBound(TabList, 1)
    ColList.Add TabList(i, 1) & "#" & TabList(i, 2), TabList(i, 1) & "#" & TabList(i, 2)
    Next i
    On Error GoTo 0

For Each MyItem In ColList
  Container = Split(MyItem, "#")
    Counter = Counter + Container(1)
Next MyItem


Worksheets("FEUIL1").Range("B1") = Counter
End Sub

Essaie et dis nous si cela convient ?

Cordialement,
@+Thierry
 

Robert

XLDnaute Barbatruc
Repose en paix
Re : Somme en VBA et condition

Bonjour le nak, Thierry, bonjour le forum,

Thierry dégaine plus vite du code VBA que Keith Richards un riff de guitare... Comme j'avais aussi planché dessus, j'envoie aussi ma proposition avec l'utilisation d'un dictionnaire :

Code:
Sub Macro1()
Dim dl As Integer 'déclare la variable dl (Dernière Ligne)
Dim pl As Range 'déclare la variable pl (PLage)
Dim dico As Object 'déclare la variable dico (DICtiOnnaire)
Dim cel As Range 'déclare la variable cel (CELlule)
Dim temp As Variant 'déclare la variable temp (tableau TEMPoraire)
Dim i As Integer 'déclare la variable i (Incrément)
Dim t As Double 'déclare la variable t (Total) - type de donnée à adapter (INTEGER, LONG, ou DOUBLE)

With Sheets("Feuil1") 'prend en compte l'onglet "Feuil1"
    dl = .Cells(Application.Rows.Count, 1).End(xlUp).Row 'définit la dernière ligne éditée dl de la colonne 1 (=A)
    Set pl = .Range("A2:A" & dl) 'définit la plage pl
End With 'fin de la prise en compte de l'onglet "Feuil1"
Set dico = CreateObject("Scripting.Dictionary")
For Each cel In pl 'boucle sur toutes les cellules cel de la plage pl
    'si la valeur de la cellule n'existe pas dans le dictionnaire, ajoute la valeur de la cellule comme "clé" et la valeur de la celllule en colonne B comme "item"
    If Not dico.Exists(cel.Value) Then dico.Add cel.Value, cel.Offset(0, 1).Value
Next cel 'prochainbe cellule de la boucle
temp = dico.items 'récupère tous les items du dictionnaire sans doublon dans le tableau temporaire temp
For i = 0 To UBound(temp) 'boucle sur toutes des données du tableau temp
    t = t + temp(i) 'définit le total t
Next i 'prochaine donnée de la boucle
Range("B1").Value = t 'place le total en B1
End Sub
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Re : Somme en VBA et condition

Bonjour mon cher Robert, re Nak

Heureux que ca puisse éventuellement convenir, toutefois attention dans mon code si tu as une difference de valeur pour Pierre (par exemple 10 en B2 et 15 en B3, LES DEUX VALEURS seront cummulées, car la Clef de ma collection fait "Unique" le même nom ET la même valeur...

Ceci dit en relisant ton Post :
Je cherche une formule VBA pour faire la somme des nombres de B2:B

Voici la même chose en Function VBA

Code:
Function Calculator(ByRef RangeFrom As Range, ByRef RangeTo As Range)
Dim TabList As Variant
Dim i As Integer
Dim Counter As Double
Dim Container As Variant, MyItem As Variant
Application.Volatile

TabList = Range(RangeFrom, RangeTo)
 
Dim ColList As New Collection
    On Error Resume Next
    For i = 1 To UBound(TabList, 1)
    ColList.Add TabList(i, 1) & "#" & TabList(i, 2), TabList(i, 1) & "#" & TabList(i, 2)
    Next i
    On Error GoTo 0
For Each MyItem In ColList
 Container = Split(MyItem, "#")
    Counter = Counter + Container(1)
Next MyItem
Calculator = Counter
End Function

Qu'il suffira d'appeler depuis Excel comme toute autre Formule : =Calculator(A2,B8)

Pour mon cher Robert et oui plus rapide... mais probablement moins fiable que la tienne (non non j'ai pas dis moins longue !) pour le point précité plus haut en cas de difference de valeur sur même nom !

Bien à vous

@+Thierry
 

Discussions similaires

Statistiques des forums

Discussions
312 305
Messages
2 087 084
Membres
103 459
dernier inscrit
Arnocal