VBA Liste Fichier: Mise en forme tableau et Nom de fichier partiel
Bonjour,
Je débute en VBA et en compilant des bouts de code que j'ai trouvé ou créer je suis arrivé au code ci-dessous pour créer ma liste de fichier, le but étant de créer un tableau de données qui sera exploité par d'autre fichier excel.
Option Explicit
Dim cible As Byte
Sub Extraction()
Dim Dossier As String
Dim FileItem As Scripting.File
Dossier = "C:\00_Administratif\03_Offres"
cible = NbSeparateur(Dossier)
Suppcolonne
'Appelle la procdure de recherche des fichiers
ListeFichiers Dossier
efface
miseenforme
'Ajuste la largeur des colonnes A:E en fonction du contenu des cellules.
Columns("A:F").AutoFit
End Sub
Sub ListeFichiers(Repertoire As String)
Dim Fso As Scripting.FileSystemObject
Dim SourceFolder As Scripting.Folder
Dim SubFolder As Scripting.Folder
Dim FileItem As Scripting.File
Dim I As Long
Set Fso = CreateObject("Scripting.FileSystemObject")
Set SourceFolder = Fso.GetFolder(Repertoire)
'Nom des colonnes
Cells(1, 1) = "Année"
Cells(1, 2) = "N°"
Cells(1, 3) = "Statut"
Cells(1, 4) = "Nom de l'affaire"
Cells(1, 5) = "Chemin Complet"
Cells(1, 6) = "Date"
'Récupère le numéro de la dernière ligne vide dans la colonne A.
I = Range("A65536").End(xlUp).Row + 1
'Boucle sur tous les fichiers du répertoire
For Each FileItem In SourceFolder.Files
'Inscrit le nom du fichier dans la cellule
Cells(I, 1) = SourceFolder.Name
'Nom du répertoire
'Cells(I, 2) = Left(Nom, InStr("_", Nom))
Cells(I, 2) = FileItem.Name
'Nom du dossier
Cells(I, 4) = FileItem.Name
'Inscrit le nom du fichier dans la cellule
Cells(I, 5) = FileItem.ParentFolder & "\" & FileItem.Name
'Inscrit le nom du fichier dans la cellule
Cells(I, 6) = FileItem.DateCreated
I = I + 1
Next FileItem
'--- Appel récursif pour lister les fichier dans les sous-répertoires ---.
For Each SubFolder In SourceFolder.SubFolders
ListeFichiers SubFolder.Path
Next SubFolder
End Sub
Sub miseenforme()
Application.CutCopyMode = False
ActiveSheet.ListObjects.Add(xlSrcRange, Range("$A$1:$F$10"), , xlYes).Name = _
"TableauOffre"
Range("TableauOffre[#All]").Select
ActiveSheet.ListObjects("TableauOffre").TableStyle = "ExportDonne_x"
End Sub
Sub Suppcolonne()
'
' Suppcolonne Macro
'
'
Columns("A:F").Select
Selection.ClearContents
With Selection.Interior
.PatternColorIndex = xlAutomatic
.ThemeColor = xlThemeColorDark1
.TintAndShade = -0.149998474074526
.PatternTintAndShade = 0
End With
End Sub
Sub efface()
Dim l As Integer
For l = Cells(65256, 1).End(xlUp).Row To 1 Step -1
If Cells(l, 1).Value = "03_Offres" Then Cells(l, 1).EntireRow.delete
Next l
End Sub
Function NbSeparateur(chemin As String) As Byte
Dim m As Integer
Dim Nb As Byte
For m = 1 To Len(chemin)
If Mid(chemin, m, 1) = "\" Then
Nb = Nb + 1
m = m + 1
End If
Next
NbSeparateur = Nb
End Functionvoila ce que ça donne comme résultat:
Mais je souhaiterais arriver à cela:
Je bloque donc sur plusieurs point....
- Mettre sous forme de tableau l'ensemble des données ( plage de données variable)
- Appliquer le remplissage du style du tableau (j'ai un remplissage en gris sur l'ensemble de la feuille)
- Dans le colonne B et D je souhaiterais avoir une partie du nom du fichier (en B: nom avant "_" et en D: nom après "_" sans l'extension)
Merci d'avance à ceux qui prendront le temps de répondre
Bonjour,
Voici un essai où j'ai enlevé ce qui ne me semblait pas nécessaire :
Option Explicit
public n&, t()
Sub Extraction()
dim tfiles
ListeFichiers "C:\00_Administratif\03_Offres"
tfiles = Filtre(application.transpose(t), "03_Offres", False)
n = 0: erase t
Raz
if isarray(tfiles) then Restitution tfiles
End Sub
Sub ListeFichiers(Repertoire As String)
dim fso as object, SourceFolder as object, Subfolder as object, FileItem as object
Set Fso = CreateObject("Scripting.FileSystemObject")
Set SourceFolder = Fso.GetFolder(Repertoire)
For Each FileItem In SourceFolder.Files
n = n + 1
redim preserve t(1 to 6, 1 to n)
t(1, n) = SourceFolder.Name
t(2, n) = split(FileItem.Name, "_")(0)
t(4, n) = split(split(FileItem.Name, "_")(1), ".")(0)
t(5, n) = FileItem.path
t(6, n) = FileItem.DateCreated
Next FileItem
For Each SubFolder In SourceFolder.SubFolders
ListeFichiers SubFolder.Path
Next SubFolder
End Sub
function Filtre(ArrSrc, Critere$, optional Include as boolean = true, optional Col as byte = 1)
dim temp(), i&, j&, k&
For i = lbound(ArrSrc) to ubound(ArrSrc)
If (ArrSrc(i, Col) like Critere) = Include Then
j = j + 1: redim preserve temp(1 to ubound(ArrSrc, 2), 1 to j)
for k = lbound(ArrSrc, 2) to ubound(ArrSrc, 2)
temp(k, j) = ArrSrc(i, k)
next k
end if
Next i
if j > 0 then Filtre = application.transpose(temp)
End function
Sub Raz()
with ActiveSheet
if .listobjects.count > 0 then .listobjects(1).delete
end with
end sub
Sub Restitution(tDatas)
with ActiveSheet
.range("A1:F1").value = array("Année", "N°", "Statut", "Nom de l'affaire", "Chemin Complet", "Date")
.cells(2, 1).resize(ubound(tDatas), ubound(tDatas, 2)).value = tDatas
with .ListObjects.Add(xlSrcRange, .usedrange, , xlYes)
.Name = "TableauOffre"
.TableStyle = "ExportDonne_x"
.columns.autofit
end with
end with
End SubJe suis prêt à expliquer ce qui n'est pas clair.
Par ailleurs, je ne recommande pas le fond gris sur toute la feuille, ça n'a pour avantage que d'alourdir inutilement le fichier.
Cdlt,
merci pour le code mais quand je le lance cela bloque au niveau de la ligne de code ci-dessous:
t(4, n) = split(split(FileItem.Name, "_")(1), ".")(0)Bonjour,
Quel est le message ?
Est-ce que certains noms de fichier n'ont pas de "_" ? Si c'est le cas, que faut-il faire avec ces fichiers ?
Pour l'instant il n'y a que le fichier ou je crée ma liste qui n'a pas de "_" et qui se nomme "Liste des Offres" mais je suis entrain de réorganiser mon réseaux donc en condition réel il risque d'en avoir mais il ne me seras pas utile de les lister. Peut on envisager de ne lister que les fichiers avec "_" ?
voila l'erreur
D'accord, dans ce cas, voici un nouvel essai sans les fichiers qui ne contiennent pas "_" :
Option Explicit
public n&, t()
Sub Extraction()
dim tfiles
ListeFichiers "C:\00_Administratif\03_Offres"
tfiles = Filtre(application.transpose(t), "03_Offres", False)
n = 0: erase t
Raz
if isarray(tfiles) then Restitution tfiles
End Sub
Sub ListeFichiers(Repertoire As String)
dim fso as object, SourceFolder as object, Subfolder as object, FileItem as object
Set Fso = CreateObject("Scripting.FileSystemObject")
Set SourceFolder = Fso.GetFolder(Repertoire)
For Each FileItem In SourceFolder.Files
if fileitem.name like "*_*" then
n = n + 1
redim preserve t(1 to 6, 1 to n)
t(1, n) = SourceFolder.Name
t(2, n) = split(FileItem.Name, "_")(0)
t(4, n) = split(split(FileItem.Name, "_")(1), ".")(0)
t(5, n) = FileItem.path
t(6, n) = FileItem.DateCreated
end if
Next FileItem
For Each SubFolder In SourceFolder.SubFolders
ListeFichiers SubFolder.Path
Next SubFolder
End Sub
function Filtre(ArrSrc, Critere$, optional Include as boolean = true, optional Col as byte = 1)
dim temp(), i&, j&, k&
For i = lbound(ArrSrc) to ubound(ArrSrc)
If (ArrSrc(i, Col) like Critere) = Include Then
j = j + 1: redim preserve temp(1 to ubound(ArrSrc, 2), 1 to j)
for k = lbound(ArrSrc, 2) to ubound(ArrSrc, 2)
temp(k, j) = ArrSrc(i, k)
next k
end if
Next i
if j > 0 then Filtre = application.transpose(temp)
End function
Sub Raz()
with ActiveSheet
if .listobjects.count > 0 then .listobjects(1).delete
end with
end sub
Sub Restitution(tDatas)
with ActiveSheet
.range("A1:F1").value = array("Année", "N°", "Statut", "Nom de l'affaire", "Chemin Complet", "Date")
.cells(2, 1).resize(ubound(tDatas), ubound(tDatas, 2)).value = tDatas
with .ListObjects.Add(xlSrcRange, .usedrange, , xlYes)
.Name = "TableauOffre"
.TableStyle = "ExportDonne_x"
.columns.autofit
end with
end with
End SubCdlt,
J'ai essayé ton 2ème code mais l'erreur été toujours la j'ai pu contourner le problème en le faisant en 2 fois. Après ton code n'afficher plus d'erreur mais pas de résultat n'on plus.... (je l'ai testé en plusieurs fois donc possible que j'ai touché quelque chose).
Du coup comme je comprenais pas tous à ton code (je débute) j'ai fais un mixte avec le mien et j'ai pu aboutir au résultat escompter!
Je pense que l'on peut optimiser mon code mais je le ferais quand j'aurais de meilleur connaissance (la comprend presque tous) et pour la mise en forme je verrais plus tard!
Donc Problème résolu!!
Merci d'avoir pris le temps de m'aider
Option Explicit
Sub Extraction()
Dim Dossier As String
Dim FileItem As Scripting.File
Dossier = "C:\00_Administratif\03_Offres"
Suppcolonne
ListeFichiers Dossier
efface
miseenforme
Columns("A:F").AutoFit
End Sub
Sub ListeFichiers(Repertoire As String)
Dim fso As Scripting.FileSystemObject
Dim SourceFolder As Scripting.Folder
Dim Subfolder As Scripting.Folder
Dim FileItem As Scripting.File
Dim i As Long
Dim Nom As String
Set fso = CreateObject("Scripting.FileSystemObject")
Set SourceFolder = fso.GetFolder(Repertoire)
Cells(1, 1) = "Dossier"
Cells(1, 2) = "N°de l'affaire"
Cells(1, 3) = "Nom de l'affaire"
Cells(1, 4) = "Chemin Complet"
Cells(1, 5) = "Date"
Cells(1, 6) = "Vérif. Statut"
i = Range("A65536").End(xlUp).Row + 1
For Each FileItem In SourceFolder.Files
Nom = Split(FileItem.Name, ".")(0)
If FileItem.Name Like "*_*" Then
Cells(i, 1) = SourceFolder.Name
Cells(i, 2) = Split(FileItem.Name, "_")(0)
Cells(i, 3) = Split(Nom, "_")(1)
Cells(i, 4) = FileItem.Path
Cells(i, 5) = FileItem.DateCreated
i = i + 1
End If
Next FileItem
For Each Subfolder In SourceFolder.SubFolders
ListeFichiers Subfolder.Path
Next Subfolder
End Sub
Sub miseenforme()
With ActiveSheet.ListObjects.Add(xlSrcRange, Range(Cells(1, 1), Cells(ActiveSheet.Rows.Count, 1).End(xlUp).Offset(1, 5)), xlYes)
.Name = "TableauOffre"
.TableStyle = "ExportDonne_x"
End With
End Sub
Sub Suppcolonne()
Columns("A:F").Select
Selection.ClearContents
End Sub
Sub efface()
Dim l As Integer
For l = Cells(65256, 1).End(xlUp).Row To 1 Step -1
If Cells(l, 1).Value = "03_Offres" Then Cells(l, 1).EntireRow.delete
Next l
End SubBonsoir Excelium,
Merci du retour !
Je viens de modifier mon dernier code dans lequel il y avait une petite erreur. Peux-tu quand même l'essayer ?
Cdlt,
Oui pas de problème post ton code et je ferais le test
Ca y est, j'ai modifié le code de mon commentaire de lundi à 21h15.
j'ai réessayé et a la fin de t'as Function il faut mettre End Function mais après avoir corrigé cela plus d'erreur mais ne ce passe toujours rien
J'ai à nouveau modifié le code. Le souci venait de la fonction Filtre
Au cas où, pour mieux tester du code et progresser, il faut savoir qu'il est possible d'exécuter au pas à pas détaillé à l'aide de la touche F8 du clavier. Il est également possible de marquer des points d'arrêt sur certaines lignes importantes (en cliquant dans la marge juste à côté >>> un point marron apparait) afin d'inspecter le déroulement de l'exécution à un endroit précis.
Cdlt,
Merci pour l'astuce, j'ai refais le test et il y avais encore une erreur que j'ai corrigé au niveau de l'ajustement des colonnes et maintenant le code fonctionne et il est plus rapide que le mien rien que sur quelque fichier!
Par contre entre temps j'ai rajouter des fichiers excel et pdf dans le dossier et le format date ne s'applique pas il les écrit sous forme de texte car même manuellement via le format de cellule après avoir lancé la macro cela ne change pas peux tu m'indiquer pourquoi?
Option Explicit
Public n&, t()
Sub Extraction()
Dim tfiles
ListeFichiers "C:\00_Administratif\03_Offres"
tfiles = Filtre(Application.Transpose(t), "03_Offres", False)
n = 0: Erase t
Raz
If IsArray(tfiles) Then Restitution tfiles
End Sub
Sub ListeFichiers(Repertoire As String)
Dim fso As Object, SourceFolder As Object, Subfolder As Object, FileItem As Object
Set fso = CreateObject("Scripting.FileSystemObject")
Set SourceFolder = fso.GetFolder(Repertoire)
For Each FileItem In SourceFolder.Files
If FileItem.Name Like "*_*" Then
n = n + 1
ReDim Preserve t(1 To 6, 1 To n)
t(1, n) = SourceFolder.Name
t(2, n) = Split(FileItem.Name, "_")(0)
t(4, n) = Split(Split(FileItem.Name, "_")(1), ".")(0)
t(5, n) = FileItem.Path
t(6, n) = FileItem.DateCreated
End If
Next FileItem
For Each Subfolder In SourceFolder.SubFolders
ListeFichiers Subfolder.Path
Next Subfolder
End Sub
Function Filtre(ArrSrc, Critere$, Optional Include As Boolean = True, Optional Col As Byte = 1)
Dim temp(), i&, j&, k&
For i = LBound(ArrSrc) To UBound(ArrSrc)
If (ArrSrc(i, Col) Like Critere) = Include Then
j = j + 1: ReDim Preserve temp(1 To UBound(ArrSrc, 2), 1 To j)
For k = LBound(ArrSrc, 2) To UBound(ArrSrc, 2)
temp(k, j) = ArrSrc(i, k)
Next k
End If
Next i
If j > 0 Then Filtre = Application.Transpose(temp)
End Function
Sub Raz()
With ActiveSheet
If .ListObjects.Count > 0 Then .ListObjects(1).delete
End With
End Sub
Sub Restitution(tDatas)
With ActiveSheet
.Range("A1:F1").Value = Array("Année", "N°", "Statut", "Nom de l'affaire", "Chemin Complet", "Date")
.Cells(2, 1).Resize(UBound(tDatas), UBound(tDatas, 2)).Value = tDatas
.Columns.AutoFit
With .ListObjects.Add(xlSrcRange, .UsedRange, , xlYes)
.Name = "TableauOffre"
.TableStyle = "ExportDonne_x"
End With
End With
End SubJe suis content que ça marche enfin.
Non, je n'ai pas vraiment d'idée de la raison de cette différence entre les fichiers word et les autres...
Peux-tu essayer de modifier cette ligne dans la macro ListeFichiers :
t(6, n) = cDate(FileItem.DateCreated)Si ça ne marche pas, je regarderai de plus près.