Un problème avec la méthode Find en VBA pour excel

devloukili Messages postés 7 Date d'inscription dimanche 15 octobre 2006 Statut Membre Dernière intervention 20 novembre 2006 - 18 oct. 2006 à 00:06
devloukili Messages postés 7 Date d'inscription dimanche 15 octobre 2006 Statut Membre Dernière intervention 20 novembre 2006 - 30 oct. 2006 à 21:50
Salut à tous! et merci pour vos réponses qui m'on permi de réalisé la création d'un dossier s'il n'existait pas de manière transparente...ça fonctionne à merveille! Merci encore...
Je vais un peu abuser de votre disponibilté en vous demandant de me donner un petit pousse sur une éventuelle recherche que je n'arrive pas à mettre au point!
Le problème est le suivant :
En fait le but est de faire une recherche soit par la méthode FIND de VBA pour Excel soit par une autre méthode qu evous me proposeriez p-e. Je voudrais après avoir saisi le mot clé, cliquer sur un bouton "Rechercher" et que mon programme aille chercher l'info sur une autre page excel...je problème c'est qu'une fois qu'il trouve  le mot clé il me la répéte au lieu d'aller trouver une autre occurence du mot clé (j'ai utilisé aussi .FindNext(Var) mais ça ne donne pas le résultat que j'attends!

7 réponses

mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
18 oct. 2006 à 02:57
Salut,

je t'ai fait une fonction, à placer dans un module :

Public Function FindWord(ByVal sWord As String, Optional wSheet As Variant =  "ActiveSheet", Optional rStartCell As Variant = "A1") As String()
    If Not wSheet = "ActiveSheet" Then Sheets(wSheet).Select
    Range(rStartCell).Select
    
        Dim cMyAddress  As New Collection
        Dim sRes()      As String

    Cells.Find(What:=sWord, After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
        xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
        , SearchFormat:=False).Activate: cMyAddress.Add ActiveCell.Address
        
    Do
        Cells.FindNext(After:=ActiveCell).Activate: cMyAddress.Add ActiveCell.Address
    Loop While ActiveCell.Address <> Range(rStartCell).Address
    
        ReDim sRes(cMyAddress.Count - 1)
    For i = 0 To cMyAddress.Count - 1
        sRes(i) = cMyAddress.Item(i + 1)
    Next i
    
    FindWord = sRes: Set cMyAddress = Nothing: Erase sRes
End Function

Sub Exemple_Utilisation()
' *** pour l'exemple, j'ai placé "abcdef" de A1 à A10 + dans qques cellules d'autres colonnes
    Dim sResult() As String, l As Integer
    
    sResult = FindWord("abc")
    For l = 0 To UBound(sResult)
        Debug.Print sResult(l)
    Next 
l
    Erase sResult
End Sub

<small>Coloration syntaxique automatique [mortalino] </small>
       

avant d'exécuter la procédure Exemple_Utilisation il faut que tu affiche la fen^tre d'exécution dans VB (Ctrl + G)

++

<hr width ="100%" size="2" />
  --Mortalino--
Le mystérieux chevalier, "Provençal, le Gaulois"
/DIV>
0
devloukili Messages postés 7 Date d'inscription dimanche 15 octobre 2006 Statut Membre Dernière intervention 20 novembre 2006
29 oct. 2006 à 17:17
Je te remercie...
je cours vite tester le code que tu m'as confié, ça m'a variment prie la tête j'espère que ça marchera sinon je te ferai part de mes remarque et merci d'avance pour ta précieuse aide
Khalid!

 
0
devloukili Messages postés 7 Date d'inscription dimanche 15 octobre 2006 Statut Membre Dernière intervention 20 novembre 2006
29 oct. 2006 à 21:36
Salut Mortalino!
Et oui, aussi vite parti aussi vite revenu!
pour aller droit au but, j'ai fait ce que tu m'avais dis concernant le code mais y a certains pb dont j'aimerais discuter avec toi si tu as un peu de temps! en réalité ce soint deux problèmes!
1-------
J'ai examiné ton code avec bcp d'attention mais je n'ai pu déceler la partie du code qui spécifie la recherche que dans la plage allant de "A1" à "A10" le fait si bien ton code!
j'aimerais avec ton code faire une recherche mais sur une plage que moi j'aurais le choix de choisir!

2------
Concerant la boucle Do...Loop et bien quand je lance la macro elle tourne sans arrêt...j'arrive à l'arrêter par Echap mais y a pas de résultat dans la page d'exécution Ctrl+G

je te remercie mais franchement tu m'ai d'une aide vraiment précieuse en ce momet car le temps me manque bcp trop...merci encore
0
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 à 22:21
Salut Khalid,

concernant cette fonction, elle ne recherche pas que dans la plage A1:A10 mais dans toute la feuille, à partir de celle que tu auras sélectionné (j'ai choisi pour l'exemple A1 mais ça aurait pu être B10).
Ensuite ça cherche dans les suivantes.
Je vais voir ce que je peux faire pour la recherche que dans la plage que tu détermines dans la fonction ;)


Pour ton 2, s'il n'y a rien c'est que le résultat cherché ne s'y trouves pas, j'avais testé avec abc et ça avait fonctionné. Maintenant c'est sûr, ça marche toujours mendant les tests et jamais quand on en a besoins, je vais refaire d'autres tests. (et je vais vérifier la boucle)


Sinon que recherches tu comme mots clés ? Et est ce que dans tes cellules les mot clés recherchés sont seuls ou accompagnés d'autres mots ? (pour mes tests)

@++





<hr width="100%" size="2" />

  --Mortalino--
Le mystérieux chevalier, "Provençal, le Gaulois"
/DIV>
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
devloukili Messages postés 7 Date d'inscription dimanche 15 octobre 2006 Statut Membre Dernière intervention 20 novembre 2006
29 oct. 2006 à 22:44
Salut Mortalino
pour la feuille où je fais mes recherches elle contient un tableau de 14 colonnes et de 200 lignes pour le moment...
ce sont des articles qui sont en tete de ligne et sur la meme ligne d'un article donné il a des info telles que la date d'entre le bureau de dotation ain si que la date de sortie et a qui ce produit a été remi
pour la recherche j'ai préparé un userforme sur lequel il y a un cbbox qui ajoute à sa liste tous les article..
en principe la méthode find devra avoir un argument" .find(what:=CbProduit,...",

si c amarche je pourrais ensuite elaborer une autre recherche qui cette fois ci ira faire une recherche dans d'autre sheets du meme classeur...car en fait mon classeur est un suivi quotidient des entrée et sortie de produit...donc, à chaque journée correspond une feuille...
je crois que je t'ai donné un plus d'info a propos de mon travail...si jamais tu trouve que c'est pas assez j'essaierai de te faire parvenir carrement le classeur sur une de tes adresses si tu trouves que ca t'aidera...
merci encore Mortalino
..à demain  
0
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>
0
devloukili Messages postés 7 Date d'inscription dimanche 15 octobre 2006 Statut Membre Dernière intervention 20 novembre 2006
30 oct. 2006 à 21:50
Salut Mortalino...c'est Khalid!
Je te remercie pour les efforts que tu fais pour m'aider...j'ai testé le code et apparemment ça fonctionne, il y avait une inattention dans mon propre code qui ne m'arrengeai guère les chose...: je mettais CbProduit.value au lieu de CbProduit.text ... enfin bref ton code en tt cas fonctionne mieux que le mien...je vais juste allez chez moi pour le personnalisé à mon application et on se retrouve pour discuter d'autre chose..."consernant tjrs ce fameux VBA lollll" allez a+ et merci encore...

si tout ce passe comme je le souhaite il ne me restera plus qu'a résoudre le problème d'impression...là encore je ne suis pas un as mais je fais bcp d'effort et surtout j'apprends bcp de gens comme toi

a+
0
Rejoignez-nous