Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Compter une suite (écart direct)

1 réponse
Avatar
Lemailler
Bonjour,

Je d=E9sire r=E9soudre un probl=E8me sans g=E9n=E9rer de nouvelle colonne c=
omme
indiqu=E9 ci-dessous.
Probl=E8me : En colonne A se trouve une tr=E8s longue liste de nombre dont
je d=E9sire conna=EEtre la plus longue suite pour une valeur donn=E9e (=E9c=
art
direct en terme math=E9matique).
Colonne A =3D 2 - 0 - 0 - 5.5 - 5.5 - 0 - 0 - 0 - 3.5 etc.
Ici la plus longue suite pour 0 =3D 3 pour 5.5 =3D 2

Cela est facile =E0 r=E9soudre en cr=E9ant une colonne interm=E9diaire, mais
comme mes tableaux sont d=E9j=E0 tr=E8s charg=E9s il me faut trouver autre
chose.
Colonne A =3D liste des donn=E9es et Colonne B =3D colonne interm=E9diaire

A B
2 - 0
0 - 1
0 - 2 Formule de la colonne B =3D SI(A3=3D0;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=E9 dans un
premier temps que je tenais la solution avec les matricielles qui
retournent un seul r=E9sultat, malheureusement cela ne colle pas. En
effet, la colonne "virtuelle" que peut g=E9n=E9rer une formule matricielle
pour ses calculs interm=E9diaires (la colonne B que je me refuse
d'ajouter) doit se r=E9f=E9rer =E0 elle-m=EAme pour se calculer.

Mon raisonnement est-il correct =E0 propos de la formule matricielle ?
Doit-on en passer par l'=E9criture d'une fonction personnalis=E9e ?

Merci par avance.
Lemailler

1 réponse

Avatar
Hervé
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" a écrit dans le message de news:

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