Recherche d'une valeur dans une liste Excel

cs_Potard Messages postés 5 Date d'inscription mercredi 4 avril 2007 Statut Membre Dernière intervention 29 octobre 2009 - 27 oct. 2009 à 18:29
cs_Potard Messages postés 5 Date d'inscription mercredi 4 avril 2007 Statut Membre Dernière intervention 29 octobre 2009 - 29 oct. 2009 à 19:03
Bonjour à tous
J'utilise une fonction VBA qui me retourne la plus petite valeur disponible dans une liste. Par exemple, j'ai 1000,1001,1003,1006...: résultat = 1002. Mon problème, c'est que c'est très long avec une liste qui va de 1000 à environ 2500.
Voici mon code :
Sub Recherche()
Valeur = MinLibre(nCode)
Traitement de Valeur....
End sub

Function MinLibre(nCode) 'Comment trouver l'adresse de la cellule qui contient
'la plus petite valeur disponible dans une série ?
'Choisir la feuille
Dim i%, ValRech%, CellMin
Sheets(feuille).Activate
' et la colonne
Range("j:j").Select ' les données sont en colonne J
ValRech = Application.WorksheetFunction.Max(Range("j:j"))
For i = 1000 To ValRech 'Définit la série qui démarre à 1000
Set CellMin = Selection.Find(i)
' Le 1er trou est la valeur cherchée
If CellMin Is Nothing Then
nCode = i
Exit Function
End If
Next i
nCode = ValRech
End Function
Quelqu'un pourrait-il m'aider à améliorer ce code
Merci d'avance


Potardechois

5 réponses

us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
28 oct. 2009 à 23:06
Bonsoir,

Ouais, ben, tout ton code me fatigue, et je ne comprends pas tout alors en restant à ta question : "J'utilise une fonction VBA qui me retourne la plus petite valeur disponible dans une liste." et "Mon problème, c'est que c'est très long avec une liste..." et "Comment trouver l'adresse de la cellule qui contient la plus petite valeur disponible dans une série ? "

Je ferais une fonction comme ça :

Function CellMinAddress(Plage As Range) As String
CellMinAddress = Plage.Columns.Find(Application.WorksheetFunction.Min(Plage)).Address
End Function



Sub TEST()
Range(CellMinAddress(Range("a:a"))).Select
End Sub


Elle retourne sous forme de texte l'adresse de la cellule possédant la plus petite valeur (du moins la 1ere occurrence de cette valeur)...

Amicalement,
Us.
0
cs_Potard Messages postés 5 Date d'inscription mercredi 4 avril 2007 Statut Membre Dernière intervention 29 octobre 2009
29 oct. 2009 à 08:20
Bonjour us_30
J'ai sans doute mal formulé mon problème : je dispose d'une liste de codes allant de 1000 à 2500 (à peu près). Dans cette liste, il y a des valeurs non utilisées (suite à effacement par exemple). Je voudrais retrouver la plus petite valeur disponible que je vais pouvoir utiliser. En fait je veux pouvoir réutiliser des valeurs qui ont été supprimées. Ton code me retourne la plus petite valeur présente dans la liste. Moi, je veux la plus petite valeur absente.
En tout cas merci quand-même, et excuses-moi si je t'ai donné mal à la tête avec mon code.



Potardechois
0
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
29 oct. 2009 à 15:20
Bonjour,

Ah, oui ! c'est plus clair maintenant. J'arrête l'aspirine, et je me penche sur une solution à la seconde...

Amicalement,
Us.
0
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
29 oct. 2009 à 16:25
Voilà,

Function CellValueNext(plage As Range) As Double

' paramètres
Dim t As Long
Dim Min As Long
Dim Max As Long
Dim Cell As Range

'derniers enregistrement
Min = Application.WorksheetFunction.Min(plage)
Max = Application.WorksheetFunction.Max(plage)

'Algo
ReDim pval(Max - Min) As Boolean

For Each Cell In plage.Cells
    If Cell.Value > 0 Then pval(Cell.Value - Min) = True
Next

For t = 0 To Max - Min
    If pval(t) = False Then
        CellValueNext = t + Min
        Exit For
    End If
Next t

End Function


Cette fonction est plus complète que ce que tu veux, car la liste de nombre entier exclusivement peut être aléatoire... et la plage peut-être définie...

Test :
Sub Recherche()
 MsgBox CellValueNext(Range("a:a"))
End Sub


Amicalement,
Us.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Potard Messages postés 5 Date d'inscription mercredi 4 avril 2007 Statut Membre Dernière intervention 29 octobre 2009
29 oct. 2009 à 19:03
Merci us_30

Ton code devra être adapté à mes besoins, mais en tout cas, il fonctionne plus vite que le mien.
Merci encore et à une prochaine fois peut-être


Potardechois
0
Rejoignez-nous