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 ?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
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" <fredericbois@gmail.com> a écrit dans le message de news:
1188657346.933357.149930@d55g2000hsg.googlegroups.com...
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 ?
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 ?