Ouvrir un fichier seulement si le nom ne dépasse pas un certain nombre de caratères

SERIEUXETCOOL

XLDnaute Occasionnel
Bonsoir le Forum,

J'ai une petite question de nouveau...

Sous Vba et Excel 2007, dans un module j'utilise "Application.GetOpenFilename". Je cherche maintenant à prohiber l'ouverture d'un fichier dont le nom du chemin d'accès comporterait plus de 250 caractères. Sinon sa plante ma Macro.

250 caractères sa fait beaucoup certains me diront. Mais avec les dossiers et sous dossier plus un nom de fichier assez long et bien les 250 caractères sont parfois vite atteints. Du coup je souhaite anticiper ces éventuelles erreurs de plantage.

Question : Comment pourrais-je m'y prendre ?

Voici le bout de code que j'utilise :

Code:
i = 1 'Initialise la première ligne
Chemin = "TEST" 'Pour que la boucle ne s'arrête pas tout de suite
Chemin = Application.GetOpenFilename("Texte, *.txt") 'Boite de dialogue
If InStr(Chemin, "\") = 0 Then 'Si Chemin n'a pas de \ donc que l'opérateur a fait annuler
GOON = False 'Variable publique qui change d'état
GoTo Fin 'Va à l'étiquette Fin:
End If 'Fin du test


Voici les idées que j'ai en tête mais que je ne sais pas utiliser vu mon niveau. Je me dis que l'on pourrait peut être déterminer le nombre de caractères de la variable "Chemin" et vérifier que ce nombre soit inférieur à 250 ?

Sinon sur le net je suis tombé sur la fonction "GetShortPathName" mais je ne la comprends pas. Du coup pas possible de la tester.

Voici le code utilisé pour cette fonction :

Code:
Private Declare Function GetShortPathName Lib "kernel32" Alias "GetShortPathNameA" (ByVal lpszLongPath As String, ByVal lpszShortPath As String, ByVal cchBuffer As Long) As Long
Const MAX_PATH_LENGHT = 255

Function ShortPath(LongPath As String) As String

Dim tmpShortPath As String
Dim RC As Long

tmpShortPath = Space(MAX_PATH_LENGHT + 1)
RC = GetShortPathName(LongPath, tmpShortPath, MAX_PATH_LENGHT + 1)
ShortPath = Left(tmpShortPath, InStr(tmpShortPath, Chr$(0)) - 1)

End Function

Private Sub Test()
MsgBox ShortPath(" C:\Projets\Samples\NewStepperLuxe\Lib\AMORTISSEUR COMPLET.top.png")
End Sub

Quelqu'un pourrait il m'aiguiller sur mon problème de nombre de caractères ?

Un grand merci,

André
 

Staple1600

XLDnaute Barbatruc
Re : Ouvrir un fichier seulement si le nom ne dépasse pas un certain nombre de caratè

Bonsoir le fil, le forum


Essaie d'adapter l'exemple ci-dessous à tes besoins
Pour tester lancer la procédure: macrotest
Code:
Function GetPathName(strPath As String, pathtype As Boolean) As String
   Dim fso, fdr
   Set fso = CreateObject("Scripting.FileSystemObject")
   On Error Resume Next
   Set fdr = fso.GetFolder(strPath)
   If Err.Number <> 0 Then
      GetPathName = "No such folder"
   Else
      GetPathName = IIf(pathtype, fdr.Path, fdr.shortPath)
   End If
End Function
Code:
Sub macrotest()
MsgBox "NOM LONG: " & GetPathName(Application.Path, True)
MsgBox "NOM COURT: " & GetPathName(Application.Path, False)
If Len(GetPathName(Application.Path, False)) > 250 Then
MsgBox "pas ok"
Else
MsgBox "ok"
End If
End Sub
 

SERIEUXETCOOL

XLDnaute Occasionnel
Re : Ouvrir un fichier seulement si le nom ne dépasse pas un certain nombre de caratè

Bonsoir Staple1600, Le forum,

J'ai passé la soirée à tester ton bout de code et je ne suis pas parvenu à un résultat satisfaisant.

J'ai bien vu que ta fonction "GetPathName" permet de récupérer un nom long et ensuite de le raccourcir. Malheureusement je ne suis pas parvenu à créer un lien direct entre ma variable "Chemin" et le premier argument que tu mets dans ta fonction "Application.Path".

Pourrais je avoir plus d'explications car la je ne vais pas y arriver ainsi.

En tout cas merci pour ton début d'aide.

André
 

SERIEUXETCOOL

XLDnaute Occasionnel
Re : Ouvrir un fichier seulement si le nom ne dépasse pas un certain nombre de caratè

Finalement j'ai réussi à me dépatouiller une solution qui fonctionne. Cependant c'est une solution bricolage et je n'aime pas sa !

Voici ce que je propose temporairement en attendant mieux :

Code:
On Error Resume Next
Chemin = Application.GetOpenFilename("Texte, *.txt")  'Boite de dialogue
If (Err.Number = 1004) Then
    MsgBox "Fichier trop long dsl"
    GOON = False 'Variable publique qui change d'état
    Exit Sub
End If

Le gros inconvénient de cette solution est que si dans la suite de ma macro une erreur se produit...Et bien je risque de ne pas en être averti si l'instruction suivante est correcte. C'est donc l'instruction "On Error" qui n'est pas du tout adaptée ici.

Est-il possible d'adapter le code que je propose pour qu'il ne détecte qu'une seule erreur d'instruction ??? Ainsi je ne gère que l'erreur induite par l'ouverture d'un fichier et les erreurs suivantes sont détectées immédiatement.

Enfin bref, c'est en attendant mieux, ou alors (mieux et plus simple) lol

Bonne soirée,

André
 

SERIEUXETCOOL

XLDnaute Occasionnel
Re : Ouvrir un fichier seulement si le nom ne dépasse pas un certain nombre de caratè

Bonsoir le Forum,

Comme toujours je viens faire un petit retour d'expérience sur les solutions et commentaires postés ici pour m'aider...

Et bien en effet pierrot93, tu as raison. La rectification que tu m'a proposé fonctionne parfaitement. C'est exactement ce qu'il manquait pour compléter la chose^^

Dsl pour le retard mais je n'ai pas pu tester cela avant.

Je poste ci après le code que j'ai utilisé et qui fonctionne parfaitement :

Code:
On Error Resume Next 'Place un gestionnaire d'erreurs qui saute l'instruction défectueuse
Chemin = Application.GetOpenFilename("Texte, *.txt")  'Boite de dialogue
If (Err.Number > 0) Then 'Indique le numéro de l’erreur. Ce numéro est unique et dépend également de l’application
    MsgBox Err.Description 'Cette propriété indique la description de l’erreur
    GOON = False 'Variable publique qui change d'état
    On Error GoTo 0 'Enlève le gestionnaire d'erreur s'il était mis en place
    Exit Sub
End If
On Error GoTo 0 'Enlève le gestionnaire d'erreur s'il était mis en place


Voila qui est fait. Encore merci pour votre aide c'est bien gentil.

Cordialement,

André
 

Discussions similaires

Statistiques des forums

Discussions
312 209
Messages
2 086 267
Membres
103 168
dernier inscrit
isidore33