Compter une suite (écart direct)

Le
Lemailler
Bonjour,

Je dsire rsoudre un problme sans gnrer de nouvelle colonne c=
omme
indiqu ci-dessous.
Problme : En colonne A se trouve une trs longue liste de nombre dont
je dsire connatre la plus longue suite pour une valeur donne (c=
art
direct en terme mathmatique).
Colonne A = 2 - 0 - 0 - 5.5 - 5.5 - 0 - 0 - 0 - 3.5 etc.
Ici la plus longue suite pour 0 = 3 pour 5.5 = 2

Cela est facile rsoudre en crant une colonne intermdiaire, mais
comme mes tableaux sont dj trs chargs il me faut trouver autre
chose.
Colonne A = liste des donnes et Colonne B = colonne intermdiaire

A B
2 - 0
0 - 1
0 - 2 Formule de la colonne B = SI(A3=0;B2+1;0)
5,5 - 0
5,5 - 0
0 - 1
0 - 2
0 - 3
3,5 - 0

3 MAX(B1:B9)

Etudiant actuellement les formules matricielles, il m'a sembl dans un
premier temps que je tenais la solution avec les matricielles qui
retournent un seul rsultat, malheureusement cela ne colle pas. En
effet, la colonne "virtuelle" que peut gnrer une formule matricielle
pour ses calculs intermdiaires (la colonne B que je me refuse
d'ajouter) doit se rfrer elle-mme pour se calculer.

Mon raisonnement est-il correct propos de la formule matricielle ?
Doit-on en passer par l'criture d'une fonction personnalise ?

Merci par avance.
Lemailler
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Hervé
Le #4675141
Bonjour,
Avec une fonction personalisée à mettre soit dans un module standard du
classeur concerné, soit dans un module standard de PERSO.XLS si utilisée
dans plusieurs classeurs. Il te faut indiquer la plage (qui peut être une
seule cellule), la valeur cherchée et le type de séparateur utilisé, dans
ton exemple, le tiret.
Exemple de formule : ìART_DIRECT(A1:B7;C9;"-")

Function ECART_DIRECT( _
Plage As Range, _
Arg, _
Separateur As String _
) As Integer

Dim Cel As Range
Dim Tbl
Dim Chaine As String
Dim Valeur As String
Dim I As Integer
Dim J As Integer
Dim K As Integer

'oblige le recalcul
Application.Volatile

'parcours la plage
For Each Cel In Plage
J = 0
'supprime les espaces
Chaine = Replace(Cel.Value, " ", "")
'type String
Valeur = CStr(Arg)
'la chaine est découpée dans un tableau
Tbl = Split(Chaine, Separateur)
'recherche la suite la plus longue
For I = 0 To UBound(Tbl)
If Tbl(I) = Valeur Then
J = J + 1
'mémorise la valeur la plus élevée
If J > K Then K = J
Else
J = 0
End If
Next I
Next Cel

ECART_DIRECT = K

End Function

Hervé.

"Lemailler"
Bonjour,

Je désire résoudre un problème sans générer de nouvelle colonne comme
indiqué ci-dessous.
Problème : En colonne A se trouve une très longue liste de nombre dont
je désire connaître la plus longue suite pour une valeur donnée (écart
direct en terme mathématique).
Colonne A = 2 - 0 - 0 - 5.5 - 5.5 - 0 - 0 - 0 - 3.5 etc.
Ici la plus longue suite pour 0 = 3 pour 5.5 = 2

Cela est facile à résoudre en créant une colonne intermédiaire, mais
comme mes tableaux sont déjà très chargés il me faut trouver autre
chose.
Colonne A = liste des données et Colonne B = colonne intermédiaire

A B
2 - 0
0 - 1
0 - 2 Formule de la colonne B = SI(A3=0;B2+1;0)
5,5 - 0
5,5 - 0
0 - 1
0 - 2
0 - 3
3,5 - 0

3 MAX(B1:B9)

Etudiant actuellement les formules matricielles, il m'a semblé dans un
premier temps que je tenais la solution avec les matricielles qui
retournent un seul résultat, malheureusement cela ne colle pas. En
effet, la colonne "virtuelle" que peut générer une formule matricielle
pour ses calculs intermédiaires (la colonne B que je me refuse
d'ajouter) doit se référer à elle-même pour se calculer.

Mon raisonnement est-il correct à propos de la formule matricielle ?
Doit-on en passer par l'écriture d'une fonction personnalisée ?

Merci par avance.
Lemailler
Publicité
Poster une réponse
Anonyme