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-ID: 263724

Url: https://administrator.de/forum/excel-vba-filedialogmsofiledialogopen-filterung-nach-dateityp-und-filename-263724.html

Ausgedruckt am: 25.12.2024 um 02:12 Uhr

114757
114757 17.02.2015 aktualisiert um 22:14:00 Uhr
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
chef1568
chef1568 17.02.2015 um 22:29:38 Uhr
Goto Top
Hallo jodel32,

leider hat deine Änderung nichts bewirkt...

mfg
colinardo
Lösung colinardo 23.02.2015 aktualisiert um 14:49:54 Uhr
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
chef1568
chef1568 23.02.2015 um 14:51:38 Uhr
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
colinardo
colinardo 23.02.2015 aktualisiert um 15:42:39 Uhr
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
chef1568
chef1568 23.02.2015 um 19:46:23 Uhr
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