Filtre sur GetOpenFilename

Mattharm

XLDnaute Occasionnel
Bonjour à tous,

J'essaie de mettre un filtre sur la fonction GetOpenFilename :

Code:
Fichier = Application.GetOpenFilename(FileFilter:="Fichier,*.txt", Title:="Choix du fichier")

Pour avoir tous les fichiers contenant "toto" j'ai essayé ça, mais ça ne fonctionne pas :

Code:
Fichier = Application.GetOpenFilename(FileFilter:="Fichier,*toto*.txt", Title:="Choix du fichier")

Une idée ?

Merci,
M.
 

Mattharm

XLDnaute Occasionnel
Re : Filtre sur GetOpenFilename

Bonjour Bruno,

Et comment inclue-t-on ce filtre dans ma syntaxe ?

J'ai essayé comme ça, mais ça ne fonctionne pas :

Code:
Fichier = Application.GetOpenFilename(FileFilter:=sFilter, Title:="Choix du fichier données")
 

Mattharm

XLDnaute Occasionnel
Re : Filtre sur GetOpenFilename

Je travaille sous 2000.... :)

Je l'ai tenté comme ça, ce qui ne filtre pas lorsque je mets ce qui est en rouge :

Code:
sFilter = "Fichier Données (*.txt)" & ",[COLOR="Red"]*mars[/COLOR]*.txt"
Fichier = Application.GetOpenFilename(FileFilter:=sFilter, Title:="Choix du fichier données")
 

escouger

XLDnaute Occasionnel
Re : Filtre sur GetOpenFilename

Bonjour,
J'ai le même souci, à savoir filtrer dans le GetopenFilename des fichiers XlS dont le nom commence par AAAA.
Je suis sous Windows 8 avec le pack office 2010.
Avez-vous trouvé une solution depuis que ce message a été ouvert?
Merci
Gérard
 
C

Compte Supprimé 979

Guest
Re : Filtre sur GetOpenFilename

Bonjour Escouger... whouaouuu ça c'est du déterrage de post ;)

L'instruction GetOpenFilename() ne peut pas utiliser de critères de filtre

Il faut utiliser une API windows pour le faire
Code:
Option Explicit

Private Declare Function GetOpenFileName Lib "comdlg32.dll" Alias _
         "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long


Private Type OPENFILENAME
  lStructSize As Long
  hwndOwner As Long
  hInstance As Long
  lpstrFilter As String
  lpstrCustomFilter As String
  nMaxCustFilter As Long
  nFilterIndex As Long
  lpstrFile As String
  nMaxFile As Long
  lpstrFileTitle As String
  nMaxFileTitle As Long
  lpstrInitialDir As String
  lpstrTitle As String
  flags As Long
  nFileOffset As Integer
  nFileExtension As Integer
  lpstrDefExt As String
  lCustData As Long
  lpfnHook As Long
  lpTemplateName As String
End Type


Sub test()
Dim sFilter$
  sFilter = "Classeurs Excel Spéciaux (AAAA*.xls)" & Chr(0) & "AAAA*.xls" & Chr(0)
  MsgBox GetFileName(sFilter, "D:\", "Essai")
End Sub


Function GetFileName(sFilter As String, sInitialDir As String, sTitle As String) As String
  Dim OpenFile As OPENFILENAME
  Dim lReturn As Long


  With OpenFile
    .lStructSize = Len(OpenFile)
    .lpstrFilter = sFilter
    .nFilterIndex = 1
    .lpstrFile = String(257, 0)
    .nMaxFile = Len(OpenFile.lpstrFile) - 1
    .lpstrFileTitle = OpenFile.lpstrFile
    .nMaxFileTitle = OpenFile.nMaxFile
    .lpstrInitialDir = sInitialDir
    .lpstrTitle = sTitle
    .flags = 0
  End With
  lReturn = GetOpenFileName(OpenFile)


  If lReturn = 0 Then
    GetFileName = ""
  Else
     GetFileName = Trim(OpenFile.lpstrFile)
  End If
End Function

Cordialement.
 
Dernière modification par un modérateur:

escouger

XLDnaute Occasionnel
Re : Filtre sur GetOpenFilename

Merci beaucoup çà marche très bien pour sélectionner un seul fichier.

De fait je souhaiterais sélectionner plusieurs fichiers répondant à ces critères.
Y-aurait-il encore un paramètre à rajouter (du même genre que la Propriété multiSelect de la fonction GetOpenFileName) pour obtenir un tel résultat.

Merci encore.

Gérard
 

escouger

XLDnaute Occasionnel
Re : Filtre sur GetOpenFilename

Merci de votre aide. J'ai trouvé la solution à mon problème. Voir ci-dessous:
Private Declare Function SetCurrentDirectoryA Lib "Kernel32" (ByVal lpPathName As String) As Long
Public Type OPENFILENAME
lStructSize As Long
hwndOwner As Long
hInstance As Long
lpstrFilter As String
lpstrCustomFilter As String
nMaxCustFilter As Long
nFilterIndex As Long
lpstrFile As String
nMaxFile As Long
lpstrFileTitle As String
nMaxFileTitle As Long
lpstrInitialDir As String
lpstrTitle As String
flags As Long
nFileOffset As Integer
nFileExtension As Integer
lpstrDefExt As String
lCustData As Long
lpfnHook As Long
lpTemplateName As String
End Type
Public Declare Function GetOpenFileName Lib "comdlg32.dll" Alias _
"GetOpenFileNameA" (pOpenFileName As OPENFILENAME) As Long
Public Const OFN_ALLOWMULTISELECT = &H200&
Public Const OFN_EXPLORER = &H80000
Public Const OFN_FILEMUSTEXIST = &H1000&
Public Const OFN_HIDEREADONLY = &H4&
Public Const OFN_PATHMUSTEXIST = &H800&
Dim messources(500) As String ' indice de 0 a 500



' _________________________________________________________________

Sub Import()
Application.ScreenUpdating = False
' saisir le nom du tableau à générer
Worksheets("recap").Select
Worksheets("recap").Activate
ctrerreur_file = 0
monfichierlu = ActiveWorkbook.Name
monfichier = InputBox("Entrer le nom du fichier récapitulatif souhaité", "FICHIER A GENERER")
monfichier = monfichier & ".xls"

If monfichier = monfichierlu Then
mesg0 = monfichier & " : Le fichier à créer porte le même nom que le fichier lu. STOP"
msg = mesg0
Style = vbAnnul
Title = "Fichier Recap déjà existant et ouvert "
response = MsgBox(msg, Style, Title)
' arreter la macro
Else


SetUNCPath "C:\XXX"
varout = monfichier

vardir = "C:\XXX"
ChDir (vardir)
' """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""

vartest = vardir & "\" & varout

' Test l'existence d'un fichier
Set objFSO = CreateObject("Scripting.FileSystemObject")
If objFSO.FileExists(vartest) Then
mesg1 = varout & " : Le fichier existe déjà, voulez-vous le remplacer ?"
msg = mesg1
Style = vbYesNo
Title = "Fichier Recap déjà existant "
response = MsgBox(msg, Style, Title)
If response = vbYes Then
' si oui deleter le fichier and le saveas
Set objFSO = CreateObject("Scripting.FileSystemObject")
objFSO.DeleteFile (vartest)
Else
' si non arreter la macro
ctrerreur_file = 1
End If

End If
If ctrerreur_file = 0 Then
' """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""
' préparation du fichier à générer
ActiveWorkbook.SaveAs Filename:= _
varout, FileFormat:= _
xlNormal, Password:="", WriteResPassword:="", ReadOnlyRecommended:=False _
, CreateBackup:=False
'sauvegarde du nom du document actif
Worksheets("recap").Select
Worksheets("recap").Activate
Range("G6:FS6").Select
Selection.ClearContents
Range("G8:FS8").Select
Selection.ClearContents
Range("G4:FS4").Select
Selection.ClearContents


'###########################################################################
'lecture des données du tableau
varlig = 4
Range("FW3") = 7
varcol = Range("FW3")
varcow = Range("fv3")
varadr = varcow & varlig

ActiveSheet.Unprotect
Application.ScreenUpdating = False
' ___________________________________________________________________
SetUNCPath "C:\CVS"
' maselection = InputBox("Voulez vous appliquer une sélection sur les noms des fichiers à traiter? ", "FICHIER A SELECTIONNER")
mesg1 = "Voulez vous appliquer une sélection sur les noms des fichiers à traiter? "
Style = vbYesNo
Title = "Fichiers à sélectionner "
response = MsgBox(mesg1, Style, Title)
If response = vbYes Then
maselection = InputBox("Entrer la sélection. (exemples 201408*RM1, ou 2014, ou 201408) ", "Début des noms des fichiers à sélectionner")
If maselection = "" Or maselection = "*" Then
sfilter = "Excel Files (*.xls), *.xls"
Else
' string de sélection
filt1 = "Classeurs Excel Spéciaux ("
filt2 = maselection
filt3 = "*.xls)"
filt4 = "*.xls"
sfilter = filt1 & filt2 & filt3 & Chr(0) & filt2 & filt4 & Chr(0)

End If

Else
' selection les fichiers XLS seulement
sfilter = "Excel Files (*.xls), *.xls"

End If

' ouverture de la fenetre de selection des fichiers et sauvegarde de leurs noms dans le tableau messources

Dim FileList As New Collection
Dim I As Long
Dim S As String

ShowFileOpenDialog FileList, sfilter
With FileList
If .Count > 0 Then

For I = 1 To .Count
' messources = messources + .Item(I) + vbCrLf
' stockage des noms de fichiers sélectionnés
X = I - 1
messources(X) = .Item(I)
Next
Msgfil = I & " Fichiers sélectionnés"
'MsgBox Msgfil
Else
MsgBox "aucun fichier n'a été sélectionné!"
I = 0
End If
End With

If I > 0 Then


'
' ______________________________________________________________________________
For I = LBound(messources) To X

'code pour l'import des données
'
Range(varadr).Select
varnam = messources(I)

ctrerr = 0
ctrtabl = 0
suffixe = Right(varnam, 4)




ctrtabl = ctrtabl + 1

mylen = Len(varnam) - 4
varfich = Left(varnam, mylen)
mylen = mylen - 7
varfich = Right(varfich, mylen)
' Afficher les messages d'alerte


DisplayAlerts = True


' ---------------------------------------------------
' stocker les "varnam" dans une zone reprise dans un onglet "composants"
'

Range(varadr) = varfich
varcol = varcol + 1
Range("FW3") = varcol
varcow = Range("fv3")
varadr = varcow & varlig






Next I

'________________________________________________________________________




ActiveSheet.Protect DrawingObjects:=False, Contents:=True, Scenarios:= _
False

Application.ScreenUpdating = True



vardir = "C:\XXX"
ChDir (vardir)

ActiveWorkbook.Save
'sauvegarde

DisplayAlerts = True
' MsgBox ("fin selection par fichier ")



End If
End If
End If ' fin en cas de nom du fichier lu = nom du fichier à créer
End Sub



' ______________________________________________________________________
Sub ShowFileOpenDialog(ByRef FileList As Collection, sfilter)
Dim OpenFile As OPENFILENAME
Dim lReturn As Long
Dim FileDir As String
Dim FilePos As Long
Dim PrevFilePos As Long
With OpenFile
.lStructSize = Len(OpenFile)
.hwndOwner = 0
.hInstance = 0
'.lpstrFilter = "Classeurs Excel Spéciaux (201407*.xls)" & Chr(0) & "201407*.xls" & Chr(0)
.lpstrFilter = sfilter
.nFilterIndex = 1
.lpstrFile = String(4096, 0)
.nMaxFile = Len(.lpstrFile) - 1
.lpstrFileTitle = .lpstrFile
.nMaxFileTitle = .nMaxFile
.lpstrInitialDir = "C:\CVS"
.lpstrTitle = "Multi Select Drawings"
.flags = OFN_HIDEREADONLY + _
OFN_PATHMUSTEXIST + _
OFN_FILEMUSTEXIST + _
OFN_ALLOWMULTISELECT + _
OFN_EXPLORER
lReturn = GetOpenFileName(OpenFile)
If lReturn <> 0 Then
FilePos = InStr(1, .lpstrFile, Chr(0))
If Mid(.lpstrFile, FilePos + 1, 1) = Chr(0) Then
FileList.Add .lpstrFile
Else
FileDir = Mid(.lpstrFile, 1, FilePos - 1)
Do While True
PrevFilePos = FilePos
FilePos = InStr(PrevFilePos + 1, .lpstrFile, Chr(0))
If FilePos - PrevFilePos > 1 Then
FileList.Add FileDir + "\" + _
Mid(.lpstrFile, PrevFilePos + 1, _
FilePos - PrevFilePos - 1)
Else
Exit Do
End If
Loop
End If
End If
End With
End Sub

' ________________________________________________________________________________

'fonction qui modifie le chemin par défaut

Function SetUNCPath(sPath As String) As Long

Dim lReturn As Long

lReturn = SetCurrentDirectoryA(sPath)

SetUNCPath = lReturn

End Function
 

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
312 379
Messages
2 087 768
Membres
103 662
dernier inscrit
rterterert