Lien hypertexte avec variable en VBA [Résolu]

1Globule 32 Messages postés mercredi 4 mai 2016Date d'inscription 8 juin 2017 Dernière intervention - 7 juin 2017 à 10:28 - Dernière réponse : 1Globule 32 Messages postés mercredi 4 mai 2016Date d'inscription 8 juin 2017 Dernière intervention
- 8 juin 2017 à 07:47
Bonjour,

J'ai besoin de votre aide pour créer un lien hypertexte par macro dans Excel.

A priori c'est très facile, sauf que je ne connais que le début du nom du fichier (par exemple, VARIABLE 10).

Le fichier peut en réalité s'appeler effectivement VARIABLE 10.xls, mais il peut aussi s'appeler VARIABLE 10 *.xls (avec un espace après le 10), ou encore VARIABLE 10_*.xls, ou pour finir VARIABLE 10-.xls.

J'ai bien essayé avec un like 10*, mais s'il existe un fichier VARIABLE 101, le lien est totalement faussé.

Il faut donc que je cherche le fichier qui s'appelle VARIABLE 10.xls
Si je ne le trouve pas, je dois chercher celui qui contient VARIABLE 10 *.xls (avec un espace après le 10).
Si je ne le trouve pas, je dois chercher celui qui contient VARIABLE 10_*.xls.
Et si je le trouve toujours pas, je dois chercher celui qui contient VARIABLE 10-.xls

Et pour compliquer le tout, si je ne trouve rien dans mon dossier ANCIEN, je dois rechercher dans mon dossier NOUVEAU...

Je suis conscient qu'il faudrait commencer par harmoniser le nom des fichiers, malheureusement c'est un autre service qui s'en occupe, je ne peux pas y toucher.

Quelqu'un aurait-il une solution pour moi ?

Merci beaucoup !
Afficher la suite 
32Messages postés mercredi 4 mai 2016Date d'inscription 8 juin 2017 Dernière intervention

10 réponses

Répondre au sujet
jordane45 19211 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 12 décembre 2017 Dernière intervention - 7 juin 2017 à 10:47
0
Utile
Bonjour,

Vu que tu n'as, visiblement, que quelques combinaisons possibles (avec ou sans espace, un underscore, un tiret .....) quelques IF suffiraient à traiter ton besoin non ?

A la limite, tu commences par lister ( via un 10* ) tous les fichiers...
Puis tu boucles sur cette liste pour voir si l'un d'eux correspondront à une des combinaison recherchées.
Si oui.. tu as trouvé ton fichier ....
Si non.. tu fais la même chose dans ton autre répertoire.


Commenter la réponse de jordane45
1Globule 32 Messages postés mercredi 4 mai 2016Date d'inscription 8 juin 2017 Dernière intervention - 7 juin 2017 à 11:14
0
Utile
1
Merci pour ta réponse.

C'est une idée que j'ai exploitée en partie mais elle me semble un peu compliquée malgré tout... ou alors je ne sais pas très bien comment structurer le code (fort possible aussi).

Serait-il possible, c'est une autre idée, de donner à ma variable plusieurs noms ?
C'est-à-dire la définir en tant que VARIABLE 10 ou VARIABLE 10[] ou VARIABLE 10_ ou VARIABLE 10- ?
Et si un fichier correspond à un des noms de ma variable, je crée le lien dessus.
jordane45 19211 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 12 décembre 2017 Dernière intervention - 7 juin 2017 à 14:00

Serait-il possible, c'est une autre idée, de donner à ma variable plusieurs noms ?

Non.

Par contre ... tu peux avoir une variable qui contient, par exemple :
Dim filename  as String

filename = "VARIABLE 10"
filename2 = filename & "[]"
filename3 = filename & "_"
filename4 = filename & "-"
filename5 = filename & " "




Ne te reste plus qu'à faire 5 IF pour chacune des variables ci-dessus pour voir si le fichier existe ou non.


Quoi qu'il en soit ....
C'est une idée que j'ai exploitée en partie mais elle me semble un peu compliquée malgré tout... ou alors je ne sais pas très bien comment structurer le code (fort possible aussi).

Si tu ne nous montres pas ton code ... nous ne pourront pas te le corriger.
Ici nous aidons à corriger du code ... nous ne fournissons pas du code tout cuit....

NB : Pour poster du code sur le forum.. merci d'utiliser la coloration syntaxique (les balises de code).
Explications disponibles ici : http://codes-sources.commentcamarche.net/faq/10686-le-nouveau-codes-sources-comment-ca-marche#balises-code

.
Commenter la réponse de 1Globule
michel_m 14938 Messages postés lundi 12 septembre 2005Date d'inscriptionContributeurStatut 12 décembre 2017 Dernière intervention - 7 juin 2017 à 14:26
0
Utile
1
Bonjour à tous

Peut-^tre une possibilité pour tester le "10" tout seul si espace entre variable et le reste du nom de fichier en utilisant "Split"

Option Explicit
Dim Verif As Boolean
'--------
Function essai_like(fich As String) As Boolean
Dim separe_esp, separe_pnt
separe_esp = Split(fich)
separe_pnt = Split(separe_esp(1), ".")
If separe_pnt(0) = "10" Then
essai_like = True
Else
essai_like = False
End If
MsgBox fich & " " & essai_like

End Function

et une macro -test pour seulement vérifier la fonction
'-----------
Sub test()
Dim Cptr As Byte, nomfichier As String
For Cptr = 1 To 3
nomfichier = Choose(Cptr, "variable 101.xls", "variable 10.xlsx", "variable 10_.xls")
essai_like (nomfichier)
If Verif = False Then MsgBox nomfichier & " non valable"
Next
End Sub

1Globule 32 Messages postés mercredi 4 mai 2016Date d'inscription 8 juin 2017 Dernière intervention - 7 juin 2017 à 15:01
En lisant la réponse de Michel je me rends compte qu'il y a peut-être un malentendu :

Le fichier que je cherche contient forcément VARIABLE 10, mais j'ignore la suite. il peut aussi s'appeler "VARIABLE 10 - paris", ou "VARIABLE 10_italie europe".

Dans le nom il y aura donc VARIABLE 10, c'est sûr, mais ensuite je peux juste savoir qu'il y aura un espace, un underscore ou un tiret, suivi potentiellement d'un autre texte plus ou moins long... D'oü la solution d'un like *, mais qui peut pointer sur un fichier VARIABLE 101.
Commenter la réponse de michel_m
1Globule 32 Messages postés mercredi 4 mai 2016Date d'inscription 8 juin 2017 Dernière intervention - 7 juin 2017 à 14:50
0
Utile
Pour l'instant voici le code que j'utilise mais qui parfois pointe vers de mauvais fichier (VARIABLE 101 au lieu de VARIABLE 10).



Sub Lien()
Dim nomC As String
nomC = Dir("C:\ANCIEN\" & ActiveCell.Value & "*.xls")
ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:="C:\ANCIEN\" & nomC
If nomC = "" Then
nomC = Dir("C:\NOUVEAU\" & ActiveCell.Value & "*.xls")
ActiveSheet.Hyperlinks.Add Anchor:=Selection, Address:="C:\NOUVEAU\" & nomC
End If

End Sub

Commenter la réponse de 1Globule
jordane45 19211 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 12 décembre 2017 Dernière intervention - 7 juin 2017 à 16:42
0
Utile
Bonjour,

Nous aussi (pour la plus part...) nous aidons entre deux appels, demandes de collègues... bref.. pendant notre travail !
Ca ne nous empèche pas d'être précis !!!

Bref...

Voici avec une expression régulière (les REGEX)
Sub test()
    Dim startFileName As String
    Dim objFSO As Object
    Dim objRegExp As Object
    Dim targetFolder As String
    Dim strPattern As String
    
    startFileName = "VARIABLE 10" ' debut du nom du fichier à trouver
    targetFolder = "c:\\TEMP\ANCIEN\\" ' chemin ou chercher
    
    strPattern = startFileName & "([\-_\W]).*.xlsx"
    
    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objRegExp = CreateObject("VBScript.RegExp")
    objRegExp.Pattern = strPattern
    objRegExp.IgnoreCase = True

   'Get the folder object associated with the target directory
    Set objFolder = objFSO.GetFolder(targetFolder)

    'Loop through the files current folder
    For Each objFile In objFolder.Files
        If objRegExp.test(objFile) Then
            'fichier trouvé !
            'ici tu créés ton lien hypertext
            '...
            Debug.Print "fichier trouvé : " & objFile
        End If
    Next


    'Garbage Collection
    Set objFSO = Nothing
    Set objRegExp = Nothing

End Sub



NB : Pour que ça fonctionne .. tu dois activer la référence Microsoft Visual Basic Regular Expression x.x ( mois c'est la 5.5 )
Voir un tuto sur les epxressions régulères en VBA : http://analystcave.com/excel-regex-tutorial/


Commenter la réponse de jordane45
1Globule 32 Messages postés mercredi 4 mai 2016Date d'inscription 8 juin 2017 Dernière intervention - 8 juin 2017 à 07:47
0
Utile
Jordane45,

Cette solution semble résoudre le problème d'après les premiers tests, je vais maintenant l'adapter aux contenus de cellules et chercher sur le dossier NOUVEAU en cas d'introuvé dans ANCIEN.

Je vais aussi regarder cette après-midi le tuto sur les expressions régulières, je pense avoir compris le principal.

En plus, je crois que la fonction split indiquée par Michel va peut-être pouvoir me servir pour un autre projet, il faut que je creuse un peu pour vraiment tout comprendre et essayer de m'en servir.

Merci à tous les deux pour le temps passé à aider les autres, et bravo si vous parvenez à le faire au milieu de vos collègues (pas toujours simple, moi j'ai du mal mais vous avez compris).

Très bonne journée à vous!
Commenter la réponse de 1Globule
michel_m 14938 Messages postés lundi 12 septembre 2005Date d'inscriptionContributeurStatut 12 décembre 2017 Dernière intervention - 7 juin 2017 à 15:59
-1
Utile
1
Je te remercie de m'avoir fait perdre du temps avec une demande erronée


et aussi c'est très sympa de m'avoir dit Merci pour avoir essayé de t'aider


1Globule 32 Messages postés mercredi 4 mai 2016Date d'inscription 8 juin 2017 Dernière intervention - 7 juin 2017 à 16:15
Je suis désolé, Michel, j'essaye de faire au mieux pendant mes heures de travail.

Ma demande n'était pas complète, j'en conviens, mais je ne cherchais évidemment pas à faire perdre du temps à qui que ce soit.

Merci beaucoup pour ta réponse, elle est précieuse car elle ouvre d'autres horizons auxquels je n'avais pas pensés. Pour l'instant je n'ai pas les connaissances suffisantes pour les exploiter mais j'ai pris des notes qui me serviront sans doute plus tard.

Tu m'as par ailleurs déjà dépanné, je n'ai absolument aucune raison de te jouer de mauvais tours.

Je suis encore une fois sincèrement désolé, j'ai des collègues qui m'interrompent, me téléphonent, j'essaye tant bien que mal d'avancer sur mon projet quand j'ai le temps. En l'occurence, je n'ai pas pensé en exposant mon problème à donner tous les détails.

J'espère que ma demande est maintenant complète et que tu ne me tiendras pas rigueur de la maladresse.

Merci également à Jordane45, je continue à chercher une solution à ce problème qui n'en serait pas un si mes collègues enregistraient tous leurs fichiers correctement
Commenter la réponse de michel_m