Ne pas afficher chemin dans ListBox avec fichiers

Mi_

XLDnaute Occasionnel
Bonjour

Demain c'est la rentrée, yepeeeee.

Je voulais dire ouin ! :)

Bon. En attendant demain, je me torture avec le problème suivant:

J'ai un UserForm ordinaire avec un ListBox1 où s'affichent tous les fichiers Excel qui contiennent le mot 'Copie' dans le nom, du dossier/sous-dossiers C:\\Excel. Le code est:

Code:
Private Sub UserForm_Initialize()
Dim I As Long
   With Application.FileSearch
    .NewSearch
    .FileType = msoFileTypeExcelWorkbooks
    .LookIn = 'C:\\Excel'
    .Filename = '*Copie*'
    .SearchSubFolders = True
    .Execute
    With .FoundFiles
      For I = 1 To .Count
        ListBox1.AddItem .Item(I)
      Next I
    End With
  End With
End Sub

La question est comment faire pour:
1) Ne pas afficher dans ce ListBox1 le chemin complet des fichiers trouvé, mais seulement leur nom, en gardant la possibilité de lancer leur ouverture par Workbooks.Open ListBox1.Value (ou autre code alors)
2) Même chose mais pour l'extension .xls, ne pas l'afficher.

Je vous souhaite une bonne rentrée mais j'ai besoin de votre aide ! :)

Merci,
Mi_
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Bonjour Mi_, le Forum

J'ai eu à faire ceci il n'y a pas longtemps encore pour Sylvie Lien supprimé

Voici une version 'light' pour ta compréhension :


Option Explicit

Const ThePath As String = 'I:\MC_DEV\Apollo\'


Private Sub UserForm_Initialize()
Dim TabFilesFound As Collection
Dim FileName As String
Dim SearcherFile As FileSearch
Dim TabFileNamePath() As String
Dim i As Integer

Set SearcherFile = Application.FileSearch
With SearcherFile
  .NewSearch
  .FileType = msoFileTypeExcelWorkbooks
  .FileName = '*.xls'
  .LookIn = ThePath
  .SearchSubFolders =
False
  .Execute msoSortByFileName, msoSortOrderAscending
   
If .Execute > 0 Then
       
With .FoundFiles
           
For i = 1 To .Count
           
ReDim Preserve TabFileNamePath(1, 0 To .Count - 1)
                TabFileNamePath(0, i - 1) = Dir(.Item(i))
                TabFileNamePath(1, i - 1) = SearcherFile.FoundFiles(i)
           
Next i
       
End With
   
Else
        MsgBox 'Pas de Fichier trouvé dans ' & ThePath
       
Exit Sub
   
End If
End With
Set SearcherFile = Nothing

With Me.ListBox1
  .ColumnCount = 2
  .ColumnWidths = '1;0'
  .Column() = TabFileNamePath
End With
End Sub


Tu n'auras plus qu'a faire ceci pour ouvrir tes fichiers XLS :

Private Sub ListBox1_Click()
   
With Me.ListBox1
        Workbooks.Open .Column(1, .ListIndex)
   
End With
End Sub


Bon Dimanche
[ol]@+Thierry[/ol]
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Re Bonjour Mi_

Arf je n'avais pas vu :
2) Même chose mais pour l'extension .xls, ne pas l'afficher.

Voici la version qui le fera alors ;)

Option Explicit

Const ThePath As String = 'I:\MC_DEV\Apollo\'


Private Sub UserForm_Initialize()
Dim TabFilesFound As Collection
Dim TheFileName As String
Dim SearcherFile As FileSearch
Dim TabFileNamePath() As String
Dim i As Integer

Set SearcherFile = Application.FileSearch
With SearcherFile
  .NewSearch
  .FileType = msoFileTypeExcelWorkbooks
  .FileName = '*.xls'
  .LookIn = ThePath
  .SearchSubFolders =
False
  .Execute msoSortByFileName, msoSortOrderAscending
   
If .Execute > 0 Then
       
With .FoundFiles
           
For i = 1 To .Count
           
ReDim Preserve TabFileNamePath(1, 0 To .Count - 1)
            TheFileName = Dir(.Item(i))
                TabFileNamePath(0, i - 1) = Left(TheFileName, Len(TheFileName) - 4)
                TabFileNamePath(1, i - 1) = SearcherFile.FoundFiles(i)
           
Next i
       
End With
   
Else
        MsgBox 'Pas de Fichier trouvé dans ' & ThePath
       
Exit Sub
   
End If
End With
Set SearcherFile = Nothing

With Me.ListBox1
  .ColumnCount = 2
  .ColumnWidths = '100;0'
  .Column() = TabFileNamePath
End With
End Sub

RE Bon Dimanche
[ol]@+Thierry[/ol]
 

Mi_

XLDnaute Occasionnel
(Re)Bonjour _Thierry, le forum

Je viens de m'apercevoir que la procédure With Me.ListBox1 (ton code) a des éffets différents par rapport à ListBox1.AddItem .Item(I) que j'utilisais avant.

Avant, je mettait plusieurs CheckBox avec chacun un nom de fichier à trouver, et les fichiers s'ajoutaient ou s'enlevaient du ListBox en fonction de ce qui était coché ou pas coché. (mon but d'ailleurs)

Maintenant le ListBox ne garde QUE le résultat du dernier filtre/CheckBox, bien que d'autres CheckBox soyent cochés.

Existe-t-il un moyen de combiner tout ça ?

Excuse-moi d'être si 'récalcitrant'. :unsure:

Merci,
Mi_
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Re bonjour Mi_

Tu n'es pas 'récalcitrant' tu es juste un peu 'ça part dans tous les sens' !!!

Dans ton code initial il n'est fait référence à aucune CheckBox si je ne m'abuse, donc je vois mal comment pouvoir appliquer quelque chose qui n'existe pas dans la demande !! lol

En fait j'envoie un Tableau dans la ListBox en un bloc, donc tu ne pourras pas le Filtrer à ce moment là. Il te fudra intervenir dans la construction du Tableau en amont dans la procédure au moment immédiat après le ReDim Preserve TabFileNamePath mais du coup tu vas bousiller la dimension du Tableau qui ne sera plus dimensionner par rapport à FoundFiles .Count -1 mais à une autre inconnue que tu pourras matérialiser par un X = X + 1 ...

Comme ceci :
With .FoundFiles
   
For i = 1 To .Count
       
ReDim Preserve TabFileNamePath(1, 0 To .Count - 1)
        TheFileName = Dir(.Item(i))
           
If InStr(1, TheFileName, CheckBox1) <> 0 Then  'Exemple Bidon
                TabFileNamePath(0, i - 1) = Left(TheFileName, Len(TheFileName) - 4)
                TabFileNamePath(1, i - 1) = SearcherFile.FoundFiles(i)
           
End If
       
Next i
End With


Sinon c'est ailleurs que tu peux intervenir dans cette Ligne :
.FileName = '*.xls'

où tu peux passer
.FileName = '*' & CheckBox1' & '*.xls'


Bonne Soirée
[ol]@+Thierry[/ol]

Message édité par: _Thierry, à: 04/09/2005 18:55
 

Mi_

XLDnaute Occasionnel
Bonsoir _Thierry,

Merci de me supporter. :)

En fait je n'avais pas indiqué de CheckBox car je voulais juste le code d'initialisation de la ListBox dans l'USF, pour l'adapter à des divers besoins similaires (le Userform_Initialize, puis CheckBox1_Click, CheckBox2_Click et ainsi de suite). Mais c'était plus compliqué que je ne le pensais.

Donc maintenant je vais expliquer plus en détail:

Initialisation de l'USF: met dans le ListBox tous les fichiers comprenant le mot 'Toto' d'un dossier & sous-dossiers ;

CheckBox1: filtre 'Toto' et 'voiture' du même dossier/sous-dossiers

CheckBox2: filtre 'Toto' et 'maison' ...

CheckBox3: filtre etc etc.

Normalement, si on coche tous les CheckBox, on devait avoir dans ListBox le résultat du Userform_Initialize initial.


Donc il ne s'agit pas de concatener des noms (quoi que je retiens le code, ça pourrait servir) mais d'afficher dans ListBox plusieurs résultats à la fois, issus des filtres de plusieurs CheckBox.

Pour filtrer par 'Toto' et 'maison' j'utilise déjà .FileName = '*Toto*' & '*maison*'.


En espérant que tu ne t'es pas arraché les cheveux à cause de moi, je te souhaite une bonne soirée. :eek:

Merci,
Mi_
 

Mi_

XLDnaute Occasionnel
La question reste d'actualité, le premier code que j'utilisais était parfait du point de vue de l'ajout ou la suppresion des fichiers dans la ListBox, en fonction de ce qu'on cochais (différents filtres avec nom de fichiers), mais bien sûr, ne pouvait permettre le non-affichage du chemin et des extensions:
Code:
 Private Sub UserForm_Initialize()
Dim I As Long
   With Application.FileSearch
    .NewSearch
    .FileType = msoFileTypeExcelWorkbooks
    .LookIn = 'C:\\Excel'
    .Filename = '*Copie*'
    .SearchSubFolders = True
    .Execute
    With .FoundFiles
      For I = 1 To .Count
        ListBox1.AddItem .Item(I)
      Next I
    End With
  End With
End Sub
Et ouin donc ...
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Bonjour Mi_, le Forum

Et bien relis un peu mieux mon précédent Post...

C'est je pense que c'est comme je t'ai indiqué que tu pourras intervenir !

Un truc dans ce style

Dim TabSearchString(3) As String


If CheckBox1 = True Then
TabSearchString(1) = 'Zaza'
Else
TabSearchString(1) = 'Grrrrrrrrrrrrrrrrrrrrrrrrrrrrrr'
End If
If CheckBox2 = True Then
TabSearchString(2) = 'Toto'
Else
TabSearchString(2) = 'Grrrrrrrrrrrrrrrrrrrrrrrrrrrrrr'
End If
If CheckBox3 = True Then
TabSearchString(3) = 'Lulu'
Else
TabSearchString(3) = 'Grrrrrrrrrrrrrrrrrrrrrrrrrrrrrr'
End If

'Blah Blah le Reste de la Macro


With .FoundFiles
   
For i = 1 To .Count
       
For z = 1 To 3
           
ReDim Preserve TabFileNamePath(1, 0 To x)
            TheFileName = Dir(.Item(i))
               
If InStr(1, TheFileName, TabSearchString(z)) <> 0 Then
                    TabFileNamePath(0, x) = Left(TheFileName, Len(TheFileName) - 4)
                    TabFileNamePath(1, x) = SearcherFile.FoundFiles(i)
                    x = x + 1
               
End If
       
Next z
   
Next i
End With


Evidemment sans avoir refait ton Userform avec les Controls pour tester.

Bon Appétit
[ol]@+Thierry[/ol]


EDITION !!!

PS et d'ailleurs dans le code que tu as reposté, je ne vois toujours pas de CheckBox en jeu dedans... (?)

Message édité par: _Thierry, à: 05/09/2005 12:50
 

Mi_

XLDnaute Occasionnel
Bonsoir à tous,

_Thierry, tu m'aide beaucoup mais à mon grand désespoir, je n'arrive pas à mettre bout à bout tout ce que tu m'offre.

Tu me demandais où apparait le CheckBox dans tout mon bazar.
J'en ai attaché un fichier pour exemplifier, tu va voir c'est marrant mais ça fonctionne.

Si je ne demande trop, pourrais-tu critiquer en VBA mon truc ?

Merci (pour la ènième fois),
Mi_ [file name=exemple_20050906011914.zip size=13872]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/exemple_20050906011914.zip[/file]
 

Pièces jointes

  • exemple_20050906011914.zip
    13.5 KB · Affichages: 25

_Thierry

XLDnaute Barbatruc
Repose en paix
Bonjour Mi_, le Forum

Arf je n'avais pas vu que tu n'en avais pas encore fini avec ce TRuc, en fait je t'avais tout expliqué déjà, mais probablement je ne n'avais pas réalisé quelle usine à gaz c'était lol

Tien remplaces tout ton Private Module de UserForm par celui ci (et vires aussi la macro 'ReinitialiserUSF' dans le Module1...

Option Explicit

Const ThePath As String = 'I:\MC_DEV\Apollo\' '<<< A adjuster
Const SearchString1 As String = 'Toto' '<<< A adjuster
Const SearchString2 As String = 'Zaza' '<<< A adjuster
Const SearchString3 As String = 'Lulu' '<<< A adjuster


Private TabSearchString(3) As String

Private Sub UserForm_Initialize()
Re_Ini
End Sub
Private Sub CheckBox1_Click()
CheckBoxChecker
End Sub
Private Sub CheckBox2_Click()
CheckBoxChecker
End Sub
Private Sub CheckBox3_Click()
CheckBoxChecker
End Sub

Private Sub CheckBoxChecker()
TabSearchString(1) = IIf(Me.CheckBox1.Value = True, SearchString1, 'Grrrrrrrrrrrrrrrrrrr')
TabSearchString(2) = IIf(Me.CheckBox2.Value = True, SearchString2, 'Grrrrrrrrrrrrrrrrrrr')
TabSearchString(3) = IIf(Me.CheckBox3.Value = True, SearchString3, 'Grrrrrrrrrrrrrrrrrrr')
Re_Ini
End Sub


Private Sub Re_Ini()
Dim TabFilesFound As Collection
Dim TheFileName As String
Dim SearcherFile As FileSearch
Dim TabFileNamePath() As String
Dim i As Integer, x As Integer
Dim z As Byte



Set SearcherFile = Application.FileSearch
With SearcherFile
&nbsp; .NewSearch
&nbsp; .FileType = msoFileTypeExcelWorkbooks
&nbsp; .Filename = '*.xls'
&nbsp; .LookIn = ThePath
&nbsp; .SearchSubFolders =
False
&nbsp; .Execute msoSortByFileName, msoSortOrderAscending
&nbsp; &nbsp;
If .Execute > 0 Then
&nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
With .FoundFiles
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
For i = 1 To .Count
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
For z = 1 To 3
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
ReDim Preserve TabFileNamePath(1, 0 To x)
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; TheFileName = Dir(.Item(i))
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
If InStr(1, TheFileName, TabSearchString(z)) <> 0 Then
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; TabFileNamePath(0, x) = Left(TheFileName, Len(TheFileName) - 4)
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; TabFileNamePath(1, x) = SearcherFile.FoundFiles(i)
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; x = x + 1
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
End If
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
Next z
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
Next i
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
End With
&nbsp; &nbsp;
Else
&nbsp; &nbsp; &nbsp; &nbsp; MsgBox 'Pas de Fichier trouvé dans ' & ThePath
&nbsp; &nbsp; &nbsp; &nbsp;
Exit Sub
&nbsp; &nbsp;
End If
End With
Set SearcherFile = Nothing

With Me.ListBox1
&nbsp; .ColumnCount = 2
&nbsp; .ColumnWidths = '100;0'
&nbsp; .Column() = TabFileNamePath
End With
End Sub

Cette fois-ci c'est bon ça tourne j'ai testé, il ne te reste qu'à adapter les Constante et c'est tout.

Bon Aprèm
[ol]@+Thierry[/ol]
 

Mi_

XLDnaute Occasionnel
Bonjour _Thierry, le forum,

Ca y est, je commence à tenir ce que j'espérais. Il y a un hic mineur, car à l'initialisation de l'USF, chaque fichier est répété 3 fois dans le ListBox. Sinon les CheckBox fonctionnent à merveille.

Et une question: quel représente Grrrrrrrrrrr dans
TabSearchString(1) = IIf(Me.CheckBox1.Value = True, SearchString1, 'Grrrrrrrrrrrrrrrrrrr') ?

J'attache le fichier, avec ton code.

Il y aurait aussi la question comment faire pour rendre actif CheckBox4 ('cocher tout') sans que son manipulation ne déclanche pas une cascade non voulue dans les autres CheckBox.

En tout cas, merci 'très' beaucoup.
Mi_ [file name=exemple2_20050907182551.zip size=13960]http://www.excel-downloads.com/components/com_simpleboard/uploaded/files/exemple2_20050907182551.zip[/file]
 

Pièces jointes

  • exemple2_20050907182551.zip
    13.6 KB · Affichages: 29

_Thierry

XLDnaute Barbatruc
Repose en paix
Bonsoir Mi_, le Forum

Ah bon, mais je pense comprendre, mais là ça devient assez grave car, cette histoire si elle avait été expliquée clairement depuis le début aurait été déjà solutionnée... Pour l'instant pour ma part je n'ai pas le temps de tout refaire... Mais c'est vrai qu'il y a un bug conceptuel de ma part.

En système 'D' pour remédier fait ceci

Private Sub UserForm_Initialize()
TabSearchString(1) = SearchString1
TabSearchString(2) = SearchString2
TabSearchString(3) = SearchString3
Re_Ini
End Sub

Tu n'auras plus ce bug... Mais c'est un peu bordelique (LOL)

En clair pour ta compréhension ce que j'ai développé pour toi, en fait fonctionne correctement, mais maintenant ça devient un peu tordu avec cette histoire de CheckBox...

TabSearchString(1) = IIf(Me.CheckBox1.Value = True, SearchString1, 'Grrrrrr')

Ceci signifie que si la CheckBox1 est true on cherche 'Toto'
Si elle est fausse on cherche 'Grrrrrrr' qu'on ne trouvera pas LOL !!

Pour ta quatrième checkbox ceci t'aidera :
Private Sub CheckBox4_Click()
Dim ValBoolean As Boolean
Dim x As Byte

ValBoolean = IIf(Me.CheckBox4.Value = True, True, False)
&nbsp; &nbsp;
&nbsp; &nbsp;
For x = 1 To 3
&nbsp; &nbsp; &nbsp; &nbsp; Me.Controls('CheckBox' & x) = ValBoolean
&nbsp; &nbsp;
Next


End Sub


Allez je file
Bonne Soirée
[ol]@+Thierry[/ol]
 

Mi_

XLDnaute Occasionnel
Bonsoir le forum,

_Thierry, maintenant ça marche (bien évidemment). Où trouve-tu tant de patience pour des inconnus ? Il en faut une bonne dose notamment pour venir au bout d'un tel topic. Je regrette que j'ai pas bien posé la question depuis le début.

C'est Toto qui va être content: il va trouver sa voiture, sa maison et ses copines, tout ça d'un seul click svp. :)

Merci (n+1 fois).
Mi_
 

Discussions similaires