Recherche de données

Recherche de données - VB/VBA/VBS - Programmation

Marsh Posté le 23-03-2016 à 12:18:01    

Bonjour,
 
J'ai un petit problème avec excel que je n'arrive pas à résoudre. Peut-être serait il plus facile de fonctionner avec VBA ?
 
Je cherche à étendre la fonction "cherche" à une plage.
 
En gros j'ai des mots clés noyés dans des cellules....
 
Je pars d'un cas simple :
 
Colonne 1 :
 
Patrick le gros chien
 
La maison de Jerome
 
La tante Isabelle
 
Colonne 2 :
 
Isabelle
 
Patrick
 
Jerome.
 
J'aimerais savoir pour chaque ligne de la colonne 1 s'il y a une correspondance avec la colonne 2.
 
Si je fais cherche(Patrick le gros chien; Patrick) ça fonctionnera oui, mais j'aimerais au lieu de mettre Patrick le faire rechercher dans l'ensemble de la deuxième colonne.
 
Il me faut automatiser un minimum parce que mes deux colonnes font plusieurs milliers de lignes chacune....
 
Aidez moi svp :)
 
Merci beaucoup  [:markof:1]

Reply

Marsh Posté le 23-03-2016 à 12:18:01   

Reply

Marsh Posté le 23-03-2016 à 13:03:26    

Salut,
 
Déjà, je pense qu'il y a confusion entre colonne 1, colonne 2 et ton exemple.
 
Si tu fais cherche(Patrick le gros chien; Patrick), ça ne fonctionnera pas !
La syntaxe est CHERCHE(ce_que_je_cherche; où_je_cherche), c'est donc plutôt (aucun rapport avec le chien ;) ) CHERCHE(Patrick; Patrick le gros chien) qui fonctionnera.
 
Sinon, oui en effet, ce sera sans doute plus simple en VBA (voir ci-dessous).
Attention, j'utilise ici INSTR qui se comporte à l'inverse de CHERCHE : Instr(1, où_je_cherche, ce_que_je_cherche)
Dans mon exemple, pour chaque ligne trouvée de la colonne 2, tu auras en colonne 3 dans quelle ligne de la colonne 1 se situe le résultat.
 

Code :
  1. For Each cellule_source In Range("B:B" )
  2.     If cellule_source.Value = "" Then Exit For
  3.     For Each cellule_cible In Range("A:A" )
  4.         If cellule_cible.Value = "" Then Exit For
  5.         If InStr(1, cellule_cible.Value, cellule_source.Value) > 0 Then
  6.             Cells(cellule_source.Row, 3).Value = "Trouvé en ligne " & Str(cellule_cible.Row)
  7.         End If
  8.     Next
  9. Next


Message édité par Chelmi18 le 23-03-2016 à 13:04:11
Reply

Marsh Posté le 23-03-2016 à 13:27:59    

Merci beaucoup pour ton aide  :jap:  :jap:  :jap:  :jap:  :jap:  :jap:  
 
C'est pas possible d'avoir la valeur correspondante de la colonne 2, directement alignée sur la colonne 1 ?  :??:

Reply

Marsh Posté le 23-03-2016 à 14:37:10    

J'ai fait tourner et j'ai un autre petit problème... Parfois il y a plusieurs résultats possibles dans la colonne 1, comment gérer ça ??

Reply

Marsh Posté le 23-03-2016 à 15:41:28    

                         Jamila Patrick Markov
Patrick Le gros Chien    
Jamila La Sorcière    
Le Dupe Marius    
Mathieu Le Méchant    
Markov le Riche    
 
J'ai une solution avec les mises en forme conditionnelles si tu disposes des données sous forme de tableau avec en ligne les donnees de la colonne 1 et en colonne les donnees  de la colonne 2.  
 
Avec cette disposition tu peux retrouver les correspondances à travers les couleur ou si tu préfères, on mettra une formule pour que tu aies les valeurs. Réponds si tu es là e on va passer a la pratique directement.

Reply

Marsh Posté le 23-03-2016 à 19:27:50    

 
            Bonjour,
 
            voir aussi du côté de la fonction EQUIV comme documentée dans l'aide d'Excel …
 

Reply

Marsh Posté le 24-03-2016 à 17:06:25    

Marc L a écrit :

 
            Bonjour,
 
            voir aussi du côté de la fonction EQUIV comme documentée dans l'aide d'Excel …
 


 
Bonsoir Marc L, EQUIV est généralement utiliser comme RECHERCHEV ou RECHERCHEH. Lorsque la valeur cherchée n'est pas le contenu d'une cellule, mais plutot une portion du contenu, le résultat est une erreur.
 
Je présente ma solution avec les mises en forme conditionnelles qui me semblent mieux adaptées (une question de goût  :) ; j'aime les couleurs. Sinon j'ai d'otr solution)
Considérons cette éléments (pour se rapprocher de l'énoncé du problème):
 
Colonne 1 :
 
Patrick Le gros Chien    
Jamila La Sorcière    
Le Dupe Marius    
Mathieu Le Méchant    
Markov le Riche  
 
Colonne 2 :
 
Jamila
Patrick
Markov
 
L'objectif est de voir quel (s) élément (s) de la colonne 2 se trouve(nt) dans chaque ligne de colonne  (Par exple :  trouve-t-on "Patrick" dans "Patrick Le gros Chien"? , dans "Mathieu Le Méchant " ? etc.)
 
Pour cela, je vais choisir une disposition de mes données.  
Pour ceux qui veulent bien me suivre, placez les données de la colonne 1 dans une feuille à partir de la cellule A2.
On aura donc dans A2: Patrick Le gros Chien; A3:Jamila La Sorcière; etc.
 
Les données de la colonne 2 seront placées en colonne à partir de la cellule B1
On aura donc dans B1: Jamila; dans C1:Patrick; etc.
 
L'intersection donc des lignes et les colonnes renseignées est la plage B2:D6 (si vous avez renseigné toutes les données que j'ai mis en haut  :) ).
 
C'est maintenant qu'il faut bien suivre  :p   :
1: Selectionnez la plage  "B2:D6"
2: Dans le menu "Accueil" (Excel 2013  :sol:  ), vous avez des regroupements d'outils( presse-papiers, police, Alignement, Nombre, STYLE,etc.). Au niveau de STYLE, vous verrez "Mise en forme conditionnelle" ). Cliquez sur la petite flèche de "Mise en forme conditionnelle"
 
3: Choisissez "Nouvelle règle", puis au niveau de la rubrique "Sélctionnez un type de règle", cliquez sur "Utiliser une formule pour déterminer pour quelles cellules le format sera appliqué"
4: Cliquez ensuite sur "Format" (au bas de la boite de dialogue), puis sur l'onglet "Remplissage" pour choisir une couleur "visible" (le vert pour moi); faites Ok.
5: Vous devriez être de retour sur la page ou il y a "Format". Dans la partie "Modifier la description de la règle", tapez cette formule telle que je vous la donne. Si vous ne la comprenez pas, vous le direz plus tard pour que j'explique. J'ai déja été assez long. Les paresseux sont déjà partis. Voici la formule (écrivez tout ce ki vient après les deux points) : =sierreur(cherche(B$1;$A2);"" )<>""
 
6:Puis faites Ok. Là où vous verrez les couleurs, vous comprendrez que: L'élément en colonne se trouve dans la ligne correspondante à la cellule coloriée.
 
Essayez et faites vos commentaires :jap:  
 
 
 

Reply

Marsh Posté le 24-03-2016 à 17:52:48    

 
            J'ai évoqué la fonction EQUIV d'Excel à utiliser côté VBA (Match) pour peu de connaître un tant soit peu Excel et le VBA !
 
            Cette fonction renvoie soit le numéro de la première occurrence trouvée soit un code d'erreur non bloquant (si bien codé)
            et est vérifiable par la fonction IsNumeric comme par la fonction IsError
 
            S'il y a de multiples occurrences, voir l'aide VBA de la méthode Find et son exemple (FindNext) …
 
            Tout dépend en fait du besoin précis mais partiellement exposé dans le post initial !
 

Reply

Marsh Posté le 24-03-2016 à 17:57:21    

 
            Je n'aime pas trop la mise en forme conditionnelle pour une plage variable ou dynamique …
 
            Par expérience, les mises en formes conditionnelles pour des milliers de lignes font grossir énormément la taille du classeur
            et peuvent ralentir drastiquement ses performances !
 
            Les goûts, les couleurs, …

Message cité 1 fois
Message édité par Marc L le 24-03-2016 à 17:57:35
Reply

Marsh Posté le 24-03-2016 à 18:08:37    

Marc L a écrit :

 
            Je n'aime pas trop la mise en forme conditionnelle pour une plage variable ou dynamique …
 
            Par expérience, les mises en formes conditionnelles pour des milliers de lignes font grossir énormément la taille du classeur
            et peuvent ralentir drastiquement ses performances !
 
            Les goûts, les couleurs, …


 
Dans ce cas, il fau just copier cette formule dans la cellule B2 selon la disposition que j'ai proposé : =sierreur(cherche(B$1;$A2);"" )
Puis, tu tires vers la droite, et ensuite vers le bas. tu auras le resultat (des chiffres !!  :) )

Reply

Marsh Posté le 24-03-2016 à 18:08:37   

Reply

Marsh Posté le 24-03-2016 à 18:16:02    

 
            Certes, tout comme en utilisant EQUIV ‼  :sol:  
 
            Bref, en attendant de connaitre clairement et exhaustivement le besoin surtout côté présentation des résultats …
 

Reply

Marsh Posté le 24-03-2016 à 18:35:33    

Marc L a écrit :

 
            Certes, tout comme en utilisant EQUIV ‼  :sol:  
 
            Bref, en attendant de connaitre clairement et exhaustivement le besoin surtout côté présentation des résultats …
 


 
  :??:  Pourrais-tu stp indiquer comment on arrive o resultat avec EQUIV. Tu pourras utiliser le petit tableau de données que j'ai utilisé pour mon exemple.  
Merci.

Reply

Marsh Posté le 24-03-2016 à 19:10:27    

 
            Là c'est vraiment le B-A-BA d'Excel, rien qu'en consultant son aide !
 
            Formule de la cellule C2 :   =EQUIV("*"&$B2&"*";$A$1:$A$6;0)
 
            Puis la recopier vers le bas.
            Si correspondance, renvoie le numéro de la ligne sinon #N/A …
 
            Et pour un exemple en VBA, voir le topic voisin "Recherche valeur dans classeur" !


Message édité par Marc L le 24-03-2016 à 19:22:30
Reply

Marsh Posté le 25-03-2016 à 09:10:48    


Merci pour l'astuce avec les étoiles. Mais, ça ne donne pas un résultat compréhensible tout de suite.
je m'explique.
 
Avec cette disposition que j'ai adoptée ("Jamila" étant dans la cellule B1, j'ai dû modifié ta formule de cette façon pour que xa marche =EQUIV("*"&B$1&"*";$A$2:$A$6;0); je ne me trompe pas j'espère )
 
                                 Jamila Patrick Markov  
Patrick Le gros Chien    
Jamila La Sorcière    
Le Dupe Marius    
Mathieu Le Méchant    
Markov le Riche    
 
Lorsque j'applique cette formule à l'ensemble de la plage, j'obtiens respectivement [dans les colonnes de "Jamila", de "Patrick", et de "Markov"] 2, 1 et 5.
 
                               Jamila  Patrick   Markov
Patrick Le gros Chien        2     1           5
Jamila La Sorcière            2     1           5
Le Dupe Marius                2     1           5
Mathieu Le Méchant         2     1           5
Markov le Riche               2     1           5
 
Après, c'est vrai que je comprends que Jamila se trouve à la 2ème cellule de la plage $A$2:$A$6.
Mais quand on a 1000 cellule dans une plage, c'est pas évident de faire ce comptage pour savoir ce que signifie le 2.

Reply

Marsh Posté le 25-03-2016 à 11:22:54    

 
            Pourquoi changer les données du problème ?! La demande initiale est en colonne ‼
                                      Même dans ta propre explication avec les MFC c'est en colonne !
            En fait tu t'es planté en écrivant colonne au lieu de ligne ce qui prête à confusion ! :sarcastic:
 
            Bref, dans la colonne B il y a les prénoms recherchés et
            on ne modifie pas la plage de la formule pour renvoyer le bon numéro de ligne !
            (sinon la modifier en ajoutant 1 …)
 
           http://perso.numericable.fr/mpl/pic/RechercheEQUIV.jpg

Message cité 1 fois
Message édité par Marc L le 25-03-2016 à 11:45:43
Reply

Marsh Posté le 25-03-2016 à 12:31:49    

Marc L a écrit :

 
            Pourquoi changer les données du problème ?! La demande initiale est en colonne ‼
                                      Même dans ta propre explication avec les MFC c'est en colonne !
            En fait tu t'es planté en écrivant colonne au lieu de ligne ce qui prête à confusion ! :sarcastic:
 
            Bref, dans la colonne B il y a les prénoms recherchés et
            on ne modifie pas la plage de la formule pour renvoyer le bon numéro de ligne !
            (sinon la modifier en ajoutant 1 …)
 
           http://perso.numericable.fr/mpl/pic/RechercheEQUIV.jpg


 
J'ai juste changé la position pour repondre à l'exemple que j'ai exposé. Mais voici ce que je dis, et je pense que le résultat est plus clair (pour cette courte formule):
https://onedrive.live.com/?id=5C316 [...] 8A2D611078
 
Tu verras le résultat avec la formule et celui avec la mise en forme conditionnelle.
Avec ta formule, on peut toujours ajouter des conditions (fonctions Sierreur et Indirect) pour avoir également un résultat satisfaisant. Merci pour l'astuce avec * dans ta formule.
 

Reply

Marsh Posté le 25-03-2016 à 12:50:01    

 
            Ce n'est pas une astuce car il s'agit juste de l'utilisation de caractères génériques
            comme du reste expliqué dans l'aide d'Excel de la fonction CHERCHE par exemple !
 
            En attendant l'avis de l'initiateur de ce topic, le résultat me satisfait comme cela ! (Ok pour SIERREUR à partir de la version 2007 …)
 

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed