NB.SI

CISCO

XLDnaute Barbatruc
Bonsoir à tous

Histoire d'améliorer une proposition faite sur ce fil, je fais divers essais avec la fonction NB.SI. Et je découvre un truc étrange...

J'ai défini une plage dynamique, lettres, $A3:$Ax, et une autre recherches, correspondant à C$3:$C$y.
Lorsque j'écris dans la cellule D3 la formule NB.SI(lettres;recherches), Excel me donne le résultat de NB.SI(lettres;$C3).
Dans la cellule en dessous, toujours avec NB.SI(lettres;recherches), j'obtiens le résultat de NB.SI(lettres;$C4). Et ainsi de suite en dessous... Je n'avais jamais remarqué ce type d'enchainement.

Au passage, si quelqu'un a une idée. Mon "problème" :
Dans la colonne D, j'ai diverses valeurs correspondant à NB.SI(lettres;$C3), puis en dessous à
NB.SI(lettres;$C3)+NB.SI(lettres;$C4), et en dessous encore à NB.SI(lettres;$C3)+NB.SI(lettres;$C4)+NB.SI(lettres;$C5). Et ainsi de suite.
J'aimerai avoir ces valeurs non pas sur la feuille, mais dans un nom, une liste dynamique dans le gestionnaire de noms, histoire de l'utiliser dans une formule sans avoir besoin de l'afficher à l'écran.
J'aimerai bien, mais je n'y arrive pas.
Donc, si vous avez une idée, merci d'avance... Sans VBA, bien sûr. Ne vous prenez pas la tête pour autant, ce n'est pas très important, c'est juste pour le fun et pour en apprendre un peu plus...

@ plus
 

Pièces jointes

  • nb.si.xlsx
    11.4 KB · Affichages: 27
Dernière édition:

job75

XLDnaute Barbatruc
Bonjour CISCO, le forum,

Dans les 3 fichiers précédents les noms LETTRES et RECHERCHES sont définis par la fonction volatile DECALER.

De ce fait à chaque modification la formule matricielle de la plage E3:E6002 est calculée 6000 fois.

Dans ce fichier (4) la macro nomme les 2 plages :
Code:
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Union([LETTRES], [RECHERCHES]).EntireColumn) Is Nothing Then Exit Sub
Dim i As Variant
i = Application.Match("zzz", [LETTRES].EntireColumn)
If Val(CStr(i)) < [LETTRES].Row Then i = [LETTRES].Row
[LETTRES].Resize(i - [LETTRES].Row + 1).Name = "LETTRES" 'renomme la plage
i = Application.Match("zzz", [RECHERCHES].EntireColumn)
If Val(CStr(i)) < [RECHERCHES].Row Then i = [RECHERCHES].Row
[RECHERCHES].Resize(i - [RECHERCHES].Row + 1).Name = "RECHERCHES" 'renomme la plage
i = [LETTRES].Cells(1) 'mémorise
Application.EnableEvents = False
[LETTRES].Cells(1) = i & " " 'modification de la plage
Set d = Nothing
[LETTRES].Cells(1) = i 'force le recalcul de la fonction
Application.EnableEvents = True
End Sub
A chaque modification la formule matricielle n'est maintenant calculée que 3 ou 4 fois, c'est quasi immédiat.

A+
 

Pièces jointes

  • NB.SI VBA(4).xlsm
    133.2 KB · Affichages: 8
Dernière édition:

Discussions similaires