La méthode find permet de trouver la première occurrence d'une information spécifique, dans un range. En clair, cette méthode permet d'aller chercher dans une feuille ou une partie d'une feuille Excel, une information, une donnée ou une partie de cette donnée.
MonRange : Expression qui représente ici l'objet Range dans lequel vous souhaitez chercher la valeur contenue dans « What ». Cela peut être votre feuille en entier (
Sheets(1).Cells.Find(...)
), une colonne (
Sheets(1).Columns(3).Find(...)
), une ligne (
Sheets(1).Rows(7).Find(....)
) ou une plage de cellules (
Sheets(1).Range("D12:F56").Find(....)
).
What : Obligatoire. De type variant, il s'agit de ce que vous cherchez dans votre range. What peut être de n'importe quel type de données qu'Excel est capable de traiter.
After : Facultatif. De type variant. Cellule après laquelle vous souhaitez commencer la recherche. Cela correspond à la position de la cellule active lorsqu'une recherche est effectuée à partir de l'interface utilisateur. Notez que l'argument Après doit correspondre à une seule cellule de la plage. Rappelez-vous que la recherche commence après cette cellule ; la cellule spécifiée n'est pas recherchée jusqu'à ce que la méthode revienne à cette cellule. Si vous ne spécifiez pas cet argument, la recherche commence après la cellule située dans le coin supérieur gauche de la plage.
LookIn : Facultatif. De type variant. Traduction instantanée : regarder dans. En effet, nous cherchons une valeur dans un Range, mais nous pouvons de plus spécifier dans quoi elle est contenue (Valeur : LookIn:=XlValues, Formule : LookIn:=XlFormulas)
LookAt :Facultatif. De type variant, il indique si la valeur trouvée doit être rigoureusement égale à la valeur cherchée, ou en partie seulement. Exemple, dans la matrice : 6210, 4105, 540, 163, 154, 132, 10, vous recherchez la valeur 10. Pour indiquer à VBA que vous cherchez exclusivement 10, vous utiliserez LookAt:=XlWhole. A contrario, pour lui indiquer que 6210 ou 4105 vous conviennent (elles contiennent toutes deux 10), vous utiliserez : LookAt:=XlPart.
SearchOrder : Facultatif. De type variant. L'ordre de recherche admet une des deux constantes : xlByRows (par lignes) ou xlByColumns (par colonnes).
SearchDirection : Facultatif. De type variant. Indique le sens de recherche lors de l'exploration d'une plage. Soit xlNext, recherche la valeur suivante dans la plage, soit xlPrevious, recherche la valeur précédente.
MatchCase : Facultatif. De type variant. Deux valeurs pour cet argument : par défaut False, et pour que la recherche respecte la casse, lui affecter la valeur True.
SearchFormat : Facultatif. De type variant. True ou False selon si vous affectez un formatage (monétaire, standard, nombre, bordure, remplissage, alignement...).
A noter : Un argument facultatif MatchByte de type variant, s'utilise si vous avez installé et utilisez la prise en charge des langues codées sur deux octets (False pour que les caractères codés sur deux octets correspondent à leurs équivalents codés sur un octet)
Valeur renvoyée
La méthode find renvoie l'objet Range représentant la cellule ou est trouvée la première occurrence de la valeur cherchée. Cette méthode renvoie Nothing si aucune correspondance n'est trouvée. Ceci est par conséquent source d'erreurs qu'il vous faudra traiter (voir exemple d'utilisation). La méthode Find n'affecte pas la sélection ni la cellule active.
A savoir
Les paramètres des arguments LookIn, LookAt, SearchOrder et MatchCase sont enregistrés chaque fois que vous utilisez cette méthode. Si vous ne spécifiez aucune valeur pour ces arguments lors du prochain appel à la méthode, les valeurs enregistrées sont utilisées. Le fait de définir ces arguments modifie les paramètres de la boîte de dialogue Rechercher, ce qui a pour effet de changer les paramètres enregistrés qui sont utilisés lorsque vous ne spécifiez pas les arguments. Pour éviter toute ambiguïté, définissez ces arguments explicitement chaque fois que vous utilisez cette méthode
Exemple d'utilisation
Option Explicit
SubCherche()'déclaration des variables :Dim Trouve As Range, PlageDeRecherche As Range
Dim Valeur_Cherchee AsString, AdresseTrouvee AsString'********* à adapter ***********'affectation de valeurs aux variables :'on cherche le mot "Trouve"
Valeur_Cherchee ="Trouve"'dans la première colonne de la feuille activeSet PlageDeRecherche = ActiveSheet.Columns(1)'*******************************'méthode find, ici on cherche la valeur exacte (LookAt:=xlWhole)Set Trouve = PlageDeRecherche.Cells.Find(what:=Valeur_Cherchee,
LookAt:=xlWhole)'traitement de l'erreur possible : Si on ne trouve rien :If Trouve IsNothingThen'ici, traitement pour le cas où la valeur n'est pas trouvée
AdresseTrouvee = Valeur_Cherchee
&" n'est pas présent dans "& PlageDeRecherche.Address
Else'ici, traitement pour le cas où la valeur est trouvée
AdresseTrouvee = Trouve.Address
EndIf
MsgBox AdresseTrouvee
'vidage des variablesSet PlageDeRecherche =NothingSet Trouve =NothingEndSub
Remarque : Si nous avions cherché le nombre 1024 au lieu du mot Trouve, il aurait fallu déclarer Valeur_Cherchee As Integer. What étant variant, vous pouvez chercher n'importe quel type de donnée Excel, du moment ou vous le spécifiez dans la déclaration de votre variable.
Recherche multiple
FindNext - FindPrevious
Les méthodes FindNext et FindPrevious permettent de répéter la recherche.
Lorsque la recherche atteint la fin de la plage de recherche spécifiée, elle revient au début de cette plage. Pour arrêter une recherche lorsqu'elle revient au point de départ, enregistrez l'adresse de la première cellule trouvée, puis comparez l'adresse de chaque cellule ultérieurement trouvée avec l'adresse enregistrée.
Vous pouvez trouver une fonction utilisant FindNext dans cette fiche de Lermitte222.
Une variante : Find_Next
Ce code de Michel_M, permet de lister les lignes d'une colonne dont les cellules contiennent la valeur recherchée. Dans l'exemple codé ici, nous allons chercher "mot" dans la plage "A1:A20".
Cela fonctionne pour toute plage de cellule ne comportant, bien sur, qu'une seule colonne, y compris pour une colonne entière.
SubPrincipale()Dim Plage As Range
DimLignes(), i AsLongDim Texte AsStringDim Flag AsBooleanSet 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 plageIf Flag Then'restitution des lignes correspondantesFor i =LBound(Lignes)ToUBound(Lignes)
Debug.Print Lignes(i)Next i
Else
MsgBox "L'expression : "& Texte
&" n'a pas été trouvée dans la plage : "& Plage.Address
EndIfEndSub'Sources : Michel_m'http://www.commentcamarche.net/forum/affich-31432413-importation-de-donnees-sans-doublons#9FunctionFind_Next(Rng As Range, Texte AsString,Tbl())AsBooleanDim Nbre AsInteger, Lig AsLong, Cptr AsLong
Nbre = Application.CountIf(Rng, Texte)If Nbre >0ThenReDimTbl(Nbre -1)
Lig =1For Cptr =0To Nbre -1
Lig = Rng.Find(Texte,Cells(Lig, Rng.Column), xlValues).Row
Tbl(Cptr)= Lig
NextElseGoTo Absent
EndIf
Find_Next =TrueExitFunction
Absent:
Find_Next =FalseEndFunction
Nota 1 : Pour une colonne entière, dans la procédure d'appel, remplacez :
Set Plage =Sheets("Feuil1").Range("A1:A20")
par :
Set Plage =Sheets("Feuil1").Columns(1)
Nota 2 : Pour retourner les adresses des cellules plutôt que leur numéro de ligne, dans la fonction Find_Next, remplacez :
Lig = Rng.Find(Texte,Cells(Lig, Rng.Column), xlValues).Row
Tbl(Cptr)= Lig
par :
Lig = Rng.Find(Texte,Cells(Lig, Rng.Column), xlValues).Row
Tbl(Cptr)=Cells(Lig, Rng.Column).Address
FindAll
Sources.
Cette fonction personnalisée bien pratique retournant le résultat de Find et FindNext sous la forme d'un tableau de valeurs. Elle trouve toutes les instances d'un String (passé en paramètre de cette fonction : sText As String) et retourne un tableau contenant les numéros de ligne.
Les paramètres de cette fonction :
ByVal sText As String => La valeur recherchée,
ByRef oSht As Worksheet => la feuille ou chercher cette valeur,
ByRef sRange As String => le Range précis ou chercher la valeur,
ByRef arMatches() As String => la variable tableau ou vont être stockées les valeurs de retuor (lignes, adresses, etc...)
Merci à Jordane45 pour cette découverte.
FunctionFindAll(ByVal sText AsString,ByRef oSht As Worksheet,ByRef sRange AsString,ByRefarMatches()AsString)AsBoolean' --------------------------------------------------------------------------------------------------------------' FindAll - To find all instances of the1 given string and return the row numbers.' If there are not any matches the function will return false' --------------------------------------------------------------------------------------------------------------OnErrorGoTo Err_Trap
Dim rFnd As Range ' Range ObjectDim iArr AsInteger' Counter for ArrayDim rFirstAddress ' Address of the First Find' -----------------' Clear the Array' -----------------Erase arMatches
Set rFnd = oSht.Range(sRange).Find(what:=sText, LookIn:=xlValues, lookAt:=xlPart)IfNot rFnd IsNothingThen
rFirstAddress = rFnd.Address
DoUntil rFnd IsNothing
iArr = iArr +1ReDimPreservearMatches(iArr)arMatches(iArr)= rFnd.Row 'rFnd.Address pour adresse complete ' rFnd.Row Pour N° de ligneSet rFnd = oSht.Range(sRange).FindNext(rFnd)If rFnd.Address = rFirstAddress ThenExitDo' Do not allow wrapped searchLoop
FindAll =TrueElse' ----------------------' No Value is Found' ----------------------
FindAll =FalseEndIf' -----------------------' Error Handling' -----------------------
Err_Trap:If Err <>0Then
MsgBox Err.Number &" "& Err.Description, vbInformation,"Find All"
Err.Clear
FindAll =FalseExitFunctionEndIfEndFunction