Recherche dans une colonne cellule active vers le haut

Bonjour tout le monde,

J'ai un fichier, un peu trop volumineux pour le poster. Veuillez m'en excuser.

Voila mon problème. J'ai un fichier dans lequel il y a des references.

J'ai créer un bouton "+" pour selectionner la réference suivante (ligne en dessous) si dans la colonne "DV" de la ligne concernée, il y a la valeur "NV". Si ce n'est pas le cas, on test la ligne suivante.

Ci dessous le code que j'ai mis. Ce dernier fonctionne très bien:

Dim lig
   With Sheets("Base de données")
lig = Application.Match(Range("cel_symbole"), .Columns("B"), 0)
' cel_symbole correspond a la reference à chercher. 
If IsError(lig) Then
  'Exit Sub
End If

For Ln = lig + 1 To .Range("B" & Rows.Count).End(xlUp).Row '2ème boucle imbriqué a celle du dessus qui permet de definir la variable Ln "de la ligne 8 à la derniere ligne non vide colonne B. Les 2 boucles permettent de balayer les colonnes J,Q,X,AE... (donc toutes les 7 colonnes.
                If .Cells(Ln, "DV").Value = "NV" Then

Sheets("Recherche").Range("cel_symbole") = .Range("B" & Ln).Value
Exit For
End If
Next Ln
End With

Mon problème est que j'essaye de faire maintenant un bouton "-" qui lorsqu'on clic dessus, fait la même chose mais vers le haut (ligne au dessus).

J'ai essayé plusieurs chose, mais je n'arrive pas a le faire fonctionner.

Voila le code que j'ai mis:

Dim lig
   With Sheets("Base de données")
lig = Application.Match(Range("cel_symbole"), .Columns("B"), 0)
If IsError(lig) Then
  Exit Sub
End If

For Ln = lig - 1 To .Range("B" & Rows.Count).End(xlUp).Row   '2ème boucle imbriqué a celle du dessus qui permet de definir la variable Ln "de la ligne 8 à la derniere ligne non vide colonne B. Les 2 boucles permettent de balayer les colonnes J,Q,X,AE... (donc toutes les 7 colonnes.
                If .Cells(Ln, "DV").Value = "NV" Then

Sheets("Recherche").Range("cel_symbole") = .Range("B" & Ln -1).Value
Exit For
End If
Next Ln
End With

Pourriez vous me donner un coup de main s'il vous plait?

Merci.

Bonjour, s'il n'y a pas beaucoup de ligne à traiter (<5000) vous pouvez peut-être essayer une méthode un peu barbare mais qui fonctionnera, exemple avec une boucle for

for i = dernière_ligne to 1 step -1

if cellule = machin truc then bidule chouette...

next

de cette façon vous remonter votre colonne par le bas en vérifiant chaque cellule, c'est barbare mais ça fonctionne..

Bonjour,

Merci pour votre réponse.

Par contre j'ai énormement de ligne. 44302 pour le moment et c'est un fichier qui evolue régulierement.

Ca risuqe d'être un peu trop non?

Pour se type de boucle oui...Ou alors il faut aller boire un café entre temps. Mais dites-moi, je suis curieux de savoir pourquoi donc avez vous besoin de balayer du haut vers le bas puis l'inverse...Est-ce primordial ? Avez vous essayez la methode find ?

Oui, ce n'est pas primordial, mais trés interessant pour le fonctionnement de mon fichier.

Pour la petite explication, j'ai des milliers de références, j'utilise déja la methode find pour chercher une réference. Celle ci fonctionne trés bien. Mais lorsque je fais beaucoup de saisie, pour eviter de taper à chaque fois dans mon "moteur de recherche" chaque réferences , alors que celle que je recherche se trouve souvent juste avant ou aprés, j'ai créé un bouton "+" et un bouton "-".

Voila, j'espere que c'est assez clair.

Si je vous ai demandé si vous connaissiez la méthode find c'est parce qu'elle est assez bien paramétrable, exemple basique ci-dessous d'une recherche vers le haut (l'équivalent de votre "-") a partir de la cellule active.

Sub recherche_en_haut()
    Dim quoi As Integer, trouve As Range
    quoi = ActiveCell.Value
    Set trouve = Feuil1.Range("a1:a20").Find(quoi, after:=ActiveCell, lookat:=xlWhole, searchdirection:=xlPrevious)
    If Not trouve Is Nothing Then MsgBox trouve.Address
End Sub

C'est déja ce que je fais pour trouver mes réferences. Avec cette méthode, je retrouve bien ma référence. Mais ce que je voudrais c'est que cette reférence soit prise en compte uniquement si il y a marqué "NV" dans la colonne "DV".

Mais je n'arrive pas a l'adapter.

Dans se cas vous rajoutez en début de macro

If Cells(ActiveCell.Row, 126) = "NV" Then

Je ne comprends pas, ca ne peut pas fonctionner ainsi.

en premier lieu, je cherche la valeur qui se trouve dans la celulle "Cel_symbole" dans ma feuille "base de données" en colonne "B":

Dim lig
 '  With Sheets("Base de données")
'lig = Application.Match(Range("cel_symbole"), .Columns("B"), 0)
'If IsError(lig) Then
 ' Exit Sub
'End If

jusqu'a la tout va bien.

Une fois la ligne trouvée, je regarde la valeur (lig) dans la ligne au dessus si dans la colonne "DV" il y a la valeur "NV:

For Ln = lig - 1 To .Range("B" & Rows.Count).End(xlUp).Row    
              If .Cells(Ln, "DV").Value = "NV" Then

si dans la colonne "DV" de la ligne au dessus de (lig) il y a la valeur "NV" alors on dit que "cle_symbole" = lig-1

et on sort de la boucle:

Sheets("Recherche").Range("cel_symbole") = .Range("B" & Ln -1).Value
'Exit For

Si ce n'est pas le cas, on test le ligne suivante (au dessus):

Next Ln

Bon...Pardonnez moi de vous avoir fait perdre du temps mais je ne comprends pas grand chose donc je laisse la main à celles et ceux qui auront une meilleur clairvoyance que moi...

Pas de souci, merci quand même pour votre aide.

Bonne continuation.

Comme j'ai l'impression d'être un incompris j'ai fais un petit fichier très simplifié qui expliquera beaucoup mieux ce que je cherche à faire.

Merci à vous.

20forum-v1.xlsm (30.73 Ko)

j'ai refait un fichier neuf parce que les controles activex font planter mon excel, toujours avec la méthode find il y a cette possibilité.

LA cellule de recherche (votre cel symbole) est en cellule dx1

Merci. Ca marche très bien dans ton fichier, mais impossible de l'adapter au miens.

J'ai le message: "La methode activate de la classe range à echoué."

Dim quoi As Variant, trouve As Range, trouve2 As Range
    quoi = Sheets("Recherche").Range("cel_symbole")
    Set trouve = Sheets("Base de données").Range("b:b").Find(quoi, lookat:=xlWhole)
    If Not trouve Is Nothing Then
        trouve.Offset(0, 124).Activate        
quoi = "NV"
        Set trouve = Sheets("Base de données").Range("dv:dv").Find("NV", after:=ActiveCell, lookat:=xlWhole, searchdirection:=xlPrevious)
        If Not trouve Is Nothing Then
            MsgBox trouve.Address & " " & Cells(trouve.Row, 2)
            Sheets("Recherche").Range("cel_symbole") = Cells(trouve.Row, 2)
        End If
    End If

si excel n'arrive même plus à activer une cellule c'est qu'il est fatigué vraiment fatigué...Ou alors c'est qu'il n'a rien trouvé, donc il ne peut pas activer la cellule de la colonne DV

Bonjour,

Je me suis remis dessu, mais rien à faire je ne trouve pas la raison.

Peux tu m'expliquer le 124? la colonne DV est normalement la colonne 126 non?

trouve.Offset(0, 124).Activate

Bonjour, d'accord.

Je crois que je viens de comprendre pourquoi, mais je ne sais pas comment resoudre le problème.

En fait, il ne trouve pas de valeur NV car il n'y a pas vraiment de valeur NV!!!

En fait mon NV vient d'une formule. J'ai fais le test dans ton fichier et effectivement il ne trouve pas le NV quand ce dernier est issus d'une formule.

as tu une idée?

Set trouve = Sheets("Base de données").Range("dv:dv").Find("NV", after:=ActiveCell, LookIn:=xlValues, lookat:=xlWhole, searchdirection:=xlPrevious)


DV est en colonne 126 mais le décalage est à prendre en compte à partir de la colonne de trouve. Trouve étant dans la colonne B(soit 2) 126-2 = 124 colonne de décalage entre les deux...

Bon, en fait, je crois que je me suis un peu trop avancé! ce n'est pas ca le problème! je vais encore me casser un peu la tête la dessus! ca doit etre un truc tout bête.

En tout cas, merci pour tes explications, c'est beaucoup plus clair pour moi maintenant.

Je viens de mettre la ligne:

MsgBox trouve.Offset(0, 124)

et pourtant j'ai bien NV en retour!! c'est fou ça!!

Rechercher des sujets similaires à "recherche colonne active haut"