Office: Excel 2007 - Application.GetOpenFilename - und - MultiSelect - 3 Fragen

Helfe beim Thema Excel 2007 - Application.GetOpenFilename - und - MultiSelect - 3 Fragen in Microsoft Excel Hilfe um das Problem gemeinsam zu lösen; Hallo Forum, in einer Anwendung öffne ich per VBA den Datei-Öffnen-Dialog. Diesmal ist es notwendig, dass der Anwender mehrere Dateien gleichzeitig... Dieses Thema im Forum "Microsoft Excel Hilfe" wurde erstellt von fette Elfe, 10. März 2012.

  1. fette Elfe Erfahrener User

    Excel 2007 - Application.GetOpenFilename - und - MultiSelect - 3 Fragen


    Hallo Forum,

    in einer Anwendung öffne ich per VBA den Datei-Öffnen-Dialog.
    Diesmal ist es notwendig, dass der Anwender mehrere Dateien gleichzeitig auswählen kann, die dann nacheinander abgearbeitet werden.

    Prinzipiell klappt dies auch mit dem folgenden Beispiel-Code:
    Code:
    Option Explicit
    
    Dim intCounter As Integer
    Dim var
    
    Private Sub CommandButton1_Click()
    
    ' Dateibrowser öffnen, Dateien auswählen lassen und nacheinander öffnen
        var = Application.GetOpenFilename(, , , , MultiSelect:=True)
        
        If Not TypeName(var) = "Boolean" Then
            For intCounter = LBound(var) To UBound(var)
                Workbooks.Open var(intCounter), ReadOnly:=False     ' öffnet Datei
            Next intCounter
        Else
            MsgBox "Es wurde keine Datei ausgewählt."
        End If
        
    End Sub


    Dazu habe ich aber noch folgende Fragen:

    1. Die Variable "var": Ich konnte nicht herausfinden als welchen Variablen-Typ diese definiert werden muss. Muss sie "Variant" bleiben, oder kann man sie spezifizieren? (Ich lege generell lieber den Variablen-Typ fest als mit "Variant" zu arbeiten, und außerdem lerne ich halt gerne....)

    2. Beim jetzigen Code müsste ich alles, was mit den ausgewählten Dateien passieren soll, innerhalb der "For intCounter"-Schleife aufrufen.
    Prinzipiell geht das, kann aber auch unerwünscht sein.
    Besteht eine Möglichkeit Variablen zu "verknüpfen", bzw. eine variable Anzahl einer Variable zu generieren?
    Damit meine ich: es wird eine String-Variable definiert die den Dateinamen aufnehmen soll.
    Code:
    Dim strQuellName As String
    Da aber die Anzahl der ausgewählten Dateien jetzt noch unbekannt ist und variabel sein muss, müsste noch ein Zähler dazu damit man durch das mehrfache durchlaufen der "For intCounter"-Schleife die Variablen:"strQuellName1", "strQuellName2" usw. erhält, und so später die Dateien einzeln ansprechen kann.
    Ich hoffe ich konnte verständlich beschreiben was ich meine.

    3. Im speziellen Fall ist es sinnvoll die auswählbaren Dateien einzuschränken um Fehler zu vermeiden.
    Momentan mache ich dies im erst Nachhinein (erst nach der Auswahl) mittels Abfrage der Dateiendung bzw. Prüfung auf festgelegte Teile des Dateinamens.
    Nun gibt es in der "Application.GetOpenFilename" ja den Parameter "FileFilter".
    Könnt Ihr mir bitte mit der korrekten Syntax helfen?
    Denn wenn ich
    Code:
    var = Application.GetOpenFilename(filefilter:="Exceldateien (*.xls,*.xlsx"), , , , MultiSelect:=True)
    schreibe, kommt folgende Fehlermeldung:

    Zur Veranschaulichung und für evetuelle Tests oder Versuche habe ich folgende Beispieldatei angehängt:
    Den Anhang Datei-Öffnen Multiselect.xls betrachten


    Danke jetzt schon einmal für Eure Zeit.
     
    fette Elfe, 10. März 2012
    #1
  2. Beverly
    Beverly Erfahrener User
    Hi Achim,

    ich würde es so lösen
    Code:
    Option Explicit
    Dim arrDateien() As String
    Dim intZaehler As Integer
    
    Sub Aufruf()
       Dim strDatei As String
       strDatei = DateiAuswahl
       For intZaehler = 0 To UBound(arrDateien)
          ' hier den Code, was du mit den ausgewählten Dateien machen willst
          MsgBox arrDateien(intZaehler)
       Next intZaehler
    End Sub
    
    Function DateiAuswahl() As String
        With Application.FileDialog(msoFileDialogFilePicker)
            .AllowMultiSelect = True
            .InitialFileName = "D:\Test\"
            .Filters.Delete
            .Filters.Add "Excel-Dateien", "*.xls; *.xlsx; *.xlsm", 1
            .ButtonName = "OK"
            .Title = "Bitte Dateien auswählen"
            .Show
            If .SelectedItems.Count = 0 Then
                DateiAuswahl = ""
            Else
                For intZaehler = 1 To .SelectedItems.Count
                   ReDim Preserve arrDateien(0 To intZaehler - 1)
                   arrDateien(intZaehler - 1) = .SelectedItems(intZaehler)
                Next intZaehler
            End If
        End With
    End Function
    
    Bis später,
    Karin
     
    Beverly, 11. März 2012
    #2
  3. miriki Erfahrener User
    Ich definiere den Typen normalerweise auch lieber direkt, aber in diesem Fall ist das schwierig. Der Rückgabewert kann sowohl ein String, ein Array (of String) aber auch ein Boolean sein.

    Ähm, ja, und? Wenn etwas mit einer bestimmten Datei nicht passieren soll, dann ist das trotzdem genau der richtige Punkt, darüber zu entscheiden.

    Wenn mit *.* 387 Dateien ausgewählt wurden, aber nur was mit den 3 *.xls passieren soll, dann ist eine IF-Entscheidung innerhalb der FOR-Schleife genau richtig.

    Genau dafür ist das Array da, welches Dir bei multiselect zurückgeliefert wird. ;-)

    Versuch mal was in der Art:
    Code:
    "alle,*.*,Excel,*.xls?,Text,*.txt"
    als 1. Parameter. Also: Ein String, in dem durch Komma getrennt jeweils Bezeichnung und Dateimaske stehen.

    Gruß, Michael
     
    miriki, 12. März 2012
    #3
  4. fette Elfe Erfahrener User

    Excel 2007 - Application.GetOpenFilename - und - MultiSelect - 3 Fragen

    Hallo Karin,

    liebem Dank für Deine Antwort.

    Mit Funktionen habe ich mich leider immer noch nicht beschäftigt, deshalb habe ich in diese Richtung noch garnicht gedacht.


    Code:
    .Filters.Delete
    Dafür müsste ne Abfrage eingefügt werden, ob überhaupt Filter gesetzt sind, denn beim ersten Aufruf (wo noch keine Filter gesetzt sind) meckert Excel. Ab dem 2. Aufruf klappts dann.


    Ansonsten klappt Deine Funktion tadellos.
    Vor allem klappts mit dem Filtern.
    Nur, wo siehst Du den Vorteil?
    Vielleicht denke ich nicht weit genug, aber ob ich die Datei über
    Code:
    var(intCounter)
    oder
    Code:
    arrDateien(intZaehler)
    anspreche,
    solange dies in einer Schleife passiert, kann ich alle nacheinander ansprechen.
    Und falls der entsprechende Wert des Zählers (intCounter bzw. intZaehler) bekannt wäre, könnte ich zur Laufzeit auch jede Datei einzeln ansprechen.

    Wäre lieb wenn Du mir da ein wenig auf die Sprünge helfen könntest.
     
    fette Elfe, 13. März 2012
    #4
  5. fette Elfe Erfahrener User
    Hallo Michael,

    auch Dir ganz lieben dank für Deine Antwort.

    Inzwischen habe ich auch auf irgendeiner Web-Seite die passende Dokumentation zur "Application.GetOpenFilename" gefunden.
    Dort stand, dass von MS aus der Rückgabewert "Variant" ist.
    Und dank Deiner Erklärung weiß ich jetzt auch warum. ;O)


    Ähm, jaein. :D
    Ich hatte eigentlich vor, in ganz bestimmten Fällen ganz bestimmte Dateien zu einem späteren Zeitpunkt nocheinmal anzusprechen. Dafür hätte ich aber eine variable Anzahl von Dateinamen bzw. Variablen "speichern" müssen.
    In der Zwischenzeit habe ich dieses "Problem" aber umgangen und es ganz anders gelöst.


    Und so
    Code:
    Application.GetOpenFilename("Excel,*.xl?", , , , MultiSelect:=True)
    klappts auch mit dem Filter. Dankeschön.
     
    fette Elfe, 13. März 2012
    #5
  6. miriki Erfahrener User
    Dann wäre der Weg, Dir ein 2. Array zu schnappen und in der FOR-Schleife die betreffenden Dateinamen aus dem GetOpenFilename-Array für eben diese spätere Verwendung dort hineinzukopieren. Je nach Gusto kannst Du das dann ja mit einem dynamischen Array oder auch nicht machen, einen Zähler mitschleifen oder das Array später mit while xxx(y)<>"" durchackern.

    Ach, und das mit der Doku, ja... Die eingebaute Online-Hilfe ist da etwas sparsam mit dem Hinweis, stimmt. Unter
    http://msdn.microsoft.com/en-us/library/aa195744(v=office.11).aspx
    findet man bei "Remarks" aber wenigstens entsprechende Hinweise.

    Gruß, Michael
     
    miriki, 13. März 2012
    #6
  7. Beverly
    Beverly Erfahrener User
    Hi Achim,

    mit Funktionen und "ausgelagerten" Subs zu arbeiten hat den großen Vorteil, dass man diese von verschiedenen Stellen eines Programms, also auch aus verschiedenen Prozeduren heraus aurufen kann. Das macht den Code außerdem übersichtlicher und bei Codeveränderungen kann man diesen Teil meist unberücksichtig lassen kann.

    Das Problem bei .Filters.Delete kannst du umgehen, indem du die Zeile so schreibst:
    Code:
            If .Filters.Count <> 0 Then .Filters.Delete
    Der Vorteil eines extra Arrays ist, dass du (wenn du es nicht innerhalb der Prozedur deklarierst) die Dateinamen auch späterhin zur Verfügung hast. Das war doch eins deiner Ziele - oder habe ich das falsch verstanden?

    Gruß
    Karin
     
    Beverly, 13. März 2012
    #7
  8. fette Elfe Erfahrener User

    Excel 2007 - Application.GetOpenFilename - und - MultiSelect - 3 Fragen

    fette Elfe, 13. März 2012
    #8
  9. fette Elfe Erfahrener User
    Hallo Karin,

    so einfach kanns manchmal sein... ;O)




    Okay, da habe ich wohl nicht weit genug gedacht.
    Du hast mich schon richtig verstanden, in der ursprünglichen Überlegung wäre es notwendig gewesen die Dateinamen auch später noch abrufen bzw. selektieren zu können.
    Wie gesagt, das konnte ich inzwischen einfacher lösen.

    "Funktionen und ausgelagerte Subs"... ich glaube, ich muss mal ganz dringend an meinem Wissen und auch an meinem Programmierstil arbeiten.
    Wenn ich mal viel Zeit habe... Excel 2007 - Application.GetOpenFilename - und -  MultiSelect - 3 Fragen :rolleyes:;)

    Leider bin ich ja eigentlich immernoch ein unwissender Anfänger der sich irgendwas selber beibringt, ausprobiert und im Internet nach Lösungswegen sucht.
    Und wenn, wie jetzt, mal wieder ein Projekt ansteht, dann muss es gestern schon fertig sein, obwohl ich mehrere Wochen dafür brauche (neben der Arbeit in meiner Freizeit).

    Ich finde es kann nicht oft genug gesagt werden:
    Ohne Internet und die hilfsbereiten Menschen in den Fachforen käme so manch einer in vielen Dingen keinen Schritt weiter.
    Deshalb ganz lieb Danke.
     
    fette Elfe, 13. März 2012
    #9
  10. fette Elfe Erfahrener User
    Hallo Karin,

    da mein Code ab und an, nicht reproduzierbar und für mich unvorhersehbar (und vor allem nicht nachvollziehbar) Fehler produziert, stelle ich nun doch auf Deine Funktion um.
    Deshalb hier noch ein Nachtrag mit Fragen und Verbesserungen (falls mal jemand anderes etwas ähnliches benötigt).


    Zuerst die Fragen:

    - in der Codezeile
    Code:
    .Filters.Add "Excel-Dateien", "*.xls; *.xlsx", 1
    gibt die "1" am Ende die Position an.... Ähm, was für eine Position?
    Ich konnte keinen Unterschied feststellen wenn ich die "1" weglasse, und "2" wird angemeckert.


    - "DateiAuswahl" bezeichnet nur die Funktion, gibt selber aber keinen prüfbaren Wert zurück, ist das so richtig?
    Denn die Zeile
    Code:
    strDatei = DateiAuswahl
    gibt IMMER
    Code:
    strDatei = ""
    zurück.
    Wohingegen meine Variante
    Code:
    var = Application.GetOpenFilename(, , , , MultiSelect:=True)
    mit
    Code:
    If Not TypeName(var) = "Boolean" Then
    prüfbar ist.
    Wieso ist das so? Kann mir da jemand den Unterschied erklären?
    Auch habe ich keine Möglichkeit gefunden, die Buttons des DateiÖffnenDialogs ähnlich wie
    Code:
    strMsgBox = MsgBox("blabla", vbYesNoCancel, "Titel")
    If strMsgBox = vbCancel Then
    ElseIf strMsgBox = vbYes Then
    auszuwerten. (Ausser mit meinem Behelf, siehe Code weiter unten)
    Gibt es diese Möglichkeit, und ich habe sie halt nur nicht gefunden?
    Denn irgendeine Prüfung muss stattfinden, da ansonsten bei widerholtem Funktionsaufruf und drücken des Buttons "Abbrechen" beim letzten Aufruf, das Array der letzten tatsächlichen Auswahl genommen wird, anstatt diesen Teil komplett zu überspringen. (hoffentlich ist das jetzt nachvollziehbar wie es gemeint ist)



    Nun zu meinen Änderungen (ob es wirklich Verbesserungen sind mag jeder selber entscheiden):

    Da "strDatei = DateiAuswahl" für mich nutzlos ist, und dementsprechend die Zuweisung "DateiAuswahl = "" " innerhalb der Funktion ebenso, habe ich die Schleife "If .SelectedItems.Count = 0 Then" umstrukturiert und mir den oben angesprochenen Behelf eingebaut.
    Zusätzlich habe ich die Dimensionierung des Arrays direkt bei "1" statt bei "0" beginnen lassen, denn so wird
    Code:
    ReDim Preserve arrDateien(0 To intZaehler - 1)
    arrDateien(intZaehler - 1) = .SelectedItems(intZaehler)
    zu
    Code:
    ReDim Preserve arrDateien(1 To intZaehler)
    arrDateien(intZaehler) = .SelectedItems(intZaehler)
    und dadurch in meinen Augen übersichtlicher und verständlicher. Aber das ist vermutlich Geschmackssache.



    Und hier nun der neue Code (muss ich bei mir natürlich noch einbauen und anpassen):
    Code:
    Option Explicit
    
    Dim loZaehler As Long
    
    Dim arrDateien() As String
    Dim strMsgBox As String
    
    
    Sub Aufruf()
        
        Call DateiAuswahl       ' Function DateiAuswahl() As String
        
        If strMsgBox = "OK" Then
            For loZaehler = 1 To UBound(arrDateien)
                ' hier den Code, was man mit den ausgewählten Dateien machen möchte
                MsgBox arrDateien(loZaehler)
            Next loZaehler
        ElseIf strMsgBox = "Cancel" Then
            ' hier den Code, wenn keine Datei ausgewählt wurde (Abbruch oder rotes X)
            MsgBox "Es wurde keine Datei ausgewählt."
        End If
        
    End Sub
    
    Function DateiAuswahl() As String
        
        With Application.FileDialog(msoFileDialogFilePicker)
            .AllowMultiSelect = True
            .InitialFileName = "D:\Test\"
            If .Filters.Count > 0 Then .Filters.Delete
            .Filters.Add "Excel-Dateien", "*.xls; *.xlsx", 1
            .ButtonName = "OK"
            .Title = "Bitte Dateien auswählen"
            .Show
            If .SelectedItems.Count > 0 Then
                strMsgBox = "OK"
                For loZaehler = 1 To .SelectedItems.Count
                   ReDim Preserve arrDateien(1 To loZaehler)
                   arrDateien(loZaehler) = .SelectedItems(loZaehler)
                Next loZaehler
            Else
                strMsgBox = "Cancel"
            End If
        End With
        
    End Function
     
    fette Elfe, 18. März 2012
    #10
  11. Beverly
    Beverly Erfahrener User
    Hi Achim,
    Code:
    Option Explicit
    Dim loZaehler As Long
    Dim arrDateien() As String
    
    Sub Aufruf()
        Dim strWeiter As String
        strWeiter = DateiAuswahl      ' Function DateiAuswahl() As String
        
        If strWeiter = "Ja" Then
            For loZaehler = 1 To UBound(arrDateien)
                ' hier den Code, was man mit den ausgewählten Dateien machen möchte
                MsgBox arrDateien(loZaehler)
            Next loZaehler
        Else
            ' hier den Code, wenn keine Datei ausgewählt wurde (Abbruch oder rotes X)
            MsgBox "Es wurde keine Datei ausgewählt."
        End If
        
    End Sub
    
    Function DateiAuswahl() As String
        With Application.FileDialog(msoFileDialogFilePicker)
            .AllowMultiSelect = True
            .InitialFileName = "D:\Test\"
            If .Filters.Count > 0 Then .Filters.Delete
            .Filters.Add "Excel-Dateien", "*.xls; *.xlsx", 1
            .ButtonName = "OK"
            .Title = "Bitte Dateien auswählen"
            If .Show = -1 Then
                DateiAuswahl = "Ja"
                For loZaehler = 1 To .SelectedItems.Count
                   ReDim Preserve arrDateien(1 To loZaehler)
                   arrDateien(loZaehler) = .SelectedItems(loZaehler)
                Next loZaehler
            Else
                DateiAuswahl = "Nein"
            End If
        End With
    End Function
    Bis später,
    Karin
     
    Beverly, 18. März 2012
    #11
  12. fette Elfe Erfahrener User
    fette Elfe, 18. März 2012
    #12
Thema:

Excel 2007 - Application.GetOpenFilename - und - MultiSelect - 3 Fragen

Die Seite wird geladen...
  1. Excel 2007 - Application.GetOpenFilename - und - MultiSelect - 3 Fragen - Similar Threads - Excel 2007 Application

  2. Makros in Excel 2007 aktivieren

    in Microsoft Excel Hilfe
    Makros in Excel 2007 aktivieren: Fehler 57121
  3. Excel 2007-Pflichtfeld Abfrage vorm Drucken

    in Microsoft Excel Hilfe
    Excel 2007-Pflichtfeld Abfrage vorm Drucken: Hallo, ich würde gerne bei einer Tabelle den Druck verhindern so lange gewisse Zellen keinen Inhalt haben. Also Pflichtfelder abfrage vor Druck. Für eine Zelle habe ich es Mittlerweile mit...
  4. Druckproblem bei Excel 2007

    in Microsoft Excel Hilfe
    Druckproblem bei Excel 2007: Hallo, normalerweise ist das drucken kein Problem. Aber: Ich habe mir eine Tabelle mit Hilfsspalten erstellt. Zum Ausdrucken blende ich diese Hilfsspalten natürlich aus. Aber dann wird die...
  5. Häufigkeit in Tortendiagramm darstellen

    in Microsoft Excel Hilfe
    Häufigkeit in Tortendiagramm darstellen: Hallo, ich scheitere daran, die Häufigkeit von Werten (in Textform) als Tortendiagramm darzustellen. Ich habe schon ein bisschen gegooglet, finde aber nicht das, was ich brauche. Ich habe...
  6. Excel 2007, aus Textfeld kopieren

    in Microsoft Excel Hilfe
    Excel 2007, aus Textfeld kopieren: Moin Excel Experten In mein Excel 7 habe ich massig von Textfeldern als T-Bausteine für Word. Wenn ich was markiere, dann mit Strg-C, kopiere, klappt das nicht, sonder wird der letzte Eintrag...
  7. Umstellung von Office 2007 auf 2016

    in Microsoft Excel Hilfe
    Umstellung von Office 2007 auf 2016: Hallo und guten Tag, mit vba habe ich in Excel Office 2007 ein ziemlich umfangreiches Makro programmiert. Jetzt soll bei uns die Umstellung auf Office 2016 stattfinden. Muß ich damit rechnen,...
  8. Excel 2007: prozentualer Vergleich zweier Werte als Liniendiagramm

    in Microsoft Excel Hilfe
    Excel 2007: prozentualer Vergleich zweier Werte als Liniendiagramm: Hallo, ich möchte gerne 2 Werte in einem Liniendiagramm vergleichen. So wie man es oft beim Vergleich zweier oder mehrerer Aktien im prozentualen Bereich miteinander sieht. Der Startpunkt...
  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deiner Erfahrung anzupassen und dich nach der Registrierung angemeldet zu halten.
    Auf dieser Website werden Cookies für die Zugriffsanalyse und Anzeigenmessung verwendet.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden