XL 2016 Utiliser une plage de cellule comme critère dans NB.SI.ENS ou SOMMEPROD

Fabinou62

XLDnaute Occasionnel
Bonjour,

J'ai 2 feuilles de calculs dans le même classeur.
Une avec des numéros de bus et des taux d'attentes au feu (par exemple, ils attendent environ 30% des feu ou +....)
Une autre avec des numéros de bus et la ligne de bus correspondante (exemple : Lens > Lille).
J'aimerais compter le nombre de bus qui ont un taux d'attente au feu < 90 .

J'avais l'idée de faire :

- 1 ) Les bus (se trouvant dans la 2ème feuille avec leurs destinations) qui sont égaux au bus normal
- 2 ) La destination = (exemple : Lens >Lille)
- 3 ) Le taux d'attentes < 90

J'ai mis un fichier d'exemple :)
 

Pièces jointes

  • exemple.xlsx
    11.2 KB · Affichages: 11
Solution
Bonjour Fabinou62, Jean-Eric,
vous aurez une technique + rapide, les tableaux ont potentiellement + de 16 000 lignes.
D'accord, utilisez cette fonction VBA :
VB:
Function CompteInf90&(plage1 As Range, plage2 As Range)
Dim d As Object, tablo, i&, x$
Set d = CreateObject("Scripting.Dictionary")
tablo = Intersect(plage1, plage1.Parent.UsedRange).Resize(, 2) 'matrice, plus rapide
For i = 1 To UBound(tablo)
    x = CStr(tablo(i, 1))
    If x <> "" Then If tablo(i, 2) < 90 Then d(x) = ""
Next
tablo = Intersect(plage2, plage2.Parent.UsedRange).Resize(, 2) 'matrice, plus rapide
For i = 1 To UBound(tablo)
    If d.exists(CStr(tablo(i, 1))) Then CompteInf90 = CompteInf90 + 1 'comptage
Next
End Function
Le code est à placer...

Jean-Eric

XLDnaute Occasionnel
Bonjour,
Une proposition Récupérer et transformer (Power Query).
Les données sont sous forme de tableaux structurés.
Pour actualiser la requête : Ruban, Données et Actualiser tout.
Cdlt.
 

Pièces jointes

  • Fabinou62.xlsx
    23 KB · Affichages: 6

job75

XLDnaute Barbatruc
Bonjour Fabinou62, Jean-Eric,
vous aurez une technique + rapide, les tableaux ont potentiellement + de 16 000 lignes.
D'accord, utilisez cette fonction VBA :
VB:
Function CompteInf90&(plage1 As Range, plage2 As Range)
Dim d As Object, tablo, i&, x$
Set d = CreateObject("Scripting.Dictionary")
tablo = Intersect(plage1, plage1.Parent.UsedRange).Resize(, 2) 'matrice, plus rapide
For i = 1 To UBound(tablo)
    x = CStr(tablo(i, 1))
    If x <> "" Then If tablo(i, 2) < 90 Then d(x) = ""
Next
tablo = Intersect(plage2, plage2.Parent.UsedRange).Resize(, 2) 'matrice, plus rapide
For i = 1 To UBound(tablo)
    If d.exists(CStr(tablo(i, 1))) Then CompteInf90 = CompteInf90 + 1 'comptage
Next
End Function
Le code est à placer impérativement dans un module standard, fichier .xlsm joint.

A+
 

Pièces jointes

  • CompteInf90(1).xlsm
    19.8 KB · Affichages: 3

Discussions similaires

Statistiques des forums

Discussions
312 047
Messages
2 084 857
Membres
102 688
dernier inscrit
Biquet78