XL 2013 VBA Rechercher fichier et création hyperlien de son chemin

titymax

XLDnaute Occasionnel
Bonjour à tous,

Ce que je cherche à faire est assez simple dans l'absolu mais je n'ai rien trouvé d'approchant sur les différents forums.

Description :

1 - J'ai une valeur X dans une cellule qui est aussi une partie du nom d'un fichier PDF se trouvant qque part sur un serveur (je connais le début du chemin c'est tout).
2 - Je souhaite lancer une recherche de ce fichier PDF contenant dans son nom la valeur X (c'est une valeur numérique à 10 chiffres).
3 - Une fois le fichier trouvé, je veux ajouter en hyperlien son chemin à la cellule contenant la valeur X.

Voilà, simple non...lool

Merci d'avance et bonne journée à tous.
 

Dranreb

XLDnaute Barbatruc
Faites des essais c'est tout ce que je peux dire. Le 1er paramètre Racine peut aussi être une concaténation d'expressions ne contenant pas de jockers '*'. Si la fonction ne trouve pas le fichier elle renvoie une chaine commençant par une '('.
 

xUpsilon

XLDnaute Accro
Re,

Une partie fixe appelée par ex PFIXE suivie d'une partie variable constituée de : \" & Range("E" & lig).Value & "\" & Range("N" & lig).Value

Ainsi le chemin est de la forme suivante : PFIXE\" & Range("E" & lig).Value & "\" & Range("N" & lig).Value

Alors tu connais le chemin de ton fichier non ? Vu comment tu présentes les choses on croirait que tout est spécifié dans PFIXE et dans tes cellules. Si la concaténation de tout ça te donne le chemin il te suffit d'utiliser un Application.Open Filename := Blablabla :oops:

Bonne continuation
 

Dranreb

XLDnaute Barbatruc
La fonction devrait pouvoir s'utiliser aussi comme argument d'une fonction =LIEN_HYPERTEXTE(RéfFic(PFIXE&"\"&E1&"\"&N1;"*"&F1&"*.pdf"))
On ne peut pas vous donner plus de précision tant que vous n'aurez pas joint un classeur modèle.
D'ailleurs je me demande bien qu'est ce qui m'a encore pris de répondre à une demande dépourvue de classeur joint.
 

titymax

XLDnaute Occasionnel
Oui, je suppose qu'il doit être possible de répondre à mon problème de différentes façons, je vais réaliser un fichier pour illustrer mais cela va me prendre du temps étant donné que je fais cela pendant mon travail et pour mon travail aussi d'ailleurs...

Je reviens donc le plus tôt possible, merci encore à vous 2 de vous être intéressé à mon cas.
 

Dranreb

XLDnaute Barbatruc
Si la racine est intégralement connue, quand bien même elle est variable et doit être composée à l'aide d'une concaténation, cette fonction est beaucoup plus simple :
VB:
Function RéfFichier(ByVal Racine As String, ByVal Masque As String) As String
   RéfFichier = Dir(Racine & "\" & Masque)
   If RéfFichier = "" Then RéfFichier = "(" & Racine & "\" & Masque & " ?)": Exit Function
   RéfFichier = Racine & "\" & RéfFichier
   End Function
 

titymax

XLDnaute Occasionnel
Bonjour,

Vous trouverez un fichier exemple qui illustre bien ce que je souhaite faire.

Le fichier à rechercher sera de la forme :

*REFERENCE*.PDF et il faut après recherche ajouter le lien à la cellule REFERENCE correspondante à chaque création de ligne "NOUVEAU VEHICULE".

Le répertoire dans lequel le fichier se trouve sera composé de la manière suivante :

Une partie fixe PFIXE de la forme Q:\AAAAA\BBBB\....\ à laquelle il faut concaténer les sous-répertoires MARQUE\ANNEE\MODELE de la ligne correspondante à la référence recherchée.

Ainsi, si je prends comme exemple la 1ère ligne du fichier joint (ligne 3), il aurait fallut que lors de la création de ce véhicule qu'un lien hypertexte soit ajouter à la cellule C3 amenant au fichier : Q:\AAAAA\BBBB\....\CITROEN\2019\C1\*6523564578*.pdf

Je vous remercie d'avance.
 

Pièces jointes

  • Ex pour forum Excel.xlsm
    27.6 KB · Affichages: 11

Dranreb

XLDnaute Barbatruc
Bonjour.
Aucun essai de nos solutions dans votre classeur (avec les parties de xUpsilon pour l'installation du lien hypertexte, ni les miennes pour obtenir l'expression String de la référence du fichier qui doit y servir de paramètre Address).
Par ailleurs je ne vois pas bien à quoi sert votre UserForm. Il ne garantit aucunement que vous ajoutez bien un nouveau véhicule, pous pouvez très bien y ajouter accidentellement un doublon.
Vous pouvez Utiliser l'enregistreur de macro pour avoir un modèle de mise en place du lien hypertexte.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Vous pouvez néanmoins essayer cette séquence dans votre Sub CommandButton1_Click
VB:
Dossier = "Q:\AAAAA\BBBB\" & Me.ComboBox7.Value & "\" & Year(Me.DTPicker1.Value) & "\" & Me.ComboBox3.Value
On Error Resume Next
ChDrive "Q": ChDir Dossier
If Err Then
   MsgBox "Impossible d'accdéder au dossier suivant :" & vbLf & Chemin _
      & vbLf & Err.Description, vbExclamation, Me.Caption & " - " & CommandButton1.Caption
Else
   Masque = "*" & Me.TextBox1.Value & "*.pdf"
   NomFic = Dir(Masque)
   If NomFic <> "" Then
      Hyperlinks.Add Anchor:=Range("D" & Lig), Address:=Dossier & "\" & NomFic, TextToDisplay:=Me.TextBox1.Value
   Else
      MsgBox "Aucun fichier de la forme """ & Masque & """ trouvé sur :" & vbLf & Dossier, _
         vbExclamation, Me.Caption & " - " & CommandButton1.Caption
      End If
À vous de rectifier ce qui ne va pas. Pas facile de s'y retrouver avec des contrôles qui ont gardé les noms qu'ils avaient au moment où ils ont été implantés.
 

titymax

XLDnaute Occasionnel
J'ai tout simplement voulu répondre à la remarque de Dranreb qui demandait très justement un fichier exemple afin d'illustrer au mieux ma problématique.
Je vais donc essayer d'incorporer le dernier code de Dranreb à ma macro pour tenter de parvenir à mes fins.

Pour répondre à la remarque de risque de doublons, cela ne peut pas arriver du fait que les références sont uniques... de toutes les manières ce fichier reflète juste l'esprit du véritable fichier sur lequel je travaille mais je suis très loin de gérer des véhicules.

Un grand merci à vous 2
 

Dranreb

XLDnaute Barbatruc
cela ne peut pas arriver du fait que les références sont uniques...
Je ne vois pas en quoi ça garantit que cette référence n'a pas déjà été entrée !
Je propose très régulièrement des applications qui interdisent purement et simplement d'annoncer à l'avance ce qu'on a l'intention de faire, avant d'avoir préalablement dit de quoi on parle. C'est seulement après l'avoir dit qu'on peut soit de l'ajouter si ça n'existe pas, soit le modifier ou le supprimer.
 

titymax

XLDnaute Occasionnel
Est il possible de mettre à la suite de "Dossier = "Q:\AAAAA\BBBB\" & Me.ComboBox7.Value & "\" & Year(Me.DTPicker1.Value) & "\" & Me.ComboBox3.Value" un équivalent à l'astérisque, car il peut y avoir encore un sous-répertoire derrière qui n'est pas tjs identifié...

En fait est il possible, une fois que l'on a défini le plus gros du chemin, d'aller rechercher dans des sous-répertoires supplémentaires dans le cas où il y en a ?

merci
 

Dranreb

XLDnaute Barbatruc
Non, l'astérisque n'est supportée que par Dir. Le ChDir exige un dossier exact.
Là, il faudrait faire comme ça :
VB:
Dossier = "Q:\AAAAA\BBBB\" & Me.ComboBox7.Value & "\" & Year(Me.DTPicker1.Value)
On Error Resume Next
ChDrive "Q": ChDir Dossier
If Err Then
   MsgBox "Impossible d'accdéder au dossier suivant :" & vbLf & Dossier _
      & vbLf & Err.Description, vbExclamation, Me.Caption & " - " & CommandButton1.Caption
   On Error GoTo 0
Else
   On Error GoTo 0
   Masque = Me.ComboBox3.Value & "*"
   NomFic = Dir(Masque, vbDirectory)
   If NomFic <> "" Then
      ChDir NomFic
      Masque = "*" & Me.TextBox1.Value & "*.pdf"
      NomFic = Dir(Masque)
      If NomFic <> "" Then
         Hyperlinks.Add Anchor:=Range("D" & Lig), Address:=Dossier & "\" & NomFic, TextToDisplay:=Me.TextBox1.Value
      Else
         MsgBox "Aucun fichier de la forme """ & Masque & """ trouvé sur :" & vbLf & CurDir, _
            vbExclamation, Me.Caption & " - " & CommandButton1.Caption
         End If
   Else
      MsgBox "Aucun dossier de la forme """ & Masque & """ trouvé sur :" & vbLf & CurDir, _
         vbExclamation, Me.Caption & " - " & CommandButton1.Caption
      End If
Mais si ça se complique encore coté parties indéterminées, ça va finir par devenir plus simple d'adopter ma fonction RéfFic du poste #14 dans un module standard de service. Ou si c'est encore plus flou, celle du #11.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Je propose cette réécriture de la fonction de service, combinant des avantages des deux autres déjà proposées :
VB:
Option Explicit
Public Function RéfFicApprox(ByVal Racine As String, ParamArray PAMasques() As Variant) As String
Rem. ——— Renvoie une référence de fichier à partir d'éléments partiellement connus de son identification.
'  Arguments à spécifier :
'     Racine: L'identification d'un dossier parfaitement connu, sans caractère jocker.
'     PAMasques: Une succession d'arguments en nombre variable pouvant être munis ou non de caractères
'        jockers supporté par l'opérateur Like de VBA. Les premiers définissent le profil de chaque nom
'        de sous-dossier, seul le dernier définit le profil de nom du fichier cherché.
'        Toutefois si aucun fichier de ce profil n'est trouvé, il le cherche encore dans les
'        sous-dossiers éventuels du dernier spécifié, l'avant dernier PAMasques, donc.
'  Conseil: veillez à ce que vos spécification n'obligent pas la fonction à chercher dans des chemin trop
'     nombreux et chargés, sinon son évaluation pourrait durer plusieurs minutes à cause d'élément auxquel
'     on aura été à cent lieues de penser, tant ils seront étrangers à celui recherché …
'  Remarque: s'il n'est pas trouvé de fichier correspondant, un texte commençant par une parenthèse
'     ouvrante est renvoyé.
'  Important. Nécessite la référence Microsoft Scripting Runtime (bibliothèque Scripting, fichier scrrun.dll).
   Dim M&, FSO As New FileSystemObject, Dossier As Folder, TMsq() As String, Fichier As File
   ReDim TMsq(1 To UBound(PAMasques) + 1)
   For M = 1 To UBound(TMsq): TMsq(M) = UCase$(PAMasques(UBound(TMsq) - M)): Next M
   On Error Resume Next
   Set Dossier = FSO.GetFolder(Racine)
   If Err Then RéfFicApprox = "(" & Racine & " ?)": Exit Function
   On Error GoTo 0
   Set Fichier = FicApprox(Dossier, TMsq): If Fichier Is Nothing Then RéfFicApprox = "(" & _
      Racine & ", " & Join(PAMasques, ", ") & " ?)" Else RéfFicApprox = Fichier.Path
   End Function
Private Function FicApprox(ByVal Doss As Folder, TMasques() As String) As File
   Dim UBTMq&, Masque As String, TMasquesRestants() As String
   On Error Resume Next
   UBTMq = UBound(TMasques): Masque = TMasques(UBTMq)
   If UBTMq = 1 Then
      For Each FicApprox In Doss.Files
         If UCase$(FicApprox.Name) Like Masque Then Exit Function
         Next FicApprox
      For Each Doss In Doss.SubFolders
         Set FicApprox = FicApprox(Doss, TMasques)
         If Not FicApprox Is Nothing Then Exit Function
         Next Doss
   Else
      TMasquesRestants = TMasques: ReDim Preserve TMasquesRestants(1 To UBTMq - 1)
      For Each Doss In Doss.SubFolders
         If UCase$(Doss.Name) Like Masque Then
            Set FicApprox = FicApprox(Doss, TMasquesRestants)
            If Not FicApprox Is Nothing Then Exit Function
            End If
         Next Doss: End If
   End Function
À mettre dans un module standard de service nommé MRéfFicApprox.
 

Discussions similaires

Statistiques des forums

Discussions
312 166
Messages
2 085 886
Membres
103 018
dernier inscrit
mohcen23