Recherche de la première cellule supérieur à ma variable VBA
bonjour,
je suis débutant en VBA et malgré mes recherches je ne parviens pas trouver de réponse. Dans un colonne, j'aimerais trouver la première cellule qui soit supérieur a une valeur spécifiée.
idéalement j'aimerais pouvoir utiliser la fonction cells.find car beaucoup plus rapide que les boucles.
pour illustrer => Cells.Find(what:=[première valeur > ma variable]).select
évidemment cette syntaxe ne fonctionne pas donc j'aimerais trouver la bonne syntaxe si elle existe ou un équivalant mais sans passer par une répétition de boucle.
Merci d'avance pour votre aide.
Bonjour,
La boucle n'est pas rapide parce qu'elle contient probablement des .select qui ralentissent l'exécution du code.
Peut-être que vous pourriez poster votre code ici. Sinon, voici une possibilité :
function FirstBigger(Source as range, Plancher as double, optional Strictement as boolean = true, optional Col as long = 1)
t = Source.columns(Col).value
for each e in t
if Strictement then
if e > Plancher then FirstBigger = e: exit function
else
if e >= Plancher then FirstBigger = e: exit function
end if
next e
end functionCdlt,
bonjour,
Personnellement je préfère les boucles qui sont souvent plus pratiques que les multiples tripatouillages dans une feuille...
Mébon, nous n'avons sans doute pas les mêmes valeurs !
Quelles cellules, quelle colonne, quelle valeur ?
Quelle première cellule ? La première dans l'ordre de tri actuel ? (en partant du haut)
Pour ce genre de questions un bout de classeur est vivement recommandé. Sans compter que si tu es déjà dans un contexte de macro ça pourrait surement t'ouvrir des horizons nouveaux...
A+
Bonjour,
Merci à tous pour vos réponses. Effectivement je pourrais certainement optimisé mes boucle sans les select mais j’ai six feuilles de 51000 lignes à analyser raison pour laquelle je m’étais orientée vers la fonction find. Je vais essayer de vous transmettre un bout de code demain dans la journée (il est fonctionnel mais beaucoup trop lent). Merci encore et bonne soirée 😜
Bonjour La Kaze, 3GB, Galopin01,
Vu ta version récente d'Excel. Tu peux utiliser la formule EQUIVX qui permet comme EQUIV de cibler la position d'une valeur dans une colonne par exemple.
Mais à contrario de EQUIV, les valeurs n'ont pas besoin d'être ordonnées de manière croissante ou décroissante.
En VBA c'est MATCH qui fait l'EQUIV. Et XMATCH qui fait l'EQUIVX et non MATCHX qui aurait été plus logique...
Sub PremSup()
'Variable saisie ou calculée. Avec ajout d'un delta
Nb = 31 + 0.01
'Position = ligne de la valeur la + proche supérieure
[B5] = WorksheetFunction.XMatch(Nb, Range("A1:A51000"), 1)
[B6] = Cells([B5], 1) ' Valeur proche supérieure à la variable
End SubDans l'exemple pour une colonne de nombres entiers on donne une variation (décimale) minime à la variable.
Pour une variable décimale, ajouter un delta au centième de décimale. etc...
Et en cellule B5 il ressort le n° de ligne ou se trouve la valeur supérieure immédiatement la plus proche. Donc qui présente l'écart le plus minime avec la variable.
Il peut se trouver des valeurs plus importantes avant. Mais qui présentent donc des écarts plus grands avec la variable que celle ressortie par XMATCH.
En cellule B6, avec la position de ligne et la colonne cible, s'inscrit alors la valeur trouvée.
Bonjour à tous,
je m'excuse pour le retard de ma réponse, j'ai eu deux semaines bien occupés. Je n'ai pas encore pris le temps d'essayer correctement les diverses solution proposés. Mais je m'y remet gentiment. concernant le code, je ne sais pas comment le partager, je suis amateur en vba mais aussi sur le forum^^
pour rentrer un peu plus dans les détails, j'analyse des données financières mais je ne vais pas m'éterniser sur le sujet ce serait beaucoup trop long a expliquer et pas nécessaire pour comprendre ce que je cherche a faire.
Admettons, on a une colonne qui vas de un a dix par incrément de un. Pour une raison x je commence la recherche a partir de la cellule 4 en allant vers le bas donc vers 10. j'ai une variable qui vaux 6,5. j'aimerais en partant de la cellule 4, que le programme me trouve la première cellule qui soit égale ou supérieur a ma variable. donc dans notre exemple, la cellule qui vaux 7. Si la variable avait été 6, il m'aurait trouver la cellule qui vaux 6. J'aimerais pouvoir le faire via une fonction cells.find ou équivalent sans passer par une répétition de boucle qui analyse ligne par ligne.
Merci encore a tous pour votre aide
Salut La kaze,
Salut les as,
première piste sans trop savoir comment se présente le truc...
Ici, on jour avec une seule feuille : à toi à être plus précis encore.
Un double-clic sur la feuille démarre la macro
- invitation (complexe, sans doute) dans une InputBox à introduire la colonne de recherche, la ligne de départ de la recherche et la valeur-pivot, le tout séparé d'un slash. Ex : D/85/69.25
- cette "BDD" ne compte que 250 lignes (pas abuser, hein)
- peut mieux faire, je sais...
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
'
Dim tTab, lngRow&, lngTRow&, dblVal#, dblMax#
'
Cancel = True
sData = Application.InputBox("Colonne/Ligne/Valeur", "Financial", 2)
If sData <> "Faux" Then
If InStr(sData, "/") > 0 Then
If InStr(sData, "/") <> InStrRev(sData, "/") Then
sCol = CStr(Split(sData, "/")(0))
lngRow = CLng(Split(sData, "/")(1))
dblVal = CDbl(Split(sData, "/")(2))
dblMax = WorksheetFunction.Max(Range(sCol & ":" & sCol))
tTab = Range(sCol & "1:" & sCol & Range(sCol & Rows.Count).End(xlUp).Row).Value
For x = lngRow To UBound(tTab, 1)
If CDbl(tTab(x, 1)) > dblVal And CDbl(tTab(x, 1)) < dblMax Then _
lngTRow = x: _
dblMax = CDbl(tTab(x, 1))
Next
Range(sCol & lngTRow).Select
End If
End If
End If
'
End Sub
A+