OVH Cloud OVH Cloud

recherche d'un nombre dans une suite interrompue

7 réponses
Avatar
Xavieer Bodson
Exitse-t-il une fonction qui permettrait de renvoyer la valeur du premier
nombre
manquant dans une suite de nombres interrompue: exemple, dans la suite
1234...8
elle renverrait 5.

Sinon quelqu'un a t il une idée pour la concevoir ?

Merci d'avance

Xavier Bodson

7 réponses

Avatar
AV
Exitse-t-il une fonction qui permettrait de renvoyer la valeur du premier
nombre


Une fonction perso ?

Function SUITE_NUM(cel As Range)
For i = 1 To Len(cel)
If Asc(Mid(cel, i + 1, 1)) <> Asc(Mid(cel, i, 1)) + 1 Then
SUITE_NUM = Chr(Asc(Mid(cel, i, 1)) + 1)
Exit Function
End If
Next
End Function

AV

Avatar
AV
Il pourrait y avoir ça aussi :
Matricielle :

=EQUIV(FAUX;1*STXT(A1;LIGNE(INDIRECT("1:"&NBCAR(A1)));1)={1;2;3;4;5;6;7;8;9};0)

AV
Avatar
Daniel.M
Hello Xavier,

J'ai compris que tu avais un nombre par cellule, donc une plage (mettons A1:A10)
de nombres.

Si tes données ne sont pas triées:
=MIN(SI(ESTNA(EQUIV(LIGNE(INDIRECT(MIN(A1:A10)&":"&MAX(A1:A10)))
;A1:A10;0));LIGNE(INDIRECT(MIN(A1:A10)&":"&MAX(A1:A10)))))

Si tes données sont triées de façon ascendante,
=MIN(SI(A2:A10<>A1:A9+1;A1:A9+1))

Ce sont 2 matricielles (tu dois les saisir par Ctrl-Maj-Entrée).

Salutations,

Daniel M.

"Xavieer Bodson" wrote in message
news:
Exitse-t-il une fonction qui permettrait de renvoyer la valeur du premier
nombre
manquant dans une suite de nombres interrompue: exemple, dans la suite
1234...8
elle renverrait 5.

Sinon quelqu'un a t il une idée pour la concevoir ?

Merci d'avance

Xavier Bodson




Avatar
Xavieer Bodson
"Daniel.M" a écrit dans le message de
news: O#
Hello Xavier,

J'ai compris que tu avais un nombre par cellule, donc une plage (mettons
A1:A10)

de nombres.

Si tes données ne sont pas triées:
=MIN(SI(ESTNA(EQUIV(LIGNE(INDIRECT(MIN(A1:A10)&":"&MAX(A1:A10)))
;A1:A10;0));LIGNE(INDIRECT(MIN(A1:A10)&":"&MAX(A1:A10)))))

Si tes données sont triées de façon ascendante,
=MIN(SI(A2:A10<>A1:A9+1;A1:A9+1))

Ce sont 2 matricielles (tu dois les saisir par Ctrl-Maj-Entrée).

Salutations,

Daniel M.

Merci pour ton aide précieuse: ta formule sembke marcher et tu avais bien

compris ma demande
A+


"Xavieer Bodson" wrote in message
news:
Exitse-t-il une fonction qui permettrait de renvoyer la valeur du
premier


nombre
manquant dans une suite de nombres interrompue: exemple, dans la suite
1234...8
elle renverrait 5.

Sinon quelqu'un a t il une idée pour la concevoir ?

Merci d'avance

Xavier Bodson








Avatar
AV
Suite à demande en bal perso (on aurait aimé que ça se fasse ici .....)
Pour éviter le temps de calcul/recalcul rédhibitoire d'une matricielle si la
plage est longue
Dans un module ordinaire, une fonction perso :

Function MIN_MANQ(plage As Range)'av
mini = Application.Small(plage, 1)
maxi = Application.Large(plage, 1)
For i = 1 To Application.Count(plage)
x = Application.Small(plage, i)
If x > mini + 1 Then GoTo suite Else mini = x
Next
suite:
If mini = maxi Then
MIN_MANQ = ""
Else: MIN_MANQ = mini + 1
End If
End Function

AV
Avatar
Daniel.M
Salut,

Suite à demande en bal perso (on aurait aimé que ça se fasse ici .....)


Pour appuyer cette idée,

Function MIN_MANQUE(Plg As Range) As Variant ' Daniel M.
Dim V As Variant, i As Long

V = Evaluate("=TRANSPOSE(SMALL(" & Plg.Address(EXTERNAL:=True) _
& ", ROW(1:" & Plg.Count & ")))")

For i = LBound(V) + 1 To UBound(V)
If V(i) > V(i - 1) + 1 Then MIN_MANQUE = V(i - 1) + 1: Exit For
Next i
End Function


Salutations,

Daniel M.

Avatar
Daniel.M
Bonjour,

On oublie ma dernière proposition : c'est d'une lenteur ...

Pour la vitesse pure et les chanceux qui ont le MOREFUN.XLL de Laurent Longre:

Function MIN_MANQUE2(Plg As Range) As Variant ' Daniel M.
Dim V As Variant, i As Long

'V = Application.Run([VSORT.IDX], Plg, 1) ' en anglais
V = Application.Run([TRIV.IDX], Plg, 1) ' en français

For i = LBound(V) + 1 To UBound(V)
If Plg(V(i, 1)) > Plg(V(i - 1, 1)) + 1 Then _
MIN_MANQUE2 = Plg(V(i - 1, 1)) + 1: Exit For
Next i

End Function

Salutations,

Daniel M.