Trouver les fichiers en mode dynamique ?

alucard_xs

XLDnaute Occasionnel
Bonjour,

voilà je cherche à lister (pour plus tard les manipuler) tout les fichiers .xls que j'ai dans un repertoire, pour cel j'ai donc mis une boite de choix, pour cibler son repertoire, ensuite il m'indique le nom du repertoire que je veux scanner, par contre je n'arrive pas à dénombrer et à afficher les fichiers xls qui sont présents dans ce repertoire, j'ai bien trouver comment afficher et compter des fichiers .xls dans un repertoire donner mais je n'arrive pas à joindre les deux programmes, afin que mon nom de repertoire soit variable ... pour le moment il m'insique et me marque les fichiers présents dans N: et pis c'est tout ...

Merci de m'aider

voci mon code :
-----
Code:
sub essai1212()
choix = ChoixDossierFichier("d:\09OfficeVBA", 1) '<- ici le chemin de ton choix
If choix <> "" Then MsgBox choix
    
Dim p As String, x As Variant
p = "N:/*xls"
x = GetFileList(p)
Select Case IsArray(x)
Case True 'files found
MsgBox UBound(x)
Sheets("feuil1").Range("A:A").Clear
For i = LBound(x) To UBound(x)
Sheets("feuil1").Cells(i, 1).Value = x(i)
Next i
Case False 'no files found
MsgBox "No matching files"
End Select
End Sub

-----
Function ChoixDossierFichier(Racine, Optional SelType As Byte = 0)
Dim objShell, objFolder, Chemin, SecuriteSlash, FlagChoix&, Msg$

    If SelType = 0 Then
      FlagChoix = &H1&: Msg = "Choisissez un dossier :"
    Else
      FlagChoix = &H4000&: Msg = "Choisissez un fichier :"
    End If
                                            
    Set objShell = CreateObject("Shell.Application")
    'le troisième paramètre permet de choisir
    'la s&eacute;lection d'un dossier ou d'un fichier (0 ou 1)
    'le dernier paramètre permet de choisir le dossier racine
    Set objFolder = objShell.BrowseForFolder(&H0&, Msg, FlagChoix, Racine)
    On Error Resume Next
    Chemin = objFolder.ParentFolder.ParseName(objFolder.Title).Path & ""
    If objFolder.Title = "Bureau" Then
        Chemin = "C:\Windows\Bureau"
    End If
    If objFolder.Title = "" Then
        Chemin = ""
    End If

    SecuriteSlash = InStr(objFolder.Title, ":")

    If SecuriteSlash > 0 Then
        Chemin = Mid(objFolder.Title, SecuriteSlash - 1, 2) & ""
    End If
    ChoixDossierFichier = Chemin
End Function


'==================


Function GetFileList(FileSpec As String) As Variant
' Returns an array of filenames that match FileSpec. ' if no matching files are found, it returns false
Dim Filearray() As Variant, Filecount As Integer
Dim Filename As String

'On Error Goto NoFilesFound Filecount = 0
Filename = Dir(FileSpec)
If Filename = "" Then GoTo NoFilesFound

' loop until no more matching files are found
Do While Filename <> ""
    Filecount = Filecount + 1
    ReDim Preserve Filearray(1 To Filecount)
    Filearray(Filecount) = Filename
    Filename = Dir()
Loop
GetFileList = Filearray
Exit Function ' Error handler
NoFilesFound:
GetFileList = False
End Function
 
Dernière édition:

_Thierry

XLDnaute Barbatruc
Repose en paix
Re : Trouver les fichiers en mode dynamique ?

Bonjour Alucard_XS, Épaf, MJ13, les amis et amies du Forum

En effet le code "tel-quel" d'Épaf contient une erreur aussi si je le fais tourner chez moi...

Par contre, j'ai eu souvent besoin de faire le genre de travail que tu demandes, et bien que j'utilise aussi une Objet Shell "BrowseForFolder" suivi d'un simple Application "FileSearch", il semble que je passe mes arguments entre les deux d'une manière plus "blindée".

Pour BrowserForFolder, il faut connaître un petit peu les paramètres nécessaires à son bon fonctionnement :

ObjShell.BrowseForFolder(0, Prog, True, TheDrive)

Le premier paramètre 0 pour le "handle" de la fenêtre qui va "surgir" (toujours zéro, ou en HexaDecimal qui me parraît toujours aussi chinois à lire)

Le second paramètre Prog pour le message que l'on veut faire passer dans le Pop-Up


Le troisème paramètre True (ou -1) est une option pour éviter de laisser la possibilité à l'utilisateur d'avoir le bouton "New Folder" ou "Créer un Nouveau Dossier" puisqu'inutile dans le cas présent où l'on cherche des dossiers existants (mettre à False ou 0 pour avoir ce choix)

Pour le quatrième et dernier paramètre TheDrive il permet de placer le Browsing sur le Drice ou le Chemin de départ, je le place en Constante (Private Const) en top de module (comme pour les autres constantes)

Voilà pour démystifier un peu ce "BrowseForFolder".

En ce qui concerne le "FileSearch" il est très simple d'emploi pour peu que l'on lise comme suit :

Set SearcherFile = Application.FileSearch = Creation de L'objet
With SearcherFile
.NewSearch = Initialisation
.Filename = ArgTheFilter = La Constante "*.xls" pour filter sur un type de fichier)
.LookIn = ArgThePath = L'Argument du Chemin passé par la Function BrowseForFolder
.SearchSubFolders = False = Si on place à true, on va remonter aussi les fichiers des sous répertoires
.Execute msoSortByFileName, msoSortOrderAscending
= On passe les option de Tri, et d'Ordre dans l'exécution.


Voilà c'est pas plus sorcier pour les principes de base, évidemment il y a besoin d'une certaine maîtrise de VB, VBA pour ensuite mettre le tout ensemble, j'ai essayé d'être propre dans la Démo ci-jointe qui, j'espère, sera utile à tout les visiteurs et visiteuses.

Je pense que tu seras content alucard_xs car j'ai également préparé une surprise pour la suite de ton projet de programme que je te laisse découvrir...

Bon Week End
@+Thierry


EDITION : Bonjour aussi à Stapple
PS : DEMO Réalisée sous Office 2003, ça m'interresserait de savoir si elle passe sous 2007
 

Pièces jointes

  • XLD_BrowseForFolder_FileSearch_Hyperlinks_V01.zip
    16 KB · Affichages: 44
Dernière édition:

Épaf

XLDnaute Occasionnel
Re : Trouver les fichiers en mode dynamique ?

Dans mon code, tu le sélectionnes dans la boîte de dialogue qui s'affiche... En outre, les noms placés dans Feuil1 incluent le chemin. Donc cette question ne s'adresse pas à moi. Mais je pense que
myPath = RépertoireDuDépart & InputBox("Répertoire?")"
ou
myPath = RépertoireDuDépart & " \" & InputBox("Répertoire?")"
devrait régler ton pb
@+
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Re : Trouver les fichiers en mode dynamique ?

Re bonjour à tous

Oups, dans la Démo disponible ci-dessus, j'ai laissé ma constante comme suit lors de mes derniers tests...

Private Const FileType As String = "*.DOC"

Il est clair que l'on peut la remettre à "*.XLS " pour des Fichiers Excel ou encore "*.*" pour tout remonter


Bien à vous

@+Thierry
 

alucard_xs

XLDnaute Occasionnel
Re : Trouver les fichiers en mode dynamique ?

oui oui merci Thierry j'avais corrigé.
sinon j'ai mis

myPath = chemin

ça a l'air de passer par contre, ce qui serait bien c'est que ça me traite les fichiers contenus dans ce fameux "chemin" en fond de tâche et que ça me laisse ma feuil1 avec mes fichiers présents qu'on avait tout à l'heure.
 

Épaf

XLDnaute Occasionnel
Re : Trouver les fichiers en mode dynamique ?

Je pense avoir trouvé le pb.
Dans mon code, tu as
Code:
With fs
    .LookIn = chemin
    .FileType = msoFileTypeExcelWorkbooks
Teste en remplaçant msoFileTypeExcelWorkbooks par 1 => Liste tous les fichiers du répertoire.
3 liste les .doc et 4 les .xls
Ce qui donne
Code:
With fs
    .LookIn = chemin
    .FileType = 1 ' tous les fichiers
C'est un peu fort que ça ne fonctionne que chez moi. Et ma réponse correspond très exactement à ton pb : Choix du répertoire dans une liste -> Liste des fichiers de ce répertoire dans Feuil1 -> Ouverture du fichier sélectionné. Testé.
@+
 

Épaf

XLDnaute Occasionnel
Re : Trouver les fichiers en mode dynamique ?

Ok, alors maintenant, teste avec 4
Pour le code à placer "derrière" la feuil1, j'ai modifié afin qu'il n'y ait pas d'erreus si tu sélectionnes la colonne ou plusieurs cellules.
Code:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
If Target.Column <> 1 Then Exit Sub 'limité à colonne 1
If InStr(Target.Address, ":") <> 0 Then Exit Sub 'sélection de plusieurs cellules
If MsgBox("Ouvrir le fichier " & Target, vbYesNo, "Ouvrir un fichier") = vbYes Then _
    Workbooks.Open Target
End Sub
Tu corriges ;)
@+
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Re : Trouver les fichiers en mode dynamique ?

Re Bonjour

oui oui merci Thierry j'avais corrigé.
sinon j'ai mis

myPath = chemin

ça a l'air de passer par contre, ce qui serait bien c'est que ça me traite les fichiers contenus dans ce fameux "chemin" en fond de tâche et que ça me laisse ma feuil1 avec mes fichiers présents qu'on avait tout à l'heure.


Pour tenter de répondre à cette question voici une version II..., mais je ne suis pas sûr d'avoir compris toute la portée de ta question lol !!

Et puis ce fil part un peu dans tous les sens avec des bouts de codes à droite et à gauche, je refais plutot une démo ...

Bien à Vous
@+Thierry
 

Pièces jointes

  • XLD_BrowseForFolder_FileSearch_Hyperlinks_V02.zip
    14.2 KB · Affichages: 51

jeanpierre

Nous a quitté
Repose en paix
Re : Trouver les fichiers en mode dynamique ?

Salut à tous le fil, _Thierry, le forum,

Sous 2007, je ne sais pas...

Mais pour dire que c'est encore du très beau et bon travail.

Cela va m'être utile....

Merci donc à _Thierry.

Bonne fin de week-end.

Jean-Pierre
 

alucard_xs

XLDnaute Occasionnel
Re : Trouver les fichiers en mode dynamique ?

par contre THierry, dans ton fichier, est-ce normal de ne pas pouvoir rajouter de boutons ? j'ai essayé d'en mettre quelques uns via la commande simple du genre

Code:
Private Sub CommandButton1_Click()
Unload UserForm1
End Sub

en rajoutant bien sur une fenetre + bouton dans le userform mais pas moyen de le faire afficher
 

Épaf

XLDnaute Occasionnel
Re : Trouver les fichiers en mode dynamique ?

Jolie la solution des liens... L'idée ne m'était pas venue. :eek:
Thierry à dit:
Et puis ce fil part un peu dans tous les sens avec des bouts de codes à droite et à gauche, je refais plutot une démo ...
Facile... quand on arrive après la trentième réponse et que tout est débroussaillé ! :D
Ta solution va également me servir, j'adapterai les liens à mon code :rolleyes:
Bien cordialement
 

Discussions similaires

Statistiques des forums

Discussions
311 725
Messages
2 081 943
Membres
101 849
dernier inscrit
florentMIG