Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: GetOpenFileName und Multiselect

GetOpenFileName und Multiselect
Jogy
Hi.
Einfach mal folgender Codeschnipsel:

Sub test()
Dim daTei
daTei = Application.GetOpenFilename(, , , , True)
Debug.Print (IsArray(daTei))
End Sub

Der funktioniert so weit einwandfrei und gibt True aus, sobald ich etwas auswähle.
Nur sobald ich eine bestimmte Arbeitsmappe lade (natürlich genau die, in der das rein soll), wird das Multiselect ignoriert. Ich kann zwar mehrere Dateien auswählen, genommen wird aber nur die erste, d.h. IsArray(Datei)=False.
Das Verhalten tritt übrigens auch auf, wenn der Code gar nicht in der betreffenden Arbeitsmappe steht. D.h. ich schreibe den Code in eine neue Mappe und es tut. Lade ich dann oben erwähnte Arbeitsmappe und Multiselect geht nicht mehr. Schließe ich sie dann wieder, dann geht es.
Ganz lustig ist auch, dass ich in einem AddIn einen Code habe, bei dem es trotzdem geht. Kopiere ich obigen Code in das Modul im AddIn, geht es nicht. Ebenso funktioniert der AddIn Code nicht in der o.g. Arbeitsmappe.
Soweit ich jetzt heruasgefunden habe, wird das durch eine bedingte Formatierung ausgelöst, entferne ich die, dann geht es... nur warum in aller Welt? Ich habe es hier auf zwei Rechner ausprobiert und es tritt bei beiden auf. Die Datei kann ich jetzt von hier aus nicht hochladen, das hole ich bei Bedarf heute abend nach.
Danke schon mal und Gruss, Jogy

Anzeige

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
Nachtrag:
06.07.2009 12:39:24
Jogy
Noch ein Nachtrag: Tritt nur auf, wenn bei der bedingten Formatierung IST- oder NICHT-Funktionen auftauchen.
Gruss, Jogy
AW: Nachtrag:
06.07.2009 13:02:47
Ramses
Hallo
ist doch klar, Du fragst ja keine anderen Inhalte des Arrays ab
If IsArray(DaTei) then
for i = 0 to ubound(datei)
debug.print datei(i)
next i
else
Debug.print daTei
End If
... sollte eigentlich tun
Gruss Rainer
Anzeige
AW: Nachtrag:
06.07.2009 14:22:13
Jogy
Hi Rainer,
ich frage an der Stelle überhaupt nichts ab, außer ob es ein Array ist. Das ist reiner Debug Code, um das Problem nachzuvollziehen.
Und damit Dein Code funktioniert, müßte es ein Array sein, was es aber nicht ist. IsArray(Datei) ergibt False, wenn diese bedingten Formatierungen (und wenn ich mich nicht ganz täusche, dann spielt nur das aktive Arbeitsblatt eine Rolle) vorhanden sind. Sind sie weg, dann ergibt IsArray(Datei) den Wert True - also wie es sein sollte.
Gruss, Jogy
Anzeige
AW: Nachtrag:
06.07.2009 14:57:50
Ramses
Hallo
Ich weiss doch nicht, wass du alles in die Variable "daTei" reinpackst oder wie du ihn deklariert hast.
Das kommt aus dem Schnipsel ja nicht raus. Wenn du abfragen willst, ob mehr als eine Datei im Öffnen Dialog selectiert ist, da kommt es auch wieder drauf welchen du nimmst und wie du ihn ausgbist, dann frag doch einfach die "Selected()"-Eigenschaft ab.
Gruss Rainer
Anzeige
AW: Nachtrag:
06.07.2009 16:09:50
Jogy
Hi.
Ähm... inwiefern soll das Application.GetOpenFileName noch andere Möglichkeiten bieten? Ich benutze ja nicht die Common Dialogs, von daher kommt aus dem Codeschnipsel eigentlich alles raus. Und was mir hier die Selected Eigenschaft bringen soll, das sehe ich gerade nicht wirklich... der Dialog ist doch längst wieder zu und mal abgesehen davon bringt es mir nichts zu wissen, dass mehrere Datein ausgewählt wurden, wenn die nicht im Array stehen.
GetOpenFileName mit Multiselect hat (eigentlich) zwei Rückgabewerte, entweder ein Array mit den Dateien (wenn was selektiert wurde, auch bei nur einer Datei) oder FALSE (wenn nichts selektiert wurde). Deswegen ist daTei als Variant deklariert, weil ich eben nicht weiß, was ich bekomme.
D.h. sobald etwas selektiert ist, muss das ein Array sein. Wenn ich aber eine bedingte Formatierung mit IST-Funktion auf dem aktiven Arbeitsblatt habe, dann bekomme ich einen String mit der ersten Datei als Rückgabe - auswählen kann ich aber mehrere. Mache ich sie raus oder gehe auf ein Arbeitsblatt ohne eine solche bedingte Formatierung, dann bekomme ich den Array.
Ist zumindest bei mir hier auf zwei Rechnern reproduzierbar. Mal sehen, muss ich heute abend zu Hause nochmal testen, scheint wohl ein Bug zu sein.
Gruss, Jogy
Anzeige
AW: Nachtrag:
06.07.2009 16:29:42
Ramses
Hallo
"..inwiefern soll das Application.GetOpenFileName noch andere Möglichkeiten bieten..."
Hab ich nicht gesagt, sondern welchen du nimmst.
Probier mal das aus
Option Explicit

Sub test()
    Dim fileArr As Variant
    Dim i As Long
    fileArr = Application.GetOpenFilename(Title:="Mehrfachauswahl", MultiSelect:=True)
    For i = 1 To UBound(fileArr)
        Debug.Print fileArr(i)
    Next i
End Sub

oder alternativ auch das,... auch wenns länger ist.
Sub A_Datei_wählen()
    Dim FileDlg As FileDialog
    Dim dname As String
    Dim Dati As Long
    Set FileDlg = Application.FileDialog(msoFileDialogFilePicker)
    With FileDlg
        .Title = "Wählen Sie eine Datei oder mehrere aus"
        'Environ(25) ermittelt den Aktuellen Userpfad
        'Alternativ kann hier auch die Variable vom vorherigen
        'Dialog eingesetzt werden
        '.InitialFileName = Suchpfad
        .InitialFileName = Environ(25) & "\Eigene Dateien\"
        .Filters.Clear
        .Filters.Add "Nur EXCEL Tabellen", "*.xls", 1
        'Andere Filterauswahlen sind möglich
        'Die Zahl gibt die Position in der Auswahlbox an
        '.Filters.Add "CSV Dateien", "*.csv", 2
        .FilterIndex = 1
        .ButtonName = "Dateien öffnen"
        'AllowMultiSelect = False dann kann nur eine Datei gewählt werden
        .AllowMultiSelect = True
        'Hier werden nur kleine Symbole angezeigt
        '.InitialView = msoFileDialogViewSmallIcons
        .InitialView = msoFileDialogViewLargeIcons
        .Show
        If .SelectedItems.count = 0 Then
            MsgBox "Sie haben keine Datei gewählt", vbCritical + vbOKOnly, "Dateifehler"
            Exit Sub
        Else
            For Dati = 1 To .SelectedItems.count
                dname = dname & vbCrLf & .SelectedItems(Dati)
            Next Dati
            MsgBox "Sie haben diese Dateien gewählt: " & vbCrLf & dname
            'Weitere Befehle mit den geöffneten Dateien
        End If
    End With
    Set FileDlg = Nothing
End Sub

Gruss Rainer
Anzeige
AW: Nachtrag:
06.07.2009 16:56:45
Jogy
Hi.
sorry, ich verstehe nicht worauf Du hinauswillst. Dass es andere Möglichkeiten gibt, ist mir schon klar.
Ich habe aber den FileDialog nicht benutzt und nirgends auch nur angedeutet, dass ich das gemacht habe. Von daher weiß ich immer noch nicht, was an meinem Beispiel unklar war.
Ist aber auch egal, scheint ein Bug zu sein.
Gruss, Jogy
Anzeige
AW: Nachtrag:
06.07.2009 19:35:27
Jogy
So, kann es zu Hause auch reproduzieren, ist also ein Bug.
Schreibe MS deswegen mal an.
Gruss, Jogy
noch offen - kwT
06.07.2009 12:40:05
Jogy
.
AW: noch offen - kwT
06.07.2009 12:40:49
Jogy
Da hat mir die Vorschau ohne Text das Häkchen entfernt
Anzeige
;

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige
Anzeige
Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken
Anzeige
Anzeige

Infobox / Tutorial

Umgang mit GetOpenFileName und Multiselect in Excel VBA


Schritt-für-Schritt-Anleitung

  1. Öffne den Visual Basic for Applications (VBA) Editor in Excel, indem du ALT + F11 drückst.

  2. Erstelle ein neues Modul:

    • Klicke mit der rechten Maustaste auf "VBAProject (DeineDatei.xlsm)".
    • Wähle "Einfügen" > "Modul".
  3. Füge den folgenden Code ein:

    Sub test()
       Dim daTei As Variant
       daTei = Application.GetOpenFilename(, , , , True)
       Debug.Print (IsArray(daTei))
    End Sub
  4. Führe den Code aus, um den Dialog zum Auswählen von Dateien zu öffnen. Achte darauf, dass MultiSelect auf True gesetzt ist, um mehrere Dateien auszuwählen.

  5. Überprüfe die Ausgabe im Direktfenster (Strg + G), um zu sehen, ob IsArray(daTei) True zurückgibt.


Häufige Fehler und Lösungen

  • Problem: IsArray(daTei) gibt False zurück, obwohl mehrere Dateien ausgewählt wurden.

    • Lösung: Dies kann passieren, wenn in der Arbeitsmappe bedingte Formatierungen mit IST- oder NICHT-Funktionen aktiv sind. Entferne diese Formatierungen oder teste in einem anderen Arbeitsblatt.
  • Problem: Der Code funktioniert in einer neuen Arbeitsmappe, nicht jedoch in einer bestehenden.

    • Lösung: Überprüfe, ob in der bestehenden Arbeitsmappe spezielle Formatierungen oder Makros vorhanden sind, die das Verhalten beeinflussen.

Alternative Methoden

Eine alternative Möglichkeit, um mehrere Dateien auszuwählen, ist die Verwendung des FileDialog-Objekts:

Sub A_Datei_wählen()
    Dim FileDlg As FileDialog
    Dim dname As String
    Dim Dati As Long
    Set FileDlg = Application.FileDialog(msoFileDialogFilePicker)

    With FileDlg
        .Title = "Wählen Sie eine Datei oder mehrere aus"
        .AllowMultiSelect = True
        .Filters.Clear
        .Filters.Add "Excel-Dateien", "*.xls", 1
        .Show

        If .SelectedItems.Count > 0 Then
            For Dati = 1 To .SelectedItems.Count
                dname = dname & vbCrLf & .SelectedItems(Dati)
            Next Dati
            MsgBox "Sie haben diese Dateien gewählt: " & dname
        Else
            MsgBox "Sie haben keine Datei gewählt"
        End If
    End With
End Sub

Praktische Beispiele

  • Beispiel 1: Verwende Application.GetOpenFilename mit Multiselect:

    Sub Beispiel_Multiselect()
       Dim Dateien As Variant
       Dateien = Application.GetOpenFilename(FileFilter:="Excel-Dateien (*.xls), *.xls", MultiSelect:=True)
    
       If IsArray(Dateien) Then
           Dim i As Long
           For i = LBound(Dateien) To UBound(Dateien)
               Debug.Print Dateien(i)
           Next i
       Else
           Debug.Print "Keine Dateien ausgewählt."
       End If
    End Sub
  • Beispiel 2: Wenn du mehrere Dateitypen filtern möchtest, kannst du FileFilter verwenden:

    Sub Beispiel_FileFilter()
       Dim datei As Variant
       datei = Application.GetOpenFilename(FileFilter:="Excel-Dateien (*.xls), *.xls; CSV-Dateien (*.csv), *.csv", MultiSelect:=True)
       ' Weitere Logik hier...
    End Sub

Tipps für Profis

  • Verwende Option Explicit: Stelle sicher, dass alle Variablen deklariert sind, um unerwartete Fehler zu vermeiden.
  • Debugging: Nutze das Debug.Print-Kommando, um den Wert von Variablen während der Ausführung zu verfolgen.
  • Bedingte Formatierungen: Sei vorsichtig bei der Verwendung von bedingten Formatierungen, da sie das Verhalten deines Codes beeinflussen können.

FAQ: Häufige Fragen

1. Wie kann ich sicherstellen, dass Application.GetOpenFilename mehrere Dateien korrekt zurückgibt? Um sicherzustellen, dass mehrere Dateien korrekt ausgewählt werden, setze MultiSelect:=True und überprüfe, ob IsArray() den Wert True zurückgibt.

2. Warum funktioniert der Multiselect-Dialog nicht in bestimmten Arbeitsmappen? Das Problem kann an bedingten Formatierungen oder Makros in der Arbeitsmappe liegen. Teste den Code in einer neuen, leeren Arbeitsmappe, um dies zu überprüfen.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige