VBA Fonction Find
Résolu
Bonjour,
Je débute en VBA
Je voudrais trouver la ligne d'une variable dans la colonne 2 (B)
Mon code:
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
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
-
Contributeurbonjour,
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)
-
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-
-
@yg_beBonjour,
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 -
Contributeur@dan03quand 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?
-
Contributeur@dan03tu trouveras un exemple ici: https://www.commentcamarche.net/faq/18696-vba-recherche-find-avec-retour-multiple
-
Modérateur@yg_beBonjour,
mieux vaut utiliser le lien proposé par cs_Le Piverts
https://forums.commentcamarche.net/forum/affich-37621992-methode-find-dans-vba-recherche-de-donnees-sous-excel
-
-
Contributeur
-
Merci pour votre aide
Mais personne ne m'a donné un exemple avec Find et l'argument After
J'aimerai un exemple concret
Cordialement-
Contributeurdans 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à -
-
Contributeur@cs_Le PivertVoilà 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
-
-
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