mortalino
Messages postés
6786
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
21 décembre 2011
18
29 oct. 2006 à 23:53
Bon ben voici la fonction optimisée, ça devrait êtrebon pour tes besoins :
(sachant que ça récupère l'adresses des cellules contenant le mot recherché)
Public Function FindWord(ByVal sWord As String, Optional vPlage As Variant, Optional wSheet As Variant = "ActiveSheet") As String()
Dim bVerifPlage As Boolean, rStartCell As Range
If Not wSheet = "ActiveSheet" Then Sheets(wSheet).Select
'vérification de la feuille à traiter
If Not IsMissing(vPlage) Then bVerifPlage = True
'vérification d'une possible plage
Dim cMyAddress As New Collection
Dim sRes() As String
Dim ParseRange() As String
If bVerifPlage = False Then
' s'il n'y pas de plage, on vérifie dans toute la feuille
Cells.Find(What:=sWord, After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
, SearchFormat:=False).Activate: cMyAddress.Add ActiveCell.Address
Set rStartCell = ActiveCell
Do
Cells.FindNext(After:=ActiveCell).Activate: cMyAddress.Add ActiveCell.Address
Loop While ActiveCell.Address <> Range(rStartCell).Address
' on place l'adresse des cellules dans un tableau de données
' il sera facile de savoir après quelles cellules contiennent
' les données recherchées. (où même sélectionner ces cellules)
ReDim sRes(cMyAddress.Count - 1)
For i = 0 To cMyAddress.Count - 1
sRes(i) = cMyAddress.Item(i + 1)
Next i
Else
' s'il y pas une plage, on vérifie seulement dedans
Dim rPlage As Range
Set rPlage = vPlage
' on instancie l'objet (plage) en récupérant sa valeur
ParseRange = Split(CStr(rPlage.Address), ":")
' ici je récupère la dernière cellule de recherche, afin de la sélectionner
' comme ça, le résultat sera chronologique (sinon, la recherche s'effectue
' depuis la cellule sélectionnée)
Range(ParseRange(1)).Select
rPlage.Find(What:=sWord, After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
, SearchFormat:=False).Activate: cMyAddress.Add ActiveCell.Address
Set rStartCell = ActiveCell
Do
rPlage.FindNext(After:=ActiveCell).Activate: cMyAddress.Add ActiveCell.Address
Loop While ActiveCell.Address <> Range(rStartCell.Address).Address
' on place l'adresse des cellules dans un tableau de données
' il sera facile de savoir après quelles cellules contiennent
' les données recherchées. (où même sélectionner ces cellules)
ReDim sRes(cMyAddress.Count - 2)
For i = 0 To cMyAddress.Count - 2
sRes(i) = cMyAddress.Item(i + 1)
Next i
' rPlage = Nothing
End If
FindWord = sRes: Set cMyAddress = Nothing: Erase sRes
End Function
Sub Exemple_Utilisation()
Dim sResult() As String, l As Integer
'sResult = FindWord("abc", Range("A1:B20"))
sResult = FindWord("bonjour", Range("C23:Z114"), "Feuil3")
'sResult = FindWord(ComboBox1.Text, Range("A1:B20"))
' je t'ai mis trois exemple, mais en gros, avec ma fonction, voici ce que tu peux faire :
'Findword(ici le mot clé, pas obligatoire mais c'est pour la plage, pas obligatoire mais c'est pour la feuille)
For l = 0 To UBound(sResult)
Debug.Print "-" & sResult(l) & "-"
Next l
Erase sResult
End Sub
--Mortalino-- Colorisation automatique
@++
<hr width="100%" size="2" />
--Mortalino--
Le mystérieux chevalier, "Provençal, le Gaulois"
/DIV>