VBA Fonction Find [Résolu]

Signaler
Messages postés
31
Date d'inscription
dimanche 20 mai 2007
Statut
Membre
Dernière intervention
22 octobre 2020
-
Messages postés
31
Date d'inscription
dimanche 20 mai 2007
Statut
Membre
Dernière intervention
22 octobre 2020
-
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

Messages postés
12763
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
25 octobre 2020
712
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)
Messages postés
31
Date d'inscription
dimanche 20 mai 2007
Statut
Membre
Dernière intervention
22 octobre 2020

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
Messages postés
12763
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
25 octobre 2020
712
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?
Messages postés
31
Date d'inscription
dimanche 20 mai 2007
Statut
Membre
Dernière intervention
22 octobre 2020
>
Messages postés
12763
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
25 octobre 2020

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
Messages postés
12763
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
25 octobre 2020
712 >
Messages postés
31
Date d'inscription
dimanche 20 mai 2007
Statut
Membre
Dernière intervention
22 octobre 2020

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?
Messages postés
12763
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
25 octobre 2020
712 >
Messages postés
31
Date d'inscription
dimanche 20 mai 2007
Statut
Membre
Dernière intervention
22 octobre 2020

Messages postés
29877
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
25 octobre 2020
2 884 >
Messages postés
12763
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
25 octobre 2020

Bonjour,
mieux vaut utiliser le lien proposé par cs_Le Piverts
https://www.commentcamarche.net/faq/36886-methode-find-dans-vba-recherche-de-donnees-sous-excel
Messages postés
6985
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
22 octobre 2020
562
Messages postés
31
Date d'inscription
dimanche 20 mai 2007
Statut
Membre
Dernière intervention
22 octobre 2020

Merci pour votre aide
Mais personne ne m'a donné un exemple avec Find et l'argument After
J'aimerai un exemple concret
Cordialement
Messages postés
6985
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
22 octobre 2020
562
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à
Messages postés
6985
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
22 octobre 2020
562 >
Messages postés
6985
Date d'inscription
jeudi 13 septembre 2007
Statut
Contributeur
Dernière intervention
22 octobre 2020

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
Messages postés
12763
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
25 octobre 2020
712
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?
Messages postés
31
Date d'inscription
dimanche 20 mai 2007
Statut
Membre
Dernière intervention
22 octobre 2020

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