VBA Fonction Find

Résolu
dan03 Messages postés 31 Date d'inscription   Statut Membre Dernière intervention   -  
dan03 Messages postés 31 Date d'inscription   Statut Membre Dernière intervention   -
Bonjour,

Je débute en VBA
Je voudrais trouver la ligne d'une variable dans la colonne 2 (B)
Mon code:
Dim Ligne, An As Integer
      Ligne = Columns(2).Find(AChaineDate, lookat:=xlWhole).Row


La ligne est bien trouvée, mais la prochaine recherche s'effectue à partir de la 1ère ligne de la colonne, (ActiveCell) alors que je voudrais continuer la recherche à la suite
J'ai vu que la fonction Find avait un argument After, mais je n'ai pas réussi à l'utiliser

Pouvez-vous m'aider à modifier mon code, avec quelques explications
Merci Cordialement
A voir également:

5 réponses

yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 584
 
bonjour,
merci d'utiliser les balises de code quand tu partages du code: https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

exemple:
Dim Ligne as long, An As Integer, trouve1 as range, trouve2 as range

set trouve1=Columns(2).Find(AChaineDate, lookat:=xlWhole)
Ligne = trouve1.Row
set trouve2=Columns(2).FindNext(trouve1)
0
dan03 Messages postés 31 Date d'inscription   Statut Membre Dernière intervention   2
 
Merci de ta réponse
Mais ce code ne fonctionne pas
Si AChaineDate existe dans une ligne précédente, Ligne reprend cette ligne
C'est Pourquoi, je pensais utiliser l'argument After de la fonction Find
As-tu une idée ?
Merci
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 
peut-être pourrais-tu expliquer ce que tu souhaites obtenir?
sinon, difficile de suggérer comment modifier ton code.
pourquoi fais-tu cette recherche? que veux tu faire avec la ou les lignes trouvées?
0
dan03 Messages postés 31 Date d'inscription   Statut Membre Dernière intervention   2 > yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 
Bonjour,
En fait, j'ai 1 colonne A qui contient des Années, et 1 B qui contient Jour et Mois
Ma variable AChaineDate contient Jour et Mois soit, colonne B
Je veux récupérer l'Année (colonne A) qui se trouve sur la même ligne que AChaineDate
Si la valeur AChaineDate est unique dans la colonne B, cela fonctionne avec Find (comme je l'ai fait)
Mais si AChaineDate existe plusieurs fois, la fonction Find cherchant depuis le début de la colonne m'indique une Année fausse (celle trouvée la première)
C'est pourquoi, je voulais utiliser l'argument "After", mais je n'ai pas réussi
En fait, je veux que la recherche se poursuive et non reparte de B1
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > dan03 Messages postés 31 Date d'inscription   Statut Membre Dernière intervention  
 
quand tu écris "Je veux récupérer l'Année (colonne A) qui se trouve sur la même ligne que AChaineDate", veux-tu écrire que tu veux récupérer toutes les années? pour en faire quoi?
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584 > dan03 Messages postés 31 Date d'inscription   Statut Membre Dernière intervention  
 
tu trouveras un exemple ici: https://www.commentcamarche.net/faq/18696-vba-recherche-find-avec-retour-multiple
0
jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752 > yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention  
 
0
cs_Le Pivert Messages postés 7904 Date d'inscription   Statut Contributeur Dernière intervention   729
 
0
dan03 Messages postés 31 Date d'inscription   Statut Membre Dernière intervention   2
 
Merci pour votre aide
Mais personne ne m'a donné un exemple avec Find et l'argument After
J'aimerai un exemple concret
Cordialement
0
cs_Le Pivert Messages postés 7904 Date d'inscription   Statut Contributeur Dernière intervention   729
 
dans le lien donné il y a un exemple concret. C'est à toi de l'adapter!

Sub Principale()
Dim Plage As Range
Dim Lignes(), i As Long
Dim Texte As String
Dim Flag As Boolean

Set Plage = Sheets("Feuil1").Range("A1:A20") 'plage de recherche
Texte = "mot"   'expression cherchée
Flag = Find_Next(Plage, 
                            Texte, 
                             Lignes())  'appel de la fonction
'si fonction retourne Vrai = expression trouvée dans la plage
If Flag Then  
     'restitution des lignes correspondantes
    For i = LBound(Lignes) To UBound(Lignes)  
        Debug.Print Lignes(i)
    Next i
Else
    MsgBox "L'expression : " 
                  & Texte 
                  & " n'a pas été trouvée dans la plage : " 
                  & Plage.Address
End If
End Sub

'Sources : Michel_m
'http://www.commentcamarche.net/forum/affich-31432413-importation-de-donnees-sans-doublons#9
Function Find_Next(Rng As Range, Texte As String, Tbl()) As Boolean
Dim Nbre As Integer, Lig As Long, Cptr As Long

    Nbre = Application.CountIf(Rng, Texte)
    If Nbre > 0 Then
        ReDim Tbl(Nbre - 1)
        Lig = 1
        For Cptr = 0 To Nbre - 1
            Lig = Rng.Find(Texte, Cells(Lig, Rng.Column), xlValues).Row
            Tbl(Cptr) = Lig
        Next
    Else
        GoTo Absent
    End If
    Find_Next = True
    Exit Function
Absent:
    Find_Next = False
End Function


voilà
0
cs_Le Pivert Messages postés 7904 Date d'inscription   Statut Contributeur Dernière intervention   729 > cs_Le Pivert Messages postés 7904 Date d'inscription   Statut Contributeur Dernière intervention  
 
Voilà un exemple concret adapter à ta colonne de recherche:

Option Explicit
Sub Principale()
Dim Plage As Range
Dim Lignes(), i As Long
Dim Texte As String
Dim Flag As Boolean

Set Plage = Sheets("Feuil1").Range("B1:B20") 'plage de recherche à adapter
Texte = "20 mars"   'expression cherchée à adapter
Flag = Find_Next(Plage, Texte, Lignes()) 'appel de la fonction
'si fonction retourne Vrai = expression trouvée dans la plage
If Flag Then
     'restitution des lignes correspondantes
    For i = LBound(Lignes) To UBound(Lignes)
        Debug.Print Lignes(i)
        Range("C" & Lignes(i)).Value = Range("A" & Lignes(i)).Value 'résultat à adapter
    Next i
Else
    MsgBox "L'expression : " _
                  & Texte _
                  & " n'a pas été trouvée dans la plage : " _
                  & Plage.Address
End If
End Sub
'Sources : Michel_m
'http://www.commentcamarche.net/forum/affich-31432413-importation-de-donnees-sans-doublons#9
Function Find_Next(Rng As Range, Texte As String, Tbl()) As Boolean
Dim Nbre As Integer, Lig As Long, Cptr As Long

    Nbre = Application.CountIf(Rng, Texte)
    If Nbre > 0 Then
        ReDim Tbl(Nbre - 1)
        Lig = 1
        For Cptr = 0 To Nbre - 1
            Lig = Rng.Find(Texte, Cells(Lig, Rng.Column), xlValues).Row
            Tbl(Cptr) = Lig
        Next
    Else
        GoTo Absent
    End If
    Find_Next = True
    Exit Function
Absent:
    Find_Next = False
End Function


voilà mais la recherche est faite sur une cellule texte et non une date
0
yg_be Messages postés 23541 Date d'inscription   Statut Contributeur Dernière intervention   1 584
 
difficile de donner un exemple qui correspond à ce que tu veux réaliser, puisque tu ne l'expliques pas.

quand tu écris "Je veux récupérer l'Année (colonne A) qui se trouve sur la même ligne que AChaineDate", veux-tu écrire que tu veux récupérer toutes les années? pour en faire quoi?
0

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

Posez votre question
dan03 Messages postés 31 Date d'inscription   Statut Membre Dernière intervention   2
 
Malgré vos explications, je n'ai pas réussi
J'ai du mal exprimé mon problème
Je vais modifier totalement mon code
Je vous remercie pour votre aide et je mets le sujet en résolu
0