Ouvrir un fichier seulement si le nom ne dépasse pas un certain nombre de caratè [Résolu]

SERIEUXETCOOL 336 Messages postés dimanche 3 avril 2011Date d'inscription 12 juin 2012 Dernière intervention - 1 nov. 2011 à 19:57 - Dernière réponse : SERIEUXETCOOL 336 Messages postés dimanche 3 avril 2011Date d'inscription 12 juin 2012 Dernière intervention
- 4 nov. 2011 à 22:11
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 :

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 :

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é
Afficher la suite 

Votre réponse

9 réponses

Meilleure réponse
SERIEUXETCOOL 336 Messages postés dimanche 3 avril 2011Date d'inscription 12 juin 2012 Dernière intervention - 2 nov. 2011 à 18:36
3
Merci
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 Ucfoutu, 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 :

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é

Merci SERIEUXETCOOL 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 94 internautes ce mois-ci

Commenter la réponse de SERIEUXETCOOL
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 1 nov. 2011 à 20:12
0
Merci
Bonsoir,

ta réponse est dans ta question !
Chemin = Application.GetOpenFilename("Texte, *.txt") 'Boite de dialogue

Chemin est une variable de type string ===>>
If len(chemin) > 250 Then .... 
ce que tu chois comme longueur maxi)
____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
SERIEUXETCOOL 336 Messages postés dimanche 3 avril 2011Date d'inscription 12 juin 2012 Dernière intervention - 1 nov. 2011 à 23:17
0
Merci
Bonsoir Ucfoutu, sa faisait longtemps hein^^

Bien; j'ai essayé ta proposition mais le problème persiste encore. La variable "Chemin" contient le chemin d'accès au fichier cependant le programme refuse d'ouvrir un fichier dont le chemin d'accès comporte plus de 250 caractères.

Du coup la méthode
If len(chemin) > 250 Then .... 
ne fonctionne pas dès lors que le chemin d'accès est plus long que 250 caractères. Le programme plante à l'ouverture du fichier avant même de pouvoir tester le nombre de caractères de ce dernier. Et moi c'est justement sa que je veux mettre en évidence.

L'idée de compter le nombre de caractères du chemin d'accès au fichier est en effet bonne mais moi mon souci c'est que je ne sais pas compter le nombre de caractères du chemin avant d'ouvrir le fichier^^ Il est la mon vrai souci.

Du coup, comment pourrais je vérifier que le chemin d'accès à mon fichier est plus court que 250 caractères avant d'essayer d'ouvrir le fichier ?

Merci pour tes conseils Ucfoutu. Et si les autres ont des idées à proposer je suis toujours preneur.

André
Commenter la réponse de SERIEUXETCOOL
SERIEUXETCOOL 336 Messages postés dimanche 3 avril 2011Date d'inscription 12 juin 2012 Dernière intervention - 2 nov. 2011 à 00:41
0
Merci
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 :

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é
Commenter la réponse de SERIEUXETCOOL
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 2 nov. 2011 à 08:42
0
Merci
regarde
1/0 provoque une erreur
la première est sautée par On Error Resume Next
la seconde est par contre ensuite dénoncée et met fin au on error resume next
On Error Resume Next
 a = 1 / 0
 On Error GoTo 0
 a = 1 / 0



____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 2 nov. 2011 à 19:47
0
Merci
Bon !
Un mystère demeure pourtant pour moi : ===>>
Je m'évertue depuis ce matin à "recréer" la "situation".
J'ai beau faire et refaire ===>> Windows ne me permet jamais de la créer, cette "situation", à savoir : générer (à grand renfort de création de dossiers, sous-dossiers et fichiers), une situation dans laquelle un chemin complet dépasserait la limite dénoncée. Windows me bloque au moment même d'une création qui ferait qu'un chemin complet dépasserait ladite limite.
Question, donc (pour satisfaire ma curiosité) : comment t'y es-tu donc pris pour avoir des chemins dépassant cette limite ? Puisque j'ai beau faire, refaire, tenter, retenter, etc ... Windows me "jette" avant ...
Quel est donc ce secret que j'ignore ? ===>> dis-le moi, s'il te plait



____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
Utilisateur anonyme - 2 nov. 2011 à 20:48
0
Merci
Windows me "jette" avant ...

Passer à Win 98
Commenter la réponse de Utilisateur anonyme
ucfoutu 18039 Messages postés lundi 7 décembre 2009Date d'inscriptionContributeurStatut 11 avril 2018 Dernière intervention - 3 nov. 2011 à 10:41
0
Merci
Bonjour, banana32,

Je n'ai plus une seule chance de voir comment réagissait Win 98 et je ne me rappelle même plus si existait une limitation de l'espèce.
Mais XP ne laisse rien passer de la sorte, chez moi.
Crois-tu que SERIEUXETCOOL tourne encore avec Win 98, de toutes manières ?


____________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches d'autres forumeurs.
Pas d'aide en ligne installée ? ==> ne comptez pas sur moi pour simplement vous dire ce qu'elle contient
Commenter la réponse de ucfoutu
SERIEUXETCOOL 336 Messages postés dimanche 3 avril 2011Date d'inscription 12 juin 2012 Dernière intervention - 4 nov. 2011 à 22:11
0
Merci
Bonsoir tout le monde.

Je viens répondre aux interrogations de Ucfoutu. Dsl pour le retard je n'avais pas vu les réponses depuis Mercredi.

Alors voila pour la petite histoire comment tout cela est arrivé chez moi :

Je testais ma macro comme je le fais depuis un moment déjà. Dans ma macro, je demande d'ouvrir un fichier texte. La semaine dernière, je procédais à un test sur un fichier que j'avais modifié et enregistré sous un autre nom. Effectivement j'avais mis un nom de fichier très explicite et très long !

Lorsque j'ai demandé à ma macro de venir ouvrir ce fichier, j'ai eu la surprise de voir ce nouveau message d'erreur "chemin trop long". J'ai été surpris. J'ai donc renommé d'autres fichiers avec de grandes chaines de caractères et ma macro refuse de les ouvrir.

Je ne suis pas sous Win 98. Je ne l'ai même jamais connu en fait^^. Je travail sous XP service pack 3 de mémoire. Tout ce qu'il y a de plus classique. Et J'utilise Excel 2007 aussi...
En revanche, ce que tu dis Ucfoutu n'est pas anodin. Car en effet, au boulot quand je demande à ma macro d’ouvrir ce même fichier "trop long" et bien il ne ronchonne pas lui alors qu'à la maison si !!!
Pourtant c'est le même Excel sur les 2 pc mais l'instal de XP ne viens pas de la même source. Donc va savoir pourquoi chez moi sa me limite à 256 caractères et pas au boulot et pas chez toi Ucfoutu ???

Ce qui est sûr c'est que sa peut arriver, donc maintenant si sa se produit ailleurs qu'avec moi ben le bug est fixé.

Conclusion : Moi aussi j'ai bien remarqué que sa ne produit pas sur tous systèmes d'exploitations. Cause ? Je ne sais pas, et je m'en moque un peu^^.

Moi aussi j'ai essayé de construire des arborescences phénoménales au boulot et jamais de problèmes. On a fait les même tests on dirais bien^^.

Allez c'est pas le bout du monde. Voila j'espère avoir répondu à tes questions Ucfoutu.

Bonne soirée pour tous.
Commenter la réponse de SERIEUXETCOOL

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.