Adaptation d'une foncttion "recherche(V)"

Résolu
haloexcel - 17 mars 2013 à 16:12
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 - 24 mars 2013 à 20:26
Bonjour à tous
Je souhaite adapter une fonction de recherche d'occurence sous VBA.
La fonction ci-dessous
Donne toutes les occurences correspondant à une valeur cherchée

je l'ai chopé ici:
Tapez le texte de l'url ici.

Function RechTous(v, champRech As Range, ChampRetour As Range, separateur)
  a = champRech
  temp = ""
  For i = 1 To champRech.Count
    If a(i, 1) = v Then
        temp = temp & ChampRetour(i) & separateur
    End If
  Next i
  RechTous = Left(temp, Len(temp) - 1)
End Function 


Question:1°) est ce l'équivalent de recherchev()sous excel 2003?
2°)Si oui à la question 1°), comment faire pour que la reconnaissance de texte ne prenne pas en compte tous le "texte", V mais seulement une partie de "V" car dans la colonne Champretour on a pas forcément des appellations identiques mais il ya des lettres communes , en gros je sohaites pouvoir définir moi même les caractères a rechercher et leur occurences dans le champ retour ?

Merci de votre attention

7 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
17 mars 2013 à 18:16
Voilà !
Bon.
Il te faut alors utiliser la méthode Find (Range.Find dans ton aide VBA).
Ouvre cette rubrique, lis-la. Lis plus particulièrement cette ligne :
Regarder Facultatif Variante Il peut s'agir de l'une des constantes XlLookAt suivantes : xlWhole ou xlPart.

Cette méthode te permet d'atteindre le but que tu as défini (avec xlPart)

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
3
Bonjour ucfoutu!
J'ai fais quelques recherches sur la Méhode Find et plus particulièrement avec la constante (Xlpart) :
Détermine si la recherche correspond à des cellules entières ou partielles.


Ci dessous une fonction de ce site ci:
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

Es ce que je peux directement la placer dans un modeul e l'excuer ? ou l'appeller depuis une sub() ?
3
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
19 mars 2013 à 10:37
Bonjour,
Je ne sais pas où tu a trouvé ce code, mais il me semble d'emblée assez tortueux et n'a pas été écrit pour atteindre exactement le même but que le tien.
Et en tout état de cause : n'est en aucun cas l'équivalent de la formule que tu as montrée plus haut :
RECHERCHEV(code;table;ColonneRésultat;Vrai ou faux)

J'aimerais vraiment que tu cesses de "chercher des codes" (pas forcément adaptés à ton but, en plus) et que tu TE mettes à tenter d'écrire le TIEN.
________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
3
SALUT "UCFOUTU"! et tout les autres utilisateurs de ce forum!
J'ai fais des recherches comme tu me l'as demandé sur la méthode .find et je l'ai "saisi".
Voici un code que j'ai testé et qui marche:
Sub recherche()
Dim ValeurCherche As String
Dim Plage As Range
ValeurCherche = InputBox("Entrez une valeur")
If Trim(ValeurCherche) <> "" Then
    With Sheets("Feuil1").Range("A:A") 'Recherche dans colonne A
        Set Plage = .Find(What:=ValeurCherche, _
                        After:=.Cells(.Cells.Count), _
                        LookIn:=xlValues, _
                        LookAt:=xlPart, _
                        SearchOrder:=xlByRows, _
                        SearchDirection:=xlNext, _
                        MatchCase:= False)
        If Not Plage Is Nothing Then
            Application.Goto Plage, True 'valeur trouvé
        Else
            MsgBox "Recheche nulle" 'value non trouvé
        End If
    End With
End If
End Sub


Maintenant Je souhaites que la macro ouvre un classeur précis et fasse une recherche sur un onglet bien précis et "renvoie" ou "recherche" la valeur maximum d'une ligne (dans l'optique de faire un calcul)

Question :Est ce que tu peux me donner un repère sur la syntaxe que je dois utiliser pour ouvrir un classeur et définir ma plage?

je crois savoir qu'il y a la syntaxe
Workbooks.Open Filename: = 
mais le fichier peut être déplacé.

Merçi
3

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

Posez votre question
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
24 mars 2013 à 20:26
Ma réponse est définitivement non.
Pourquoi ?
Parce-que la difficulté objet de l'ouverture de cette discussion a été résolue et que l'ouverture d'un classeur autre est une autre difficulté et doit donc faire l'objet d'une autre discussion.
Si tu veux de la considération et de l'aide : libère ce sujet (tag "réponse acceptée") et ouvre une autre discussion, limitée à la seule ouverture d'un autre classeur.
Je serai toujours strict sur l'observation indispensable de cette discipline.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
3
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
17 mars 2013 à 17:07
Bonjour,
Je ne veux même pas ouvrir le lien sur lequel tu as "chopé" quelque-chose.
Et te fais remarquer que mettre ici un lien de cette nature-là pour exposer un problème peut à tout moment rendre une discussion totalement incompréhensible pour de futurs visiteurs (un lien étant sujet à disparition pour différentes raisons possibles)
Je t'invite donc à exposer ici techniquement et avec précision les tenants et aboutissants de ton problème.
Je ne verrai qu'après cet effort.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" facilitera les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement répéter son contenu. Je n'interviendrai que si nécessité de la compléter.
0
Bonjour ucfoutu,
je tiens compte de tes remarques. En fait je souhaites programmer une fonction recherchev()en VBA sous excel 2003.

La fonction Recherchev() recherche une valeur dans la première colonne d'une table et retourne la colonne_résultat spécifiée
La syntaxe est: RECHERCHEV(code;table;ColonneRésultat;Vrai ou faux)

Le souci est que le code doit strictement être le même dans la table pour qu'un résultat soit renvoyé par la fonction recherchev(). Je souhaites donc m'affranchir de cette contrainte et trouver "toutes" les occurences associées à un bout "code", en programmant recherchev().

Je pense que la syntaxe est
WorksheetFunction.VLookup()
mais je n'arrive pas à programmer les conditions spécifiées plus haut

Cdlt,
0
Rejoignez-nous