VBA Fonction Find

Résolu
dan03 Messages postés 19 Date d'inscription   Statut Membre Dernière intervention   -  
dan03 Messages postés 19 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

5 réponses

  1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     
    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
  2. dan03 Messages postés 19 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
    1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      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
      1. dan03 Messages postés 19 Date d'inscription   Statut Membre Dernière intervention   2 > yg_be Messages postés 23437 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
      2. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > dan03 Messages postés 19 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
      3. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > dan03 Messages postés 19 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
  3. dan03 Messages postés 19 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
    1. cs_Le Pivert Messages postés 8437 Statut Contributeur 730
       
      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
      1. cs_Le Pivert Messages postés 8437 Statut Contributeur 730 > cs_Le Pivert Messages postés 8437 Statut Contributeur
         
        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
    2. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588
       
      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
  4. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  5. dan03 Messages postés 19 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