[VBA] Macro semblabe à recherchev [Résolu/Fermé]

Signaler
Messages postés
8
Date d'inscription
mardi 20 décembre 2011
Statut
Membre
Dernière intervention
21 décembre 2011
-
Messages postés
8
Date d'inscription
mardi 20 décembre 2011
Statut
Membre
Dernière intervention
21 décembre 2011
-
Bonjour à tous,

Je viens vous demander de l'aide sur un projet sur lequel je travaille.

Contexte
Je travaille sur un fichier excel qui contient 2 feuilles. Les deux feuilles ont une colonne "Projet", le problème c'est que ces deux feuilles ont été crées par deux personnes absolument différente. En sommes un même projet sera présent sur la seconde feuille mais avec un nom différent comme par exemple:
Feuille 1: Paris Bercy
Feuille 2: Projet Paris Bercy
Etant donné que je dois récupérer des infos sur la seconde feuille pour les rentrer dans la première, j'ai naturellement pensé à une fonction RECHERCHEV qui n'est pas adapté puisqu'il n'est pas possible de chercher une chaine de caractère comprise à l'intérieur d'une cellule. Si je cherche "Paris Bercy" dans "Projet Paris Bercy" cela ne fonctionnera pas à cause du mot "Projet" qu'il y a avant "... Paris Bercy".

Mes avancées
Dans mes recherches de solution j'ai appris qu'il fallait certainement passer par une macro avec l'argument lookat associé à xlpart.
Etant novice en VBA et ayant de vaste souvenir lointain de programmation, je crois savoir qu'il me faudra passer par une boucle do while afin de parcourir l'ensemble de mon tableau.
En somme j'ai vraiment du mal à demarrer d'autant plus que je n'ai aucune idée des éléments à déclarer.

Ma question
Quelqu'un pourrait-il m'aider dans la rédaction de cette macro qui est typiquement une recherchev à la différence que la comparaison de l'élément de recherche se limite à une partie du contenu et non pas sa totalité.

PS: Mon fichier à près de 400 lignes, l'exemple que j'ai pris est un exemple bateau. L'idée d'harmoniser les noms de projets n'est pas envisageable car ont peu retrouver n'importe qu'elle chaine de caractère devant le nom du projet.

5 réponses

Messages postés
23809
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
21 janvier 2021
6 585
Bonjour,

par formule, pour ramener l'info de la colonne B :
=INDEX(Feuil2!$B$2:$B$10;EQUIV("*" & A2;Feuil2!$A$2:$A$10;0))

eric

edit : ou "*" & A2 & "*" si tu peux avoir des mots après...
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 63550 internautes nous ont dit merci ce mois-ci

Messages postés
8
Date d'inscription
mardi 20 décembre 2011
Statut
Membre
Dernière intervention
21 décembre 2011

Bonjour eriiic,

Merci pour ta réponse, mais la fonction EQUIV ce base sur un résultat exact, supérieur ou inférieur à une valeur.
Messages postés
16373
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
22 janvier 2021
3 115
hé oui, mais ça s'accroche à du VBA , peut- être pour frimer...

pour passer pour une cloche au boulot, rien de tel de passer par du VBA quand on peut le faire par formules...
et m^me s'il y a plusieurs réponses avec le nom demandé
Messages postés
23809
Date d'inscription
mardi 11 septembre 2007
Statut
Contributeur
Dernière intervention
21 janvier 2021
6 585
Salut michel ;-)
Messages postés
8
Date d'inscription
mardi 20 décembre 2011
Statut
Membre
Dernière intervention
21 décembre 2011

Effectivement ton fichier démontre clairement que cela fonctionne, je vais ré-esseyer pour l'instant j'ai une erreur.
Messages postés
8
Date d'inscription
mardi 20 décembre 2011
Statut
Membre
Dernière intervention
21 décembre 2011

Eriiic, milles excuses pour avoir remis en question ta formule qui marche du feu de dieu!

Merci pour la formule et le tips*: "*" qui permet d'ignorer ce qui précède ou suit la chaine de caractère.
Messages postés
8
Date d'inscription
mardi 20 décembre 2011
Statut
Membre
Dernière intervention
21 décembre 2011

Mich mich merci pour ton message posté à 13:41
Messages postés
116
Date d'inscription
dimanche 14 septembre 2008
Statut
Membre
Dernière intervention
30 août 2012
29
Bonjour Souray971

Tu mentionne macros dans ton sujet, je pense donc que tu cherche un code VBA :

j'ai eu le même problème que toi dans un de mes programmes et voici un vieux morceau de code qui devrait t'aider mais il y a quelques prérequis :

- admettons que ta donnée se trouve dans la colonne B (index numérique "2" donc)
- Tu dois éviter "Projet " soit ta recherche commence au 8ème caractère de la cellule
- Tu cherches "Paris Bercy" soit une chaine 11 de caractères non variable.

Sub Toto()
Dim a, b, i as Long

' Délimitation de la plage active
    a = Rows.Count
    a = Cells(a, 2).End(xlUp).Row 'N° dernière ligne

for i = 1 to a
    If Mid(Cells (i,2).Value,8,11) = "Paris Bercy" then ***
Next i
End Sub


Je peux t'adapter le code mais j'ai besoin de plus dé précisions (cellules à copier, où les copier...

Textuellement, après avoir défini "a" comme étant la dernière ligne utilisée (non vide) de la colonne B, pour les lignes de 1 à "a", la macro va chercher si o partir du 8ème caractère, les 11 caractères de la cellule cellule Bi sont bien"Paris Bercy"
Messages postés
8
Date d'inscription
mardi 20 décembre 2011
Statut
Membre
Dernière intervention
21 décembre 2011

Bonjour Phoenellion,

Tout d'abord je te remercie pour ton aide.

Effectivement je recherche une macro mais si une solution consistant à utiliser une fonction peux répondre à mon besoin, je serai preneur.

Je pense que tu as bien cerné ma problématique à une exception:
La chaîne de caractère qui est recherchée peut être à x caractères du début ou de la fin de la cellule ( et pas forcément à partir du 8ème caractère.
En regardant ton programme je me dis que l'on peu peut être remplacer le 8 par une variable que l'on incrémenterai. Je sais que je suis vague, mais j'ai arrêté la programmation depuis 3 ans du coup je n'ai que des souvenirs lointains.

Pour te donner plus de précision sur mon classeur
Colonne A - Feuille 1 B - Produit C- Fournisseur
Paris Bercy x
Paris 2eme y
Levallois z
Clichy u

Colonne A -Feuille 2 B- Fournisseur
Projet Paris Bercy Delta
Levallois phase 2 Apha
Parking UTC Omega
Clichy Ville Sigma
Urbanisation Paris 2eme Teta

L'idée est de récupérer automatiquement le nom du fournisseur qui est sur la feuille 2 pour le mettre directement dans la colonne C de la feuille 1
Messages postés
116
Date d'inscription
dimanche 14 septembre 2008
Statut
Membre
Dernière intervention
30 août 2012
29
d'accord, donc on cherche "Paris Bercy" à une position aléatoire dans dans une chaine de caractères.

Je modifie en conséquence et je reviens avec le code

@+
Phoe
Messages postés
116
Date d'inscription
dimanche 14 septembre 2008
Statut
Membre
Dernière intervention
30 août 2012
29
je n'arrive pas à supprimer mon précédent commentaire... à lire à la place :

d'accord, donc on cherche une chaine de caractère variable à une position aléatoire dans dans une chaine de caractères.

CA me paraissait un peu facile aussi, mais ce sera plus marrant comme ça

l'idée de faire varier le caractère de départ n'est pas mauvaise. il doit y avoir un moyen plus simple mais honnêtement, je ne le connais pas donc on va contourner et faire avec ce qu'on a.

pour ce qui est de la chaine de caractère variable, on a 2 solutions
- soit on te fait une box où tu tapes le nom voulu, on peut même faire un userform (fenêtre) à choix multiples pour éviter la saisie qui te ferai perdre du temps
- soit on se base sur le contenu d'une cellule qui contient l'information clef

je code déjà la recherche par positions successives dans la cellule cible.

@+
Phoe
Messages postés
8
Date d'inscription
mardi 20 décembre 2011
Statut
Membre
Dernière intervention
21 décembre 2011

Merci pour ta contribution et ton investissement Phoenellion, la solution de eriic marche très bien.
Messages postés
116
Date d'inscription
dimanche 14 septembre 2008
Statut
Membre
Dernière intervention
30 août 2012
29
Voilà le code :

Sub Toto()  
Dim a, b, i, j As Long  
Dim Fournisseur As String  

' Délimitation de la plage active  
    a = Rows.Count  
    a = Cells(a, 2).End(xlUp).Row 'N° dernière ligne  

For i = 1 To a  
    For j = 1 To Len(Cells(i, 2))  
        If Mid(Cells(i, 2).Value, j, Len(Fournisseur)) = Fournisseur Then  
    Next j  
Next i  
End Sub


Il ne reste plus qu'à choisir comme acquérir "Fournisseur" et quoi faire une fois qu'on l'a trouvé.

Si tu veux tu peux mettre ton fichier à télécharger pour que je code la macro directement depuis celui ci, j'irai plus vite

https://www.cjoint.com/

@+
Phoe
Messages postés
116
Date d'inscription
dimanche 14 septembre 2008
Statut
Membre
Dernière intervention
30 août 2012
29
en fait il y a plus simple :

la fonction InStr() cherche dans une chaine de caractère la présence d'une autre chaine de caractère, peu importe où, on a donc :

Sub Toto()  
Dim a, b, i, j As Long  
Dim Fournisseur As String  

' Délimitation de la plage active  
    a = Rows.Count  
    a = Cells(a, 2).End(xlUp).Row 'N° dernière ligne  

For i = 1 To a  
    For j = 1 To Len(Cells(i, 2))  
        If InStr(1, Cells(i, 2), Fournisseur, 1) > 0 Then  
    Next j  
Next i  
End Sub


Il ne te reste plus qu'à m dire :
- comment définir la valeur de notre variable Fournisseur
- que faire une fois qu'on a une correspondance

Par contre, je verrai ça demain car là je vais me coucher (minuit passé chez moi)

@+
Phoe