IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Renommer un "fichier introuvable" qui contient dans son nom un caractère indésirable


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Gestionnaire de projet dans le BTP
    Inscrit en
    Janvier 2017
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Gestionnaire de projet dans le BTP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Janvier 2017
    Messages : 88
    Par défaut Renommer un "fichier introuvable" qui contient dans son nom un caractère indésirable
    Bonjour,
    Je m'attaque à un problème (rare) de noms de fichiers qui en fait semblent contenir un caractère UNICODE (deux octets) au milieu des ANSII (un octet).
    Typiquement, ce sont des fichiers qui sont passés sur Mac ou UNIX.
    Exemple :
    On voit dans Windows : RC Ax 1 Points de vue imposés.pdf
    Mais Excel voit : RC Ax 1 Points de vue impose's.pdf , un chr(180) intempestif
    Dans Windows, si on parcours le nom $ par $, il faut deux <flèche gauche> pour passer le é. Si on est à la droite de cet ensemble, faire <supprimer> remplace le é par e et tout va bien.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    Option Explicit
     
    Sub Nettoie()
    Dim Fic As String
    Dim Fic2 As String
     
        Fic = Dir("F:\21\12-Organisation\28-Couts\DCE VOffre\")
        Do Until Fic = ""
            If InStr(Fic, Chr(180)) <> 0 Then
                Stop
                Fic2 = Replace(Fic, Chr(180), "")
                Name "F:\21\12-Organisation\28-Couts\DCE VOffre\" & Fic As Fic2
            End If
            Fic = Dir
        Loop
    End Sub
    Fic contient le $180, Fic2 ne l'a plus
    Et Name se plante "fichier introuvable"
    Quelqu'un a une idée de correction ?

  2. #2
    Membre Expert Avatar de Zekraoui_Jakani
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    1 671
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 671
    Par défaut
    J'ai essayé ceci avec succès:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    Sub RenameFile()
     
        Dim myPath, myFullPath, myFile As String
        Dim myChr, myRepl As String
        Dim myPos, j As Integer
     
        myFullPath = "C:\Users\Jakan\Downloads\Voitures_Importées_20220326.xlsx"   'Il faut s'assurer que le fichier n'est pas ouvert
        myPos = InStrRev(myFullPath, "\")
        myPath = Left(myFullPath, myPos)
        myFile = Mid(myFullPath, 1 + myPos)
     
        For j = 1 To 6  'pour 6 caractères spéciaux listés ci-dessous
            myChr = Choose(j, "é", "è", "ê", "ç", "à", "ù") 'on peut y ajouter autant de charactères que nécessaire et adapter le max de "j"
            'définir les caractères de remplacement:
            myRepl = Choose(j, "e", "e", "e", "c", "a", "u")    'on se débarasse des accents
     
            If InStr(myFile, myChr) > 0 Then
                myFile = Replace(myFile, myChr, myRepl)
                Name myFullPath As myPath & myFile
                Debug.Print myPath & myFile
            End If
        Next j
     
    End Sub

  3. #3
    Membre confirmé
    Homme Profil pro
    Gestionnaire de projet dans le BTP
    Inscrit en
    Janvier 2017
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Gestionnaire de projet dans le BTP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Janvier 2017
    Messages : 88
    Par défaut
    Ton code, même s'il est plus élégant que le mien, fait pareil.
    Il remplace "é" par "e", mais pas "e'". On enlève les accents, mais cela ne traite pas les caractères UNICODE.
    J'ai aussi essayé de remplacer "e'" par "é", mais cela ne marche pas non plus.

    La commande Name doit dater de MSDOS, comme la limitation d'un chemin à 255 caractères.
    Le problème est de trouver un autre moyen pour renommer le fichier.
    Il faudrait utiliser Shell, PowerShell, ou encore Kernel32.dll, mais je n'y connais pas grand chose.
    Je vais regarder Kernel32, qui est plus à ma portée, mais la doc n'est pas facile à trouver.

    J'ai trouvé deux autres joyeusetés :
    T1C-K8000-AVP-MOAI-TAB-0070_A_FDR 40 - D+®passement du budget de l'op+®ration.xlsx
    T1C-K8000-AVP-MOAI-TAB-0074_A_FDR 86 - Pr+®sence d'amiante dans les b+ótiments.xlsx

    PS : tu dois mettre ton Name hors la boucle, car il peut y en avoir plusieurs.

  4. #4
    Membre Expert Avatar de Zekraoui_Jakani
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    1 671
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 671
    Par défaut
    Autre piste: utiliser la fonction Asc(x)
    ASCII de l'alphabet minuscule va de 97 à 122 et les majuscules vont de 65 à 90, sauf erreur
    Tout caractère x dont Asc(x) est en dehors de ces valeurs devra être supprimé ou remplacé par ce que l'on veut.

  5. #5
    Membre confirmé
    Homme Profil pro
    Gestionnaire de projet dans le BTP
    Inscrit en
    Janvier 2017
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Gestionnaire de projet dans le BTP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Janvier 2017
    Messages : 88
    Par défaut
    Le problème est ailleurs, Name n'est pas capable d'atteindre dans Windows le fichier dont le nom est "incorrect". Il y a d'autres commandes qui bloquent sur ce fait.

  6. #6
    Membre Expert Avatar de Zekraoui_Jakani
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    1 671
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Novembre 2013
    Messages : 1 671
    Par défaut
    Il y a qq chose qui m'échappe !
    Le fichier "T1C-K8000-AVP-MOAI-TAB-0070_A_FDR 40 - D+®passement du budget de l'op+®ration.xlsx" doit bien se trouver dans l'explorateur de fichiers;
    donc je lis son nom, le change et le traite comme je veux. Désolé, je ne vois pas ton problème !

  7. #7
    Candidat au Club
    Homme Profil pro
    Retraité - Consultant bénévole pour une association
    Inscrit en
    Août 2024
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité - Consultant bénévole pour une association
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2024
    Messages : 3
    Par défaut Problème erreur 52 ou 53 sur fichier dont le nom comprend des caractères spéciaux
    Bonjour,

    Je rencontre un problème analogue à celui que vous décrivez dans votre discussion de mars 2022. J'ai développé un petit utilitaire en VB Excel qui range dans un Excel les fichiers de dossiers pour travailler dessus. Certains fichiers remontent une erreur 52 ou 53 quand j'essaie d'y accéder par exemple avec "FileLen".
    Le nom de ces fichiers a un format qui génère ce problème. Par exemple un nom de fichier contient le mot santé mais écrit de la façon suivante : sante' .

    J'ai essayé le code proposé (RenameFile) pour remplacer ces caractères mais la fonction "Name" remonte une erreur sur le nom du fichier origine.

    Bref, avez vous fini par trouver une solution.

    Par avance merci

  8. #8
    Membre confirmé
    Homme Profil pro
    Gestionnaire de projet dans le BTP
    Inscrit en
    Janvier 2017
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Gestionnaire de projet dans le BTP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Janvier 2017
    Messages : 88
    Par défaut
    Non, je n'ai abouti à rien. J'ai abandonné.
    Les caractères qui posent problème sont codés sur deux octets (provenance MAC ou Linux)
    On le voit en explorant le nom caractère par caractère avec les flèches. Il faut appuyer deux fois sur la flèche pour les passer.
    Comme mon pb était limité, le plus simple était de supprimer à la main le caractère en trop.
    Je n'ai pas essayé de reproduire ceci en VBA.
    Désolé.

  9. #9
    Membre Expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Par défaut
    Bonjour,

    une solution pourrait être de passer par le nom court 8+3 pour renommer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub test()
        'E:\tmp\tést evt app.xlsm
        ShowShortName "E:\tmp\tést evt app.xlsm"
    End Sub
     
    Sub ShowShortName(filespec)
        Dim fs, f, s
        Set fs = CreateObject("Scripting.FileSystemObject")
        Set f = fs.GetFile(filespec)
        s = "The short name for " & "" & UCase(f.Name)
        s = s & "" & vbCrLf
        s = s & "is: " & "" & f.ShortName & ""
        MsgBox s, 0, "Short Name Info"
    End Sub
    Résultat avec un accent :
    eric

    PS https://dos.heffge.fr/Le_dos_sied_noms.htm
    Images attachées Images attachées  

  10. #10
    Membre confirmé
    Homme Profil pro
    Gestionnaire de projet dans le BTP
    Inscrit en
    Janvier 2017
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Gestionnaire de projet dans le BTP
    Secteur : Bâtiment Travaux Publics

    Informations forums :
    Inscription : Janvier 2017
    Messages : 88
    Par défaut
    On pourrait également essayer ceci :
    https://learn.microsoft.com/fr-fr/wi...shortpathnamew
    On doit pouvoir atteindre le nom DOS (8.3) du fichier.

  11. #11
    Candidat au Club
    Homme Profil pro
    Retraité - Consultant bénévole pour une association
    Inscrit en
    Août 2024
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité - Consultant bénévole pour une association
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2024
    Messages : 3
    Par défaut Merci
    Merci pour votre réponse

  12. #12
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 536
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 536
    Par défaut
    Hello,

    Je ne fait pas trop confiance aux fonction intégrées de VBA pour manipuler le système de fichiers.
    As-tu essayé via FSO ?
    La classe File devrait te satisfaire: https://learn.microsoft.com/en-us/of...lp/file-object

  13. #13
    Candidat au Club
    Homme Profil pro
    Retraité - Consultant bénévole pour une association
    Inscrit en
    Août 2024
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 66
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité - Consultant bénévole pour une association
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Août 2024
    Messages : 3
    Par défaut
    Citation Envoyé par deedolith Voir le message
    Hello,

    Je ne fait pas trop confiance aux fonction intégrées de VBA pour manipuler le système de fichiers.
    As-tu essayé via FSO ?
    La classe File devrait te satisfaire: https://learn.microsoft.com/en-us/of...lp/file-object
    ----------------------------------------------------------------------

    Bonjour,

    Le problème vient de fichiers qui ont été créés sous MAC ou LINUX puis copiés sur un serveur Windows.
    La plus part du temps il s'agit de nom de fichiers contenant :
    Unicode Decimal Code ́
    Symbol Name: Combining Acute Accent
    Unicode Group: Combining Diacritical Marks

    J'ai essayé le bout de code suivant (adapté à mon contexte), mais fs.GetFile retourne une erreur 53

    Sub ShowFileInfo(filespec)
    Dim fs, f, s
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set f = fs.GetFile(filespec)
    s = f.DateCreated
    MsgBox s
    End Sub

    Au final j'ai trouvé un contournement et j'ai laissé tomber l'idée de traiter le problème via mon code VB.

    J'ai identifié les dossiers concernés et j'utilise le logiciel gratuit "Renamer" qui permet de supprimer le problème dans le nom de fichier.

    Merci pour ton message

Discussions similaires

  1. Réponses: 20
    Dernier message: 19/09/2012, 15h56
  2. Réponses: 2
    Dernier message: 04/12/2011, 19h42
  3. Réponses: 9
    Dernier message: 04/02/2010, 16h36
  4. Réponses: 2
    Dernier message: 03/10/2007, 16h45
  5. supprimer une table qui a des quotes dans son nom
    Par kleenex dans le forum Access
    Réponses: 2
    Dernier message: 17/10/2005, 16h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo