Bonjour vous tous nombreux qui fréquentez ce forum le dimanche soir
........................................................1
Je cherche à lister les fichiers d'un répertoire et de ses sous-répertoires en vue de l'insertion de ces fichiers dans une diapositive.
Avec Dir et pour un seul répertoire, (exemple de l'aide en ligne sur Dir à peine modifiée) l'insertion et la répartition des images dans la diapo se fait... les doigts dans le nez !
Le code qui fonctionne :
........................................................2
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
25 Sub InsèreLesFichiersDunRépertoireAvecDirSansProblèmeAucun() Dim rep As String, NomFich As String, NomRep(), i As Integer, Haut as integer, Gauche as integer rep = "C:\Code fluvial\1 - Les Panneaux d'Interdiction\" NomFich = Dir(rep) Haut = 0 Gauche = 0 Do While NomFich <> "" Debug.Print rep & NomFich ActiveWindow.Selection.SlideRange.Shapes.AddPicture(FileName:=rep & NomFich, LinkToFile:=msoFalse, SaveWithDocument:=msoTrue, Left:=Gauche, Top:=Haut, Width:=175, Height:=79).Select With ActiveWindow.Selection.ShapeRange .LockAspectRatio = msoFalse .Height = 80# .Width = 80# .Left = Gauche .Top = Haut End With If Gauche < 640 - 80 Then Gauche = Gauche + 82 Else Haut = Haut + 82 Gauche = 0 End If NomFich = Dir() Loop End Sub
Maintenant je liste les répertoires d'un répertoire avec Dir et tente d'insérer toutes les images de ces sous-répertoires (en un premier temps dans une même diapo)
Là, comme j'utilise une procédure paramétrée, Dir perd l'origine et ne liste que le premier sous-répertoire du répertoire principal et buggue pour le second.
Message d'erreur sur Dir() "Argument ou appel de procédure incorrect"
Le code suivant fonctionne donc pour le premier sous-répertoire ***
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 Sub Appel() Dim Rep As String, NomFich As String, Chemin As String Rep = "C:\Code fluvial\" NomFich = Dir(Rep, vbDirectory) Do While NomFich <> "" If NomFich <> "." And NomFich <> ".." Then Chemin = Rep & NomFich & "\" MsgBox Chemin ListerLesFichiersAvecDir Chemin End If NomFich = Dir() '*** et buggue ici pour le second *** Loop End Sub........................................................3
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 ListerLesFichiersAvecDir(Rep) Dim NomFich As String, NomRep(), i As Integer, Haut As Integer, Gauche As Integer NomFich = Dir(Rep) Haut = 0 Gauche = 0 Do While NomFich <> "" Debug.Print Rep & NomFich ActiveWindow.Selection.SlideRange.Shapes.AddPicture(FileName:=Rep & NomFich, LinkToFile:=msoFalse, SaveWithDocument:=msoTrue, Left:=Gauche, Top:=Haut, Width:=175, Height:=79).Select With ActiveWindow.Selection.ShapeRange .LockAspectRatio = msoFalse .Height = 80# .Width = 80# .Left = Gauche .Top = Haut End With If Gauche < 640 - 80 Then Gauche = Gauche + 82 Else Haut = Haut + 82 Gauche = 0 End If NomFich = Dir() Loop End Sub
A présent, je liste les répertoires en utilisant FSO et envoie les sous-répertoires en paramètre à la procédure ListerLesFichiersParOrdreAlpha.
Et là, sur la ligne encadrée par des "*" j'ai le message d'erreur "Shapes (unknown member) : Out of memory error" dès le premier fichier.
Je précise que si je supprime cette ligne ou ajoute une gestion d'erreurs, les fichiers de tous les sous-répertoires sont bien listés, leurs chemins sont corrects et complets dans la fenêtre exécution.
D'abord yakatester
Code corrigé
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 Sub Appel2() Dim fs As Scripting.FileSystemObject Dim Rep As String, Chemin As String, element As Object Set fs = New Scripting.FileSystemObject Rep = "C:\Code fluvial" For Each element In fs.GetFolder(Rep).SubFolders Chemin = element.Path 'Debug.Print Chemin ListerLesFichiersParOrdreAlpha Chemin & "\" Next element End Sub
Une explication me siérait assez, oui !
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 Sub ListerLesFichiersParOrdreAlpha(Chemin) Dim fs as object, i As Integer, Haut As Integer, Gauche As Integer Haut = 0 Gauche = 0 Set fs = Application.FileSearch With fs .LookIn = Chemin .FileType = 1 If .Execute(SortBy:=msoSortByFileName, _ SortOrder:=msoSortOrderAscending) > 0 Then For i = 1 To .FoundFiles.Count '*******La ligne qui fonctionne maintenant ActiveWindow.Selection.SlideRange.Shapes.AddPicture(FileName:=.FoundFiles(i), LinkToFile:=msoFalse, SaveWithDocument:=msoTrue, Left:=Gauche, Top:=Haut, Width:=175, Height:=79).Select '*************************** Next i Else MsgBox "Fichier pas trouvé, cékiennapa." End I End With End Sub
A défaut d'une solution
Bref, si vous voyez l'erreur, vous être bien gentil de m'en faire part.
Par avance, merci
PS - J'ai bien sûr une possibilité un peu lourde pour faire fonctionner la solution 2 en créant un tableau des sous-répertoires comme paramétre de la procédure ListerLesFichiersAvecDir mais je trouve pas ça beau et je perds le tri alpha que permet fso simplement.
Partager