Microsoft 365 Liste des fichiers dans le répertoire

RollyLCXL

XLDnaute Nouveau
Bonjour,

J'utilise le code sn = Split(CreateObject("wscript.shell").exec("cmd /c dir """ & F & """ /a:-d /b").StdOut.ReadAll, vbCrLf)

Et j'envoi la liste des fichiers du répertoire courant dans une feuille Excel avec le code ... .Resize(UBound(sn) + 1) = Application.Transpose(sn).

Tout se fait parfaitement sauf ceci. Des caractères sont remplacés. Par exemple un fichier nommé Nouveautés.pdf dans le répertoire est renommé Nouveaut,s.pdf.

Il semble que tous les accents sont remplacés par des autres caractères étranges.

Comment faire afin d'obtenir le nom tel que dans l'Explorateurs de Fichiers de Windows?

C'est que cette façon de faire est extrêmement plus rapide qu'avec un Loop.

Merci à l'avance.
 

wDog66

XLDnaute Occasionnel
Bonjour RollyLCXL

Pourquoi ne pas utiliser PQ pour ça (Power Query) 😉
Dans mon exemple, le fichier ".xlsm" doit se trouver dans le dossier contenant les PDF
VB:
let
    // Obtenir le chemin du classeur depuis le nom défini "Path"
    SourcePathTable = Excel.CurrentWorkbook(){[Name="Chemin"]}[Content],
    WorkbookPath = SourcePathTable{0}[Column1],
    // Extraire le dossier du chemin du classeur
    FolderPath = Text.BeforeDelimiter(WorkbookPath, "["),
    // Lister les fichiers dans le dossier
    Source = Folder.Files(FolderPath),
    #"Lignes filtrées" = Table.SelectRows(Source, each ([Extension] = ".pdf")),
    #"Colonnes supprimées" = Table.RemoveColumns(#"Lignes filtrées",{"Extension", "Date accessed", "Date modified", "Date created", "Attributes", "Folder Path"})
in
    #"Colonnes supprimées"
 

patricktoulon

XLDnaute Barbatruc
Bonjour
avec le StDout.readAll tu peux pas changer le format
il te faut changer ta ligne de commande et utiliser la redirection vers un fichier text temporaire

au pire si tu insiste avec le stdout.readall essai d'inclure la commande chcp avec le format souhaité mais je ne pense pas que ça ai une incidence dans le stdout.readall

pour info cmd à la base ,est en format OEM 850
tu veux le ANSI
et la conversion des deux se fait avec une api dans une petite fonction que m'a donné généreusement @jurassic pork
le seule problème c'est que passer une certaine longueur de texte la fonction ne renvoie plus rien

je t'invite a visiter cette discussion

notamment la version 2 qui elle utilise le retour sur fichier temporaire
 

jurassic pork

XLDnaute Occasionnel
et la conversion des deux se fait avec une api dans une petite fonction que m'a donné généreusement @jurassic pork
le seule problème c'est que passer une certaine longueur de texte la fonction ne renvoie plus rien
Hello,
patricktoulon si tu utilises directement la fonction comme ceci (ce que tu fais dans la dernière version de ton classeur) :
VB:
OemToChar Liste, Liste
Il n' y a plus ce problème. Par exemple pour 75000 fichiers trouvés tous les fichiers sont bien traités. La fonction oem2ansi qui a le problème n'est plus utilisée.
Ami calmant, J.P
 

jurassic pork

XLDnaute Occasionnel
Mais ... concernant OemToChar Liste, Liste comment l'intégrer dans mon code?
Hello,
Exemple d'utilisation :
VB:
Private Declare PtrSafe Function OemToChar Lib "user32" Alias "OemToCharA" (ByVal lpszSrc As String, ByVal lpszDst As String) As Long
Sub TestDir()
Dim F, sn, res As String
F = "d:\dev\office\excel"
res = CreateObject("wscript.shell").exec("cmd /c dir """ & F & """ /a:-d /b").StdOut.ReadAll
OemToChar res, res
sn = Split(res, vbCrLf)
End Sub
Attention il faut que la variable utilisée dans OemToChar soit de type String ( res est de type String)
Ami calmant, J.P
 
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour à tous :),

Ma pomme vient avec la Grosse Bertha !

La question m'a rappelé tout de suite la notion de "Page de code" quand on travaillait sous DOS (je suis vieux).

Comme ici on utilise la commande CMD, on ouvre une console similaire à DOS. L'idée est d'utiliser un fichier type CMD avec en première commande "chcp 1252" qui va changer le code de la page de 850 (en général) à 1252 compatible avec Windows.

Donc un code à l'ancienne sans API ni objet exotique. Evidemment uniquement pour PC.

Les fichiers de travail se trouvent dans le fichier temporaire par défaut de Windows.

La fonction Directory_ListFiles_ToArray est la fonction qui liste un répertoire avec ou sans ses sous-répertoires.
Elle retourne un tableau directement transférable dans une colonne de feuille de calcul.
Si aucun fichier n'est trouvé alors la fonction retourne la chaine vide "".

Deux paramètres :
  1. Le nom complet du dossier (avec le chemin complet y compris l'indication du lecteur)
  2. Un paramètre optionnel de valeur quelconque. S'il est présent alors on liste aussi les sous-répertoires. Ou bien s'il est absent ou vaut "", alors on ne liste pas les sous-répertoires
Tout le code se trouve dans module1. La procédure Utilisation montre un exemple d'utilisation. Le code est un tout petit peu commenté.

Sur mon PC (windows11 et O365), ça fonctionne. Le listage avec les sous-répertoires du dossier C:\Program Files prend moins de 1,1 s pour environ 37 900 fichiers.
 

Pièces jointes

  • RollyLCXL- Lister Repert- v2.xlsm
    26.9 KB · Affichages: 7
Dernière édition:

mapomme

XLDnaute Barbatruc
Supporter XLD
Re @patricktoulon ,

Si on construit le fichier .cmd avec ces deux lignes :
VB:
chcp 1252
dir /A:-d /B /S>C:\Users\XXXX\AppData\Local\Temp\Listage.txt

Et qu'on double-clique sur le fichier .cmd, ça doit fonctionner (on liste les fichiers du répertoire courant).

Remplacer XXXX par le nom approprié correspondant à l'utilisateur.

nota : quand tu exécutes la procédure dans mon classeur, ça donne quoi ?
 

patricktoulon

XLDnaute Barbatruc
RE
Oui autant pour moi tu construit un bat
moi j'ai essayé le run de la ligne de commande directement
VB:
 Dim TempString As String,chemin,,expression,extension,recurr
 chemin="k:\vba excel"
 expression="*toto*"
 extension=".xlsm"
 recurr=" S/"
 Tempfile=ethisworkbook.path &"\output.txt"
 TempString = Replace("cmd /C chcp 1252 > Null && Dir ""*****""" & Recurr & " /b /a-d > """ & tempFile & """", "*****", CStr(Chemin) & Expression & extension, 1, -1, vbTextCompare)

CreateObject("Wscript.Shell").Run TempString, 0, True ' 0 = cacher la fenêtre, True = attendre que la commande se termine
chez moi que je change ou pas le texte est au bon format
 

jurassic pork

XLDnaute Occasionnel
je viens de trouver sur un site japonais l'astuce pour que le chcp fonctionne avec une ligne de 2 commandes ( il faut répéter le cmd /c ) .
Exemple :
VB:
Sub TestDir()
Dim F, sn, res As String
F = "d:\dev\office\excel"
res = CreateObject("wscript.shell").exec("cmd /c chcp 1252 > nul  & cmd /c dir """ & F & """ /a:-d /b").StdOut.ReadAll
sn = Split(res, vbCrLf)
End Sub
 

Discussions similaires

Réponses
19
Affichages
2 K

Membres actuellement en ligne

Statistiques des forums

Discussions
315 087
Messages
2 116 083
Membres
112 654
dernier inscrit
SADIKA