Recherche alternative pour utiliser Nb.Si.Ens en LIGNES

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

  • NbSiEns.xlsx
    436.3 KB · Affichages: 71

R@chid

XLDnaute Barbatruc
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:

mapomme

XLDnaute Barbatruc
Supporter XLD
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

  • Nbr par ligne v1.xls
    33.5 KB · Affichages: 45
Dernière édition:
J

JJ1

Guest
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.
 

mapomme

XLDnaute Barbatruc
Supporter XLD
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

  • Nbr par ligne fonction perso v1.xls
    52 KB · Affichages: 40
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
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

  • Nbr par ligne fonction perso v2.xls
    53.5 KB · Affichages: 30
Dernière édition:

Discussions similaires

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

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