XL 2016 VBA Utilisation de la fonction Find

Remteyss

XLDnaute Junior
Bonjour le forum,

J'ai créé un poste il y a de ça quelques jours mais je ne suis toujours pas parvenu à résoudre mon problème.
J'ai créé un script permettant de repéré dans un fichier A les objets qui m'intéressent et j'enregistre à chaque itération le nom de cet objet dans une variable :
objet = fichierA.Worksheets(3).Cells(k, l).Value 'nom de mon objet

Je dois ensuite trouvé cet objet dans un fichier B pour copier la ligne correspondante (copie uniquement des colonnes identiques) vers un fichier de destination C
Voici une partie de mon code :

Set celluletrouvee = fichierB.Worksheets(3).Range("H3:H370").Find(objet, LookIn:=xlValues)
..................
Else
lig = celluletrouvee.Row 'ligne du monitor dans le projet BMW_Magna
col = celluletrouvee.Column 'colonne du monitor dans le projet BMW_Magna

MsgBox "Cellule trouvée, correspondant à " & objet & " dans fichier A

For i = 1 To DernCol
colonne = fichierC.Worksheets(3).Cells(2, i).Value 'nom de la colonne i dans le fichier C

Set colonnetrouvee = fichierB.Worksheets(3).Range("2:2").Find(colonne, LookIn:=xlValues) 'recherche de la colonne i dans le fichier B

If Not colonnetrouvee Is Nothing Then

ligtr = colonnetrouvee.Row
coltr = colonnetrouvee.Column

fichierB.Worksheets(3).Cells(lig, coltr).Copy _
Destination:=fichierC.Worksheets(3).Cells(A, i) 'A représentant la première ligne vide du fichier C

Mon code fonctionne à peu près comme je le veux. Le seul bémol est que j'ai par exemple un objet dans le fichier A qui s'appelle "AZ".
Il est bien présent dans le fichier B mais n'est jamais repéré car un autre nom d'objet du type "monobjet_AZ" est repéré à la place puisqu'il contient "AZ".
J'ai donc pensé à utiliser LookAt:=xlWhole dans l'argument de ma fonction Find mais cela m'empêche de trouver d'autres objets qui ont cette particularité :
- Dans mon fichier A ils sont du type "monobjet123 avec un commentaire derrière"
- Alors que dans le fichier B ils s’appellent par exemple "monobjet123"

Donc voila, je voudrais savoir si l'un de vous aurait une idée intéressante pour corriger ces deux problèmes... J'ai pensé par exemple à ce que ma fonction find fasse en sorte que ma valeur objet soit contenue dans la cellule et qu'en plus de cela les deux premiers caractères soient strictement identiques... mais je ne vois pas comment écrire cela...

En vous remerciant par avance de votre aide !
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Re,

Dans le fichier joint, j'ai codé une fonction personnalisée qui extrait le nom de l'objet (c'est un début).
J'ai cependant un PB pour la cellule A4 dont la fin de l'objet ( _AZ) n'est pas séparé du commentaire.

Y aurait il une règle qui puisse détecter ce cas (exemple: un nom se termine par un souligné suivi de deux lettres majuscules - ce qui n'est pas le cas puisque AZ est un nom à lui tout seul) ?

Évitez les cellules fusionnées dans les bases de données ou tableau de données; ça ne peut que compliquer les choses...
 

Pièces jointes

  • Remteyss- nom objet- v1.xlsm
    17.1 KB · Affichages: 14
Dernière édition:

Remteyss

XLDnaute Junior
Re,

Dans le fichier joint, j'ai codé une fonction personnalisée qui extrait le nom de l'objet (c'est un début).
J'ai cependant un PB pour la cellule A4 dont la fin de l'objet ( _AZ) n'est pas séparé du commentaire.

Y aurait il une règle qui puisse détecter ce cas (exemple: un nom se termine par un souligné suivi de deux lettres majuscules - ce qui n'est pas le cas puisque AZ est un nom à lui tout seul) ?

Évitez les cellules fusionnées dans les bases de données ou tableau de données; ça ne peut que compliquer les choses...


Bonjour,

Je te remercie pour ton retour @mapomme.
Malheureusement il s'agit justement de mon problème, AZ représente bien un nom à lui tout seul et est en même temps présent dans d'autres noms.
J'ai finalement pensé à rajouter une boucle if dans mon programme ; si le nom de l'objet possède 2 caractères, j'utilise l'argument LookAt:=xlWhole dans ma fonction Find. Si ce n'est pas le cas j'utilise l'argument LookAt:=xlPart.
Je vais donc essayer cela.

Une autre option serait de modifier le cahier des charges, de sorte que AZ deviennet AZ_ par exemple...
 

Remteyss

XLDnaute Junior
Bonjour,

Mon souci n'est pas résolu mais voici l'alternative que j'utilise pour le moment :
- J'ai ajouté un warning à mon userform de sorte que tous les commentaires après un nom d'objet dans mon fichier B soient supprimés. Par exemple "M_objet_V_48_1_AZ avec signal crypté" devra être corrigé par l'utilisateur en "M_objet_V_48_1_AZ" avant l'exécution de la macro.

- Pour trouver strictement le nom AZ, j'ai ajouté une boucle If : si le caractère possède deux caractères alors on fait une recherche avec LookAt:=xlWhole. Sinon, on utilise LookAt:=xlPart.

Pour l'instant, n'ayant pas rencontré d'autres "cas particuliers", cela convient mais pourrait ne plus convenir selon les objets qui seront rencontrés.

Encore merci pour votre aide et si jamais quelqu'un a une autre idée je suis toujours preneur !
Bonne semaine

Remteyss
 

Discussions similaires

Réponses
12
Affichages
524

Membres actuellement en ligne

Statistiques des forums

Discussions
312 206
Messages
2 086 207
Membres
103 157
dernier inscrit
youma