chef1568
Goto Top

Excel VBA, FileDialog(msoFileDialogOpen) - Filterung nach Dateityp UND Filename

Hallo Zusammen,

Ich möchte eine gewisse Vorfilterung bei der Dateiauswahl machen.
Hierzu sollte nach FileTyp und einem String im Dateinamen erfolgen. Leider funktioniert derzet nur eine dieser Optionen.

1. Bei untem gezeigtem Code wird nach dem Stringinhalt gefiltert - aber nicht die Dateiedung beachtet
2. wenn ich die Dateitypauswahl nutze ist die Stringfilterung wieder nicht aktiv.

Dim Path, Nummer As String

'Pfadauswahl  
Path = "C:\Users\Public\Documents\"  

'Nummernauswahl  
Nummer = ActiveSheet.Range("C7")  

'Öffne Auswahldialog  
With Application.FileDialog(msoFileDialogOpen)
    .AllowMultiSelect = False
    .Title = "Protokoll laden"  
    .Filters.Clear
    .Filters.Add "Protokoll", "*.xml", 1  
    .Filters.Add "Alle Dateien", "*.*"  
    '.InitialView = msoFileDialogViewDetails  
    .InitialFileName = Path & "*" & Nummer & "*"  
    If .Show Then
        XMLDATEI = .SelectedItems(1)
    End If
End With

wie kann ich beide Optionen realisieren?

Danke schonmal

Content-Key: 263724

Url: https://administrator.de/contentid/263724

Printed on: April 25, 2024 at 14:04 o'clock

Mitglied: 114757
114757 Feb 17, 2015 updated at 21:14:00 (UTC)
Goto Top
Moinsens,
Dim Path, Nummer As String

'Pfadauswahl  
Path = "C:\Users\Public\Documents\"  

'Nummernauswahl  
Nummer = ActiveSheet.Range("C7")  

'Öffne Auswahldialog  
With Application.FileDialog(msoFileDialogOpen)
    .AllowMultiSelect = False
    .Title = "Protokoll laden"  
    .Filters.Clear
    .Filters.Add "Protokoll", "*.xml", 1  
    .Filters.Add "Alle Dateien", "*.*"  
    .FilterIndex = 1
    .InitialFileName = Path & "*" & Nummer & "*" & ".xml"  
    If .Show Then
        XMLDATEI = .SelectedItems(1)
    End If
End With
Gruß jodel32
Member: chef1568
chef1568 Feb 17, 2015 at 21:29:38 (UTC)
Goto Top
Hallo jodel32,

leider hat deine Änderung nichts bewirkt...

mfg
Member: colinardo
Solution colinardo Feb 23, 2015 updated at 13:49:54 (UTC)
Goto Top
Hallo chef1586,
so wie jodel es geschrieben hat geht es nur wenn der Filter auf *.* steht, weil der Dialog sonst die Dateierweiterung am Ende entfernt.
Mit einem dirty Trick kannst du den Dialog trotzdem dazu zwingen das gewünschte zu machen (Namensfilter + FIlterauswahl), indem du die Dateierweiterung einfach verdoppelst
Dim Path, Nummer As String

'Pfadauswahl  
Path = "C:\Users\Public\Documents\"  

'Nummernauswahl  
Nummer = ActiveSheet.Range("C7")  

'Öffne Auswahldialog  
With Application.FileDialog(msoFileDialogOpen)
    .AllowMultiSelect = False
    .Title = "Protokoll laden"  
    .Filters.Clear
    .Filters.Add "Protokoll", "*.xml", 1  
    .Filters.Add "Alle Dateien", "*.*"  
    .FilterIndex = 1
    .InitialFileName = Path & "*" & Nummer & "*" & ".xml" & ".xml"  
    If .Show Then
        XMLDATEI = .SelectedItems(1)
    End If
End With
Grüße Uwe
Member: chef1568
chef1568 Feb 23, 2015 at 13:51:38 (UTC)
Goto Top
Genau das ist das was ich gesucht habe.
Danke Uwe!

Was ich allerdings nicht wirklich verstehen kann, da ich ja der Dateityp xml bereits als Filter definiert hatte - dieser aber nicht ausgewertet wird...

Mfg
Member: colinardo
colinardo Feb 23, 2015 updated at 14:42:39 (UTC)
Goto Top
Zitat von @chef1568:
Was ich allerdings nicht wirklich verstehen kann, da ich ja der Dateityp xml bereits als Filter definiert hatte - dieser aber
nicht ausgewertet wird...
Der Dateinamensfilter im Eingabefeld überschreibt den Dateitypfilter. Kannst du ganz einfach nachprüfen face-wink Und wenn dann dort als Name etwas steht wie *Nummer* anstatt *Nummer*.xml nimmt er alle Dateien mit der Nummer im Namen, egal welches Dateityps, ist leider so.

Grüße Uwe
Member: chef1568
chef1568 Feb 23, 2015 at 18:46:23 (UTC)
Goto Top
Hallo Uwe,

ja, das funktioniert alles super.
Aber bei vielen Elementen (>500) dauert es ziemlich lange, bis sich das Fenster zur Dateiauswahl erstmal öffnet.
Mir ist schon klar, dass auch das Script einige Zeit benötigt um die >500 Dateinamen zu zerlegen - aber gleich 2...3sec ist schon recht lange.

Gibt es da eine performantere Lösung?

mfg