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

Recherche alternative pour utiliser Nb.Si.Ens en LIGNES

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Backhandshot

XLDnaute Occasionnel
Bonjour à tous! Je recherche une alternative pour pouvoir utiliser la fonction Nb.Si.Ens en lignes, je veux calculer la sortie de 3 chiffres sur l'ensemble du tableau. En colonne pas de problème à utiliser la fonction si on connait les colonnes où sont stockés les chiffres. Je ne veux pas utiliser de colonnes intermédiaires pour arriver au résultat souhaité. Merci
 

Pièces jointes

Re : Recherche alternative pour utiliser Nb.Si.Ens en LIGNES

Bonsoir @ tous,
Salut JCGL,
en AB2,
Code:
=NB(1/(PRODUITMAT(NB.SI(DECALER(C1;LIGNE(C2:V7)-1;;;20);X2:Z2);ENT((LIGNE(1:3)-1)/3)+1)=3))
@ valider par Entree

Pour la formule en AA2, c'est pas claire, il faut préciser, est-ce que tu cherches le nombre de colonnes où on trouve les 3 valeurs comme on a faite pour les lignes ou quoi exactement..

@ te relire

Edit :
Je voie que pour les colonnes tu essaies de compter les colonnes où on trouve 3 fois une valeur cherchée, est-ce c'est ce que tu veux vraiment ou bien juste une mal formulation..
 
Dernière édition:
Re : Recherche alternative pour utiliser Nb.Si.Ens en LIGNES

Bonjour Backhandshot, JCGL, R@chid,

Une autre formule en AB2 (matricielle à valider par Ctrl+Maj+Entrée)
Code:
=SOMME(--(3=FREQUENCE(SI(ESTNUM(EQUIV(C2:V7;X2:Z2;0));LIGNE(C2:V7));LIGNE(C2:V7) -1)))
 

Pièces jointes

Dernière édition:
Re : Recherche alternative pour utiliser Nb.Si.Ens en LIGNES

Bonjour,

Je profite de ce sujet pour poser une question pour la formule LIGNE (pas colonne).

Sur l'ancien site de Veriti, il y avait été réalisé une fonction personnalisée qui "balayait" une plage pour effectuer cette recherche de 3 à 8 nombres présents dans les lignes de la plage (on indiquait la plage et les nombres à rechercher (de 2 à 8) La fonction renvoyait en face des nombres à rechercher le nombre d'occurences dans la plage.

Quelqu'un l'aurait-il encore conservée? (il y a un bon moment....) et moi je ne l'ai plus.

Cette fonction était très rapide par rapport à une formule matricielle.
Merci
Bon dimanche à tous.
 
Re : Recherche alternative pour utiliser Nb.Si.Ens en LIGNES

Bonjour @ tous,
Salut mapomme 🙂, salut JJ1 😱,
Avec un fichier exemple expliquant la demande on peut peut-être t'aider en vérité et sans Veriti 😛

@ + +
 
Re : Recherche alternative pour utiliser Nb.Si.Ens en LIGNES

Bonjour Rachid, JCGL, MaPomme et à tous
BRAVO! Les 2 formules fonctionnent parfaitement. Est-il possible d'adapter les formules à un code VBA ? Je vous remercie tous et chacun pour votre appui. Merci
 
Re : Recherche alternative pour utiliser Nb.Si.Ens en LIGNES

Bonjour à tous,

Un essai avec une fonction personnalisée (pas optimisée) qui compte le nombre de ligne où au moins une fois la séquence recherchée est présente. Voir onglet "Fonction" dans le fichier joint.

La déclaration de la fonction : Function nSeq&(xtab As Range, xseq As Range)
  • xtab est la zone du tableau.
  • xseq est la zone de la séquence à rechercher.
  • nota 1: les cellules vides au sein de la séquence à rechercher sont ignorées.
  • nota 2: la zone de recherche peut être horizontale, verticale ou rectangulaire.

Un exemple d 'appel de la fonction =nSeq(C2:V7;X2:Z2)

Le code de la fonction dans module1:
VB:
Function nSeq&(xtab As Range, xseq As Range)
Dim vtab, vseq, vres(), OK As Boolean, i&, j&, m&, n&

vtab = xtab.Value: vseq = xseq.Value
ReDim vres(LBound(vtab) To UBound(vtab), LBound(vseq) To UBound(vseq), _
            LBound(vseq, 2) To UBound(vseq, 2))

For i = LBound(vtab) To UBound(vtab)
  For j = LBound(vtab, 2) To UBound(vtab, 2)
    For m = LBound(vseq) To UBound(vseq)
      For n = LBound(vseq, 2) To UBound(vseq, 2)
        If Not IsEmpty(xseq(m, n)) Then
          vres(i, m, n) = vres(i, m, n) Or (vtab(i, j) = xseq(m, n))
        Else
          vres(i, m, n) = True
        End If
      Next n
    Next m
  Next j
  OK = True
  For m = LBound(vseq) To UBound(vseq)
    For n = LBound(vseq, 2) To UBound(vseq, 2)
      OK = OK And vres(i, m, n)
    Next n
  Next m
  nSeq = nSeq - OK
Next i

End Function

Nota: préférer le fichier v2 du message suivant.
 

Pièces jointes

Dernière édition:
Re : Recherche alternative pour utiliser Nb.Si.Ens en LIGNES

(re)

Un autre code pour la fonction qui utilise bien moins de ressources mémoire que la précédente puisqu'on a supprimé la première dimension du tableau vres (on recrée le tableau vres à chaque traitement d'une ligne). Le code a été quelque peu commenté:
VB:
Function nSeq&(xtab As Range, xseq As Range)
Dim vtab, vseq, vres(), OK As Boolean, i&, j&, m&, n&

' acquisition des tableaux des valeurs de la source
' et de la séquence à rechercher
vtab = xtab.Value: vseq = xseq.Value

'pour chaque ligne de la source
For i = LBound(vtab) To UBound(vtab)
  ' on crée un tableau de même dimemension
  ' que celui de la séquence à rechercher
  ReDim vres(LBound(vseq) To UBound(vseq), LBound(vseq, 2) To UBound(vseq, 2))
  ' pour chaque colonne de la ligne i
  For j = LBound(vtab, 2) To UBound(vtab, 2)
    ' on va comparer l'élément vtab(i, j) de la source
    ' à chaque élément de la séquence à rechercher.
    
    ' donc pour chaque ligne de la séquence à rechercher
    For m = LBound(vseq) To UBound(vseq)
      ' pour chaque colonne de la séquence à rechercher
      For n = LBound(vseq, 2) To UBound(vseq, 2)
        If Not IsEmpty(xseq(m, n)) Then
          ' l'élement de la séqence n'est pas vide
          ' si vtab(i, j) est égale à l'élément xseq(m, n)
          ' de la séquence alors on l'ajoute (logiquement parlant)
          ' à l'élement vres(m, n) via l'opérateur OR
          vres(m, n) = vres(m, n) Or (vtab(i, j) = xseq(m, n))
        Else
          ' si l'élément de la séquence est vide, alors on considère
          ' que la recherche est un succès
          vres(m, n) = True
        End If
      Next n
    Next m
  Next j
  ' Fin du parcours des colonnes pour la ligne i
  ' la séquence est présente dans la ligne i , si on y a trouvé
  ' chaque élément de la séquence. Autrement dit si chaque
  ' élément du tableau vres est à TRUE.
  OK = True
  ' on vérifie que chaque élément de vres est à true
  ' on utilise pour cela l'opérateur AND
  For m = LBound(vseq) To UBound(vseq)
    For n = LBound(vseq, 2) To UBound(vseq, 2)
      OK = OK And vres(m, n)
    Next n
  Next m
  ' si OK = TRUE (toutes les valeurs sont présentes dans la ligne)
  ' on ôte OK de nSeq (en VBA, TRUE vaut -1 et FALSE vaut 0)
  nSeq = nSeq - OK
  ' on passe à la ligne suivante
Next i

End Function
 

Pièces jointes

Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
18
Affichages
619
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…