VBA Liste fichiers dans un dossier : erreur

Bonjour,

En faisant de multiples recherches, notamment ici, sachant que je ne connais pas VBA mais en cherchant je finis par comprendre la logique, j'ai essayé de créer et adapter un fichier Excel qui, avec VBA, liste l'ensemble des fichiers d'un dossier défini et se met à jour automatiquement.

Lorsque le fichier de base fonctionnera, je tenterai de rajouter également des sous-dossiers (je précise, pour la suite ).

Explications avant le code :

A la première ouverture, le fichier demande quel dossier doit être "scanné", il me fait bien une liste de fichiers selon un format bien spécifié, format que je serai amené à modifier plus tard.

A la seconde ouverture du fichier, il est censé scanner de nouveau le dossier (qu'il a mis en mémoire à la cellule AA1) et se mettre à jour selon le rajout ou la suppression de fichier, hors j'ai un message d'erreur (Erreur d’exécution '9' L'indice n'appartient pas à la sélection).

En cliquant sur débogage, il me surligne une ligne bien spécifique, la cinquième en partant de la fin : MAJRepertoire .Cells(lig, 1), Sheets(.Cells(lig, 1).Value), Range("A3")

Je cherche depuis 2 heures

Merci d'avance pour votre aide (si je peux également avoir l'explication de mon erreur, c'est encore mieux ).

Option Explicit

'Rep : le répertoire à traiter contenant le chemin complet
'Wks : la feuille où écrire
'Cel : la 1èr cellule où écrire

Sub MAJRepertoire(Rep As String, Wsk As Worksheet, Cel As Range)
Dim Obj, RepP, F, Fich, P
Dim lig As Long, Col As Long, DerLig As Long, i As Long
Dim LigEcrire As Long, NbFichier As Long
Dim S As String, TB, TS, TP

    lig = Cel.Row: Col = Cel.Column
    With Wsk
        DerLig = IIf(.Cells(1, Col) = "", 1, .Cells(.Rows.Count, Col).End(xlUp).Row)

        If DerLig <= lig Then
            'Au cas ou la 1ère ligne ne serait pas à 1 et que le fichier est vide
            DerLig = lig - 1: LigEcrire = lig
        Else
            'Le fichier n'est pas vide, initialise la 1ère ligne où ajouter
            LigEcrire = DerLig + 1
        End If

        If Right(Rep, 1) <> "\" Then Rep = Rep & "\"
        Set Obj = CreateObject("Scripting.FileSystemObject")
        Set RepP = Obj.Getfolder(Rep)
        Set Fich = RepP.Files

        'Vérifie si des fichiers ont étés ajoutés.
        'Si non, sort de la sub
        If Fich.Count <= DerLig - lig + 1 Then Exit Sub

        Application.ScreenUpdating = False
        For Each F In Fich
            TB = Split(F.Name, ".")
            If UBound(TB) < 1 Then GoTo Passe
            On Error GoTo Passe
            'vérification si existe déjà
            For i = lig To DerLig
                If .Cells(i, Col) = TB(0) Then Exit For
            Next i
            If i > DerLig Then 'existe pas et l'ajoute
                TS = Split(TB(0), "-")
                TP = Split(TS(0), " ")
                If UBound(TS) < 2 Then GoTo Passe
                If UBound(TP) < 1 Then GoTo Passe
                Cells(LigEcrire, 4) = Trim(TS(2))
                Cells(LigEcrire, 2) = Trim(TP(1))
                Cells(LigEcrire, 1) = Trim(TP(0))

                 .Hyperlinks.Add Anchor:=.Cells(LigEcrire, 3), Address:= _
                    Rep & F.Name, TextToDisplay:=Trim(TS(1))
                    .Cells(LigEcrire, 5) = TB(1)
                  LigEcrire = LigEcrire + 1
             End If
Passe:
        Next
    End With

End Sub

Public Sub InitNvRep()
Dim Rep As String, Nom As String
Dim LigAjout
        Rep = SelectionRep()
        If Rep = "" Then Exit Sub
        With Sheets("Soir")
            LigAjout = IIf(.[A1] = "", 1, .Cells(Rows.Count, 1).End(xlUp).Row + 1)
            .Cells(LigAjout, 27) = Rep
        End With

        MAJRepertoire Rep, Sheets("Soir"), Range("A3")

End Sub
'Sélectionner le chemin par boite de dialogue
Function SelectionRep() As String
Const ssfTous = &H1
Dim S As String
Dim objShell As Object, objFolder As Object, oFolderItem As Object
    Set objShell = CreateObject("Shell.Application")
    Set objFolder = objShell.BrowseForFolder(&H0&, "Choisir un répertoire", ssfTous)
    On Error Resume Next
    Set oFolderItem = objFolder.Items.Item
    'S = oFolderItem.Path
    SelectionRep = oFolderItem.Path
    Set objShell = Nothing
    Set objFolder = Nothing
    Set oFolderItem = Nothing
End Function

Sub Ouvrir()
Dim lig As Long
    With Sheets("Soir")
        If .[AA1] = "" Then 'pas encore de répertoire initialiser
            InitNvRep
        Else
            For lig = 1 To .Cells(Rows.Count, 1).End(xlUp).Row
                MAJRepertoire .Cells(lig, 1), Sheets(.Cells(lig, 1).Value), Range("A3")
            Next lig
        End If
    End With
End Sub

Bonjour Matrimoni le forum

oui c'est normal!! il manque deux parenthèses

a+

Papou

MAJRepertoire .Cells(lig, 1), Sheets(.Cells(lig, 1).Value), Range("A3")

tu remplaces par ci-dessous

MAJRepertoire(.Cells(lig, 1), Sheets(.Cells(lig, 1).Value), Range("A3"))

Re Bonjour Matrimoni le forum

tu parlais de sous dossier, alors voilà je t'ai fait une macro qui te fera la liste de tous les dossiers et fichiers contenu dans ceux -ci

la seule chose pour mettre à jour c'est de cliquer sur créer la liste.

1) tu mets ce fichier dans le dossier que tu souhaites traiter et tu auras toute la liste

2) je t'ai conservé les liens hypertexte avec le nom du fichier cible

a+

Papou

5matrimoni-v1.xlsm (24.47 Ko)

Merci beaucoup pour l'explication.

Je teste également ton fichier et je vais regarder ce que t'as mis dans les codes pour comprendre le fonctionnement.

Edit 1 : j'ai remplacé la ligne par ce que tu m'as recommandé, j'ai une erreur de syntaxe dès l'ouverture du fichier, il ne propose même plus un dossier à analyser à la première ouverture du fichier.

Bonjour Matrimoni le forum

passe ton fichier avec les explications et je te modifierai cela

a+

Papou

Le voici.

Petite explication du fichier :

A partir de la ligne 3, il est censé me lister tous les fichiers situés dans le dossier choisi à la première ouverture.

S'il peut lister également les fichiers situés dans les sous-dossiers sans marquer de différences à l'affichage, c'est encore mieux.

Il conviendra donc à l'utilisateur de bien garder une copie vierge du fichier pour pouvoir l'utiliser dans différents dossiers.

Le dossier choisi est affiché à la cellule "AA1".

Les cellules "F3:V99" seront remplis par les utilisateurs en y mettant des X, si je trouve comment faire des croix à cocher sans que ça fasse bidouillage, ce sera encore mieux.

Concernant les cellules "A3:E99", il permet la découpe des noms de fichiers.

Edit : J'étais parti lundi sur une norme, j'avais réussi à le faire fonctionner mais hier on m'a donné une nouvelle norme :

Date_Service_Priorité_Titre.extension

J'aurai donc des fichiers nommés ainsi, par exemple :

20200326_Compta_Haute_Achat fourniture.pdf

20200326_Achat_Basse_Formulaire reception.docx

J'ai réussi à faire la découpe de fichier, il ne reste que la mise à jour du fichier à la n-ième ouverture et éventuellement la prise en compte de sous-dossiers sans affecter l'affichage pour l'utilisateur.

Bonsoir Matrimoni le forum

à la lecture de ta macro pour fonctionner il faut au minimum avoir des noms de fichier avec 3 points !!!!!

petite précision que tu aurais pu donner!!!

merci de me fournir un dossier avec justement ces noms de fichier(même si les fichiers sont vides)

a+

Papou

Bonsoir,

Tu penses qu'il y a un rapport avec le bug ?

La partie qui va chercher le fichier et l'affiche en plusieurs colonnes fonctionne très bien, mais au cas où voici un fichier correctement nommé pour le futur (tu peux l'ouvrir, c'est d'actualité ou presque )

Au cas où je te remets également le fichier qui fonctionne, seule la mise à jour automatique ne fonctionne pas, le mode débogage amenant à la ligne citée dans le premier post.

Je t'en remercie encore.

Matri

Bonjour Matrimoni le forum

1) ton dossier en retour, tu le décompresses sur ton bureau, tu ne l'ouvres surtout pas en temporaire

2) tu ouvres test matrimoni v4

3) tu cliques mise à jour

4) tu ajoutes des fichiers dans le dossier choisi et tu recliques mise à jour

et tu me redis

a+

Papou

PS: Par contre une certitude ton fichier n'a jamais pu fonctionner avant, c'est certain !!!

2matrimoni-v4.zip (111.55 Ko)

Bonjour Papou,

Je te remercie, ton fichier fonctionne.

Comme le fait de devoir appuyer sur un bouton me gène mais que la mise à jour fonctionne, j'ai regardé tes modification dans la partie "Ouvrir" et en l'appliquant sur mon fichier, c'est à dire supprimer 2 de mes lignes et rajouter ta ligne, ça fonctionne comme je le voulais dès le départ

Pourquoi mon fichier ne devrait pas pouvoir fonctionner ?

Je le mets ci-dessous avec les fichiers exemple, j'ai repris ma base en y incorporant ta modification, tout est automatisé.

Petit hic mais là ce n'est pas méchant, que ce soit sur ta version ou la mienne, les mises à jour ne prennent pas en compte la suppression des fichiers, seulement les rajouts. C'est sûrement une limite d'Excel.

Bien à toi

Matrimoni

3matrimoni-v5.zip (113.43 Ko)

Ré matrimoni le forum

Bah non ta demande était un ajout et non un ajout et suppression!!!!

Donc j’ai répondu à ta demande ni plus ni moins

A plus

Papou

Bonjour Matrimoni le forum

bon maintenant je suis sur mon PC, et je peux te répondre, car de mon téléphone pas possible.

Alors tu prétends que ton fichier fonctionne??

Pas du tout, ou alors le tableau que tu as envoyé avec les Colonnes F à V ne servent à rien !!!!

Pour moi ton fichier est un fichier pour mémoriser, qui a fait quoi, avec tel ou tel autre fichier.

Maintenant avec ta version j'aimerais que:

1) tu remplissent tes cases fictivement de colonne F G H par exemple pour les lignes existantes,

2) en notant bien quel est la ref de ton fichier par ligne en colonne W par exemple

3) que tu supprimes une ligne au milieu de ta liste

4) tu mets à jour avec tes modifications !!!!

5) tu regardes si les notes dans les colonnes correspondent toujours et là Oh merveille la nouvelle ref à la mise à jour va venir s'incorporer dans la liste et décaler d'autant la suite des lignes

Bilan bah plus aucune des notes de tes colonnes F à V ne va être en face de ta référence de fichier!!!

Je t'ai dis que ton fichier ne fonctionnait pas, car moi j'ai rajouté une colonne, et le chemin complet du fichier et si la référence n'existe pas, elle est ajoutée à la liste mais ne fout pas en l'air la liste existante.

Voilà monsieur j'automatise en changeant une ligne, alors que la macro au dessus est complètement différente.

Maintenant si tu fais la même chose avec le fichier que je t'ai envoyé, tu verras que l'historique sera conservé, et que la ligne que tu auras supprimé est bien rajoutée en dernière ligne de ta liste.

Et je maintien et persiste à te dire que ton fichier n'a donc jamais fonctionné correctement

bon test

bon weekend

a+

Papou

Re Matrimoni le forum

Voilà la version V7qui elle permet de supprimer des lignes si le fichier n'existe plus, et surtout de conserver l’historique correctement des autres lignes ( car en fait ta macro de base ne sais pas faire des ajouts mais recompose la liste des fichiers dans son intégralité sans tenir compte des fichiers déjà présent dans la liste de ta feuille Soir)

1) décompresser le dossier sur ton bureau ne surtout pas l'ouvrir en temporaire

2) ouvrir Test_Matrimoni V7.xlsm

3) tester avec des ajouts et des suppressions

ET SANS BRICOLAGE DU STYLE ON MODIFIE QUE UN BOUT DE LA MACRO (bah là on sera tranquille il n'y a plus qu'une macro unique)

Il faut prendre la macro dans sont ensemble donc le module complet !!

Cette version est plus simple pas de sélection de Dossier, tu mets simplement le fichier test_Matrimoni V7 dans le dossier à traiter et tu l'ouvres, tous les fichiers composés de 3 "_" seront mis à jours ou créés

a+

Papou

PS: Non pour le ci-dessous tout est possible la V7 va te le prouver

la suppression des fichiers, seulement les rajouts. C'est sûrement une limite d'Excel.

13matrimoni-v7.zip (112.74 Ko)

Bonjour,

Je ne comprends pas vraiment le pourquoi de ton énervement, tu t'en prends à moi avec les colonnes F à V alors que j'ai bien dit, dès le départ, "Les cellules "F3:V99" seront remplis par les utilisateurs en y mettant des X, si je trouve comment faire des croix à cocher sans que ça fasse bidouillage, ce sera encore mieux", donc en français ça veut bien dire que les utilisateurs mettront des "X" dans les cellules, donc en terme de macro, oui, elles ne servent à rien.

Sur la ligne A d'ailleurs, c'est marqué "Chefs de service", donc ça sous-entend bien qu'il y a 12 chefs de service qui mettront des X face aux notes qu'ils traitent.

Je ne remets aucunement tes compétences en question, je cherche à comprendre ce que t'as fait pour faire fonctionner mon idée de base.

Et je persiste et je signe, sur ce que je veux, mon fichier fonctionne, jusqu'au prochain problème où je veux comprendre où je me suis planté.

Alors peut-être de manière complètement non rationnelle, mais il fonctionne. Et dans ce cas c'est ce côté non rationnelle que je souhaite comprendre.

Si une connerie en rattrape une autre, alors j'ai de la chance, mais la chance n'est pas signe de qualité et de fonctionnement dans le temps.

Pourquoi t'aurais-je mis un défi alors que dès le départ je précise que je me colle à du VBA pour la première fois, je n'ai pas la prétention de dire que je sais tout et que t'es un nul, d'ailleurs ici je suis le nul.

Alors oui, j'ai testé mon fichier car tu m'intrigues, avec le fichier V5 :

A la première ouverture, il me demande quel dossier analyser

Il liste directement les fichiers présents et découpe les noms à chaque _

A la réouverture, il scanne de nouveau le dossier :

  • Si un fichier est nouveau, il le rajoute
  • Ceux qu'il a déjà, il n'y a pas de rajout
  • Les fichiers supprimés, il n'est pas capable de les supprimer (donc oui, je dis aussi ce qu'il ne va pas avec mon fichier).

J'ai essayé de supprimer une ligne directement dans le fichier, à l'ouverture il retrouve le fichier et le remet à la ligne où il était car il doit y avoir un tri alphabétique automatique donc oui, je te rejoints, si un fichier est rajouté en cours de journée ça va mettre un sacré bordel.

C'est en faisant des conneries qu'on apprend, pas en se faisant engueuler.

Pourquoi je ne veux pas de bouton : ces pages seront imprimées, on recherche un système qui fasse tout sans qu'on le lui demande car si on ouvre ce fichier, c'est que l'on veut la liste des fichiers sinon on ne l'ouvre pas.

Alors oui, l'économie d'un clique, si je peux l'avoir, je le prends.

Ce n'est pas parce qu'on ne s'est pas compris sur le besoin que je suis un branleur ascendant gros connard, je me suis peut-être mal exprimé sur certains points mais t'as aussi très mal assimilé ce que j'ai pourtant bien expliqué.

Je tiens quand même à te remercier pour l'aide, je vais essayer de comprendre ce que t'as fait dans le fichier V7 pour voir ce que j'ai foiré de mon côté en balbutiant dans les codes.

Bonne soirée,

Matrimoni

Re,

Vu le pavé, je préfère un nouveau message.

Ton fichier fonctionne très bien.

Toutefois l'ouverture des fichiers via le lien ne fonctionne plus.

Plutôt que de te critiquer, j'ai préféré chercher et comprendre le pourquoi.

Je me suis permis de modifier une ligne et ça fonctionne sans enlever d'autres fonctions.

Voici la ligne telle que tu me l'as envoyée :

.Hyperlinks.Add Anchor:=.Cells(lig, 4), Address:= _

adr & f.Name, TextToDisplay:=Trim(bb(3))

Telle que je l'ai mise :

.Hyperlinks.Add Anchor:=.Cells(lig, 4), Address:= _

f.Name, TextToDisplay:=Trim(bb(3))

Est-ce bon ou j'ai fait une connerie qui fonctionne par chance ?

Bonne soirée,

Matrimoni

Bonjour Matrimoni le forum

C'est en faisant des conneries qu'on apprend, pas en se faisant engueuler.

(c'est effectivement ce que les ingénieurs de Tchernobyl se disaient)

Je n'ai engueuler personne, j'ai simplement expliqué ce que manifestement tu n'avais pas compris!

Maintenant ne t'inquiète pas, je ne te répondrai plus comme cela tu n'auras plus le sentiment d'être engueulé.

Néanmoins hélas pour toi j'ai raison sur le sujet.

donc en français ça veut bien dire que les utilisateurs mettront des "X" dans les cellules, donc en terme de macro, oui, elles ne servent à rien.

(hélas pour toi c'est déterminant justement)

Oui mais s'ils mettent des croix, ou tout autre choses, le but est bien de savoir si oui ou non, ils ont vu ou eu le rapport, ou le fichier?

donc le but est bien de pouvoir conserver un historique, même si on ajoute ou supprime un fichier.

Et je n'ai jamais dit que ces croix sont importantes pour les macros, elles sont à mon sens importantes pour que l'historique reste réel et non erroné, d’où mon insistance pour mettre en évidence le problème de ta macro de départ.

Donc ces croix sont effectivement importantes dans la conception de la macro, afin de tenir compte de l'ordre des fichiers et non pas de recréer systématiquement une liste classée Alpha.

Alors quand je lis j'ai modifié la macro pour ne prendre qu'une ligne, sans même regarder si la macro a ou non changée, je me dis que le demandeur ne comprends pas, alors j'insiste, et ensuite ce demandeur qui ne comprend hélas pas, m'accuse de l’engueuler!!

mais t'as aussi très mal assimilé ce que j'ai pourtant bien expliqué.

oui tu as expliqué, mais comme tu ne lis pas les réponses que l'on te fait, cela fait du répondeur quelqu'un qui ne comprend rien.

Ou peut-être que j'ai justement compris l'utilisation de ton fichier, et que j'ai essayé de te le faire comprendre? Pour t'éviter de générer des erreurs dans tes impressions.

bonne journée

Papou

Rechercher des sujets similaires à "vba liste fichiers dossier erreur"