Problème de recherche ("Find")
Bonjour à tous,
Voilà je bloque sur une recherche, le code est juste en dessous.
Pour faire simple je n'ai pas mis de fichier en pièce jointe pour garder l'anonymat des personnes concernées.
- ce que j'ai :
un tableau avec le nom et identifiant des personnels nommé "Administratif"
une feuille Excel dans laquelle je retrouve tous les noms de fichier (photo) ce trouvant dans le dossier "PHOTOS STAGIAIRES"
- mon soucis :
lorsque la recherche concerne le nom du personnel parfois il est trouvé et cela fonctionne. Parfois le nom n'est pas trouvé alors qu'il est identique.
J'ai vérifier ce n'est pas un problème de Majuscule ou Minuscule car pour certaine cela fonctionne.
et pour mettre un peu de difficulté j'ai remarqué un point commun le nom du fichier est uniquement le nom de la personne, lorsque je rajoute un caractère sur le nom du fichier ça fonctionne.
Ça aurait été simple si je m'arrêtai là mais certain fichier on eux aussi uniquement le nom du personnel en tant que nom et le code fonctionne immédiatement donc je ne comprend pas d'où vient le problème...
Il s'agit d'un code que j'utilise régulièrement donc modifier le nom des photos qui ne marche pas n'est pas la solution que je cherche bien entendu.
J’espère que quelqu'un pourra m'aider.
Merci à vous
For m = 5 To derlig ' Boucle sur chaque ligne du tableau
nom = Sheets("Administratif").Cells(m, 3).Value 'identifie le nom
identifiant= Sheets("Administratif").Cells(m, 3).Offset(0, 2).Value ' identifie le matricule
With Sheets(1).Range("A:A")
Set x = .Find(what:=identifiant, lookat:=xlPart) 'cherche valeur dans la liste des nom de fichiers
If x Is Nothing Then
Set x = .Find(what:=nom, lookat:=xlPart) 'si pas de matricule recherche nom
If x Is Nothing Then
c = c + 1 'identifie le nb de photo non trouvé
End If
nomfic = x.Value
Else
nomfic = x.Value
End If
fichimg = ActiveWorkbook.Path & "\PHOTOS STAGIAIRES\" & nomfic 'L'image est dans le même dossier que le classeur
End With
Bonjour,
tu as cacafouillé avec nomfic = x.value
le premier est mal placé
après c=c+1 --> else et nomfic = x.value
@+JP
Salut,
Merci effectivement petit cafouillage réglé.
Le problème ne vient pas de là mais merci quand même.
re,
est ce que FSO et filesexist te pause un problème ?
@+JP
Bonjour,
voila un exemple que j'utilise
Public Sub DataActeurPhotoDossier(ByVal objForm As Object)
FormDataWebActeur_IsChangeInProgress = True
Dim FSO As Variant
Dim PathSource As String
Dim Nom As String
Dim ImageName As String
Dim ImgNumList As Integer
'-------------------
On Error GoTo GestionErreur
'------------------- variable perso utilisée dans d'autres routines
'pour bloquer les object interactif...option, check...
'FormDataWebActeur_IsChangeInProgress = True
'-------------------
'charge les affiches qui correspondent au Nom de ObjForm.TxbNomList.Text
'à partir de Dossier : PathSource = DriveValide & PathAffiche
PathSource = DriveValide & PathActeurPhoto
Nom = objForm.Caption
ImageName = Nom & ".jpg"
Set FSO = CreateObject("Scripting.FileSystemObject")
'si image existe charge image
If FSO.FileExists(PathSource & ImageName) Then
objForm.ImgD.Picture = LoadPicture(PathSource & ImageName)
objForm.TxbSizeD.Value = Int(objForm.ImgD.Picture.Width / 26.45) & " x " & Int(objForm.ImgD.Picture.Height / 26.45)
objForm.Repaint
End If
Set FSO = Nothing
FormDataWebActeur_IsChangeInProgress = False
Exit Sub
GestionErreur:
MsgBox Err
Resume Next
End Sub
@+JP
OULA!!!!
Je suis pas expert, je vais regarder ça dans la soirée et je te tiens au courant d'ici demain.
Merci encore
Bonjour,
'L'image est dans le même dossier que le classeur
fichimg = ActiveWorkbook.Path & "\PHOTOS STAGIAIRES\" & nomfic
en voulant t'expliquer mon code , je m'aperçois de quelque chose ...
nomfic ... c'est quoi comme image ?
il te manque ".jpg" qui n'est pas pareil que ".jpeg"
essais en corrigeant çà ...
@+JP
Bonjour,
donc , pour l'explication
dans le cas ou nomfic n'est pas vide
If nomfic <> "" Then ... End If
le chemin du dossier photo
PathSource = ActiveWorkbook.Path & "\PHOTOS STAGIAIRES\"
le nom de la photo (jpg,png,bmp,...)
ImageName = nomfic & ".jpg"
on crée un objet système de fichier
Set FSO = CreateObject("Scripting.FileSystemObject")
dans le cas ou l'image / photo existe
If FSO.FileExists(PathSource & ImageName) Then ... End If
on charge l'image dans le contrôle image ImgD
objForm.ImgD.Picture = LoadPicture(PathSource & ImageName)
si l'image ne s'affiche pas correctement , on peut redessiner le form (pas obligatoire)
objForm.Repaint
quand on a fini ,
Set FSO = Nothing
objForm est un objet , "un double" du form
ICI , il est passé en paramètre avec l'option ByVal qui représente "une copie" à l'inverse de ByRef qui représente l'original
quand tu charges ton form qui s’appelle par exemple "USF" tu peux ,
après avoir déclaré en "Public" l'objet : Public objForm as Object ,
"remplir" l'objet avec ton form "USF" : Set objForm = USF
maintenant , n'importe où dans ton fichier tu peut utiliser
objForm.Contrôls("Textbox" & 1).value
pour la valeur de la textbox 1
@+JP
merci c'est un peu plus clair que le code brute car je ne suis que débutant
mais l'explication est parfaite.
Mais malheureusement ce n'est pas la solution, je vais essayer d'être plus clair désolé :
Importer les image et les mettre dans mon fichier excel pas de soucis (voir mon code en dessous, je ne pense pas qu'il y ai un soucis
dans un autre code j'obtiens tous les noms des fichiers image que je copie dans une feuille excel
(je peux envoyer mon fichier alléger mais il y a le nom des personnes donc ca sera uniquement en MP si cela peux t'aider.)
Mon soucis est que ma recherche ne retrouve pas le nom cherché dans la liste excel (pour certain fichier ça fonctionne et pour d'autres ca ne marche pas) donc ce n'est pas un problème de type de fichier ou d'importation mais uniquement de recherche dans une liste de nom.
Comme je ne sais pas d'où vient le problème je ne peux pas faire une exemple avec d'autre nom que ceux que j'utilise car il doit y avoir un truc en particulier, donc la création d'un fichier exemple me semble inutile.
J’espère avoir été plus clair, et merci de prendre du temps pour me répondre.
Sub Attrib_photo()
Dim m As Long, x As Variant, c As Integer
Dim derlig As Long, réponse As Variant
Dim Tbl() As String, nom As String, matricule As Long, nomfic As String, fichimg As String
'------------------------------------Attribution_photos--------------------------------------------
Application.ScreenUpdating = False
derlig = Sheets("Administratif").Range("C" & Rows.Count).End(xlUp).Row ' identifie le numero de la dernière ligne rempli
c = 0
For m = 5 To derlig ' Boucle sur chaque ligne du tableau
nom = Sheets("Administratif").Cells(m, 3).Value 'identifie le nom
identifiants= Sheets("Administratif").Cells(m, 3).Offset(0, 2).Value ' identifie le matricule
With Sheets(1).Range("A:A")
Set x = .Find(what:=identifiants, Lookat:=xlPart) 'cherche valeur dans la liste des nom de fichiers
If x Is Nothing Then
Set x = .Find(what:=nom, Lookat:=xlPart) 'si pas de matricule recherche nom
If x Is Nothing Then
c = c + 1 'identifie le nb de photo non trouvé
GoTo vide
Else
nomfic = x.Value
End If
Else
nomfic = x.Value
End If
fichimg = ActiveWorkbook.Path & "\PHOTOS STAGIAIRES\" & nomfic 'L'image est dans le même dossier que le classeur
End With
Worksheets("Trombinoscope").Activate
With Range("A:K")
Set x = .Find(what:=nom, Lookat:=xlPart) ' recherche le nom dans la feuille Trombinoscope
With Sheets("Trombinoscope").Pictures.Insert(fichimg) 'insert la photo
.Name = nom 'nomme la photo en fonction du nom
.Left = Range(x.Address).Offset(-2, 0).Left 'centre la photo
.Top = Range(x.Address).Offset(-2, 0).Top
.Height = Range(x.Address).Offset(-2, 0).Height ' hauteur de la cellule
.Width = Range(x.Address).Offset(-2, 0).Width ' largeur de la cellule
End With
End With
vide:
Next m
Application.DisplayAlerts = False
Sheets(1).Delete
Application.DisplayAlerts = True
Application.ScreenUpdating = True
réponse = MsgBox("il y a " & c & " personnel(s) à qui aucune photo n'a été attribuée", vbOKOnly + vbInformation)
End Sub
Bonjour,
ok , je comprend
je pense que tu as le même problème que j'ai rencontré avec ma liste de titre de film ,
un espace en trop ou en moins , un accent , ... et on retrouve plus rien
l'astuce que j'ai utilisée ,
mettre tout en minuscule simple (sans accent)
supprimer tous les espaces , les signes autre que des lettres ou chiffres
on se retrouve avec une suite de caractères pas très lisible , mais c'est temporaire et c'est pas nous , c'est le code qui va lire !!
Le Nom et le Prénom ---> lenometleprenom
et là tu retrouves ce que tu veux avec InStr() ,
c'est à dire que tu ne cherches pas une égalité , tu cherches si la source est dans la cible,... et c'est très important
lenometleprenom --> est dans --> lenometleprenom2
je posterais un code ... dans un moment ...
@+JP
Merci je vais tenter de mon côté également.
En vérifiant je n'ai pas vu de signe particulier ni d'espace dans les noms cherché mais ça ne coute rien de tenter....
Mon code est pourri donc je ne le met pas en ligne mais il a le mérite d'avoir testé si cela réglait le problème :
Bonjour,
j'ai regardé la fonction Find() ,
et par défaut MatchCase = False et donc ne regarde pas la casse , ...
mais la casse c'est "A" et "a" non ? et "â" ou "à" ?
dans immédiat , tu peu essayé Lookat:=xlWhole qui recherche "à l' intérieur" comme je t'ai expliqué
"nom" peut être à l’intérieur de "nom "
pour ce problème il y a Trim() , Trim(" nom ") --> "nom"
une autre facette du problème
dans un autre code j'obtiens tous les noms des fichiers image que je copie dans une feuille excel
est ce que ta liste est : "nom.jpg" ?
avec xlPart "nom" et "nom.jpg" c'est faux
avec xlWhole "nom" et "nom.jpg" c'est vrai
@+JP
Merci de ta réponse et désolé du temps de la mienne.
J'ai été très pris ce mois ci et je n'ai pas eu le temps de me pencher sur le problème.
Donc j'ai fait le test pour xlpart et xlwhole mais le problème est le même, les nom ne sont pas trouvé...
Si quelqu'un à une autre idée je suis preneur et je suis moins chargé en ce moment donc répondrai rapidement.
merci
Eh bien finalement cette longue absence de ma part a été bénéfique et donc je répond tout seul à mon problème.
la réponse est toute bête comme d'habitude.
je ne pensais pas que les nom de mon tableau initiale pouvait comporter des espace donc de là vient mon erreur.
J'ai donc tout simplement utiliser la fonction Trim()
merci de l'aide