Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

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

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…