Trouver une valeur avec une fonction

Bonjour à tous.
Je tente de créer une fonction qui puisse me permettre de retrouver le numéro de ligne d’un enregistrement en fonction d’une valeur dans ma feuille.

Étant Novice, j’aurais souhaité la soumettre à la communauté.

Public Function TrouveLigne(MyVal As String, NomFeuille As String) As Integer
'Fonction chargée de récupérér le Numéro de ligne en rapport avec la valeur recherchée.

Dim Ws As Worksheet     'Réf à la feuille de calcul
Dim MyRange As Range    'Réf à la plage de cellules
Dim MyCell As Range     'Réf à la cellule recherchée

Dim Lng_LastRow As Long     'dernière Ligne
Dim Lng_LastCol As Long     'dernière colonne

'On définit la plage de cellule sur laquelle va s'effectuer la recherche
Set Ws = ThisWorkbook.Sheets(NomFeuille)
Lng_LastRow = Ws.Range("A" & Rows.Count).End(xlUp).Row
Lng_LastCol = Ws.Cells(1, Cells.Columns.Count).End(xlToLeft).Column

'Si le tableau est vide on quitte la procédure.
'Attention, le tableau contient 1 ligne d'en-tête
If Lng_LastRow <= 1 Then
    Set Ws = Nothing
    Exit Function
End If

Set MyRange = Ws.Range(Cells(1, 1), Cells(Lng_LastRow, Lng_LastCol))
Set MyCell = MyRange.Find(What:=MyVal, LookIn:=xlValues, LookAt:=xlWhole)

TrouveLigne = MyCell.Row

Set MyCell = Nothing
Set MyRange = Nothing
Set Ws = Nothing

End Function

Pour le moment, tout semble fonctionner, mais j’aimerais connaitre votre avis et savoir si je n’ai pas fais d’erreur.

Pour finir, j’aurais 2 questions.

1 - Comment dois-je modifier le code dans le cas où la valeur recherchée ne serait pas trouvé ?
(Je pensais à « If MyCell IsNothing then Exit Function »)

2 - Comment dois-je modifier le code pour rechercher plusieurs valeurs sur une même ligne ?
(J’imaginais quelque chose comme ; )

If MyCell.Offset(0, 1) = val2 And MyCell.Offset(0, 2) = val3 Then
	TrouveLigne = MyCell.Row
Else
	Msgbox "Valeur non trouvée"
	Exit Function
End if

Qu’en pensez vous ?

Bonjour,

Quand on crée un fonction, il faut faire en sorte qu’elle s’applique à plusieurs cas.
Il faut donc éviter qu’elle ne s’applique qu’à une feuille et une colonne particulière.
Pour cela il faut bien choisir les arguments qui lui sont transmis.
Dans ce cas il est préférable de transmettre la colonne dans laquelle chercher, ça devient très simple :

Option Explicit
Sub test()
Dim col As Range, noL As Long
  
  Set col = ThisWorkbook.Worksheets(1).Columns(2)  'ou n'importe quelle colonne d'un autre classeur
  noL = TrouveLigne("Lucette", col)
  If noL = 0 Then
    MsgBox "Non Trouvé"
  Else
    MsgBox " Trouvé ligne " & noL
  End If

End Sub

Public Function TrouveLigne(MyVal As Variant, MyCol As Range) As Long
'Fonction chargée de récupérér le Numéro de ligne en rapport avec la valeur recherchée.
Dim MyCell As Range
  Set MyCell = MyCol.Find(What:=MyVal, LookIn:=xlValues, LookAt:=xlWhole)
  If Not MyCell Is Nothing Then TrouveLigne = MyCell.Row
  Set MyCell = Nothing
End Function

C’est utilisable dans tous les cas.
Note : un numéro de ligne doit être de type Long

Comment faire en 3 lignes ce que je fais en 25 ?!?
Simple ; Demandez à Patrice. :grin:

Encore une fois merci beaucoup pour toute l’aide que tu m’apporte.
C’est très généreux de ta part.

Peut-être aurais-tu quelques suggestions à me faire quant à mon nouveau Post.
(Et oui, encore moi, toujours moi :upside_down_face:)

J’avance sur mon projet, je suis presque à la fin. Mais je suis confronté à un cas d’école qui me laisse de véritable suée.

Si je pouvais une fois de plus abuser de ta patience …
:pleading_face:

Ce sujet a été automatiquement fermé après 30 jours. Aucune réponse n’est permise dorénavant.