Dialogfenster Dateiöffnüngsreihenfolge bestimmen

Bild

Betrifft: Dialogfenster Dateiöffnüngsreihenfolge bestimmen
von: Conelius
Geschrieben am: 06.08.2015 13:26:19

Hallo zusammen,
gibt es eine Möglichkeit die Reihenfolge der Dateiöffnung von den im Dialogfenster ausgewählten Dateien zu bestimmen?
D.h. es liegen jeweils drei Dateien vor mit unterschiedlichen Namen aber einem aufsteigenden Zählindex, wobei sich die Zahl immer an 9. letzten Stelle vom Dateinamen befindet z.B.:
Datei 1: Dateinamea_1_xyz.txt
Datei 2: Dateinameb_2_zyx.txt
Datei 3: Dateinamec_3_yzx.txt
Die Dateien sollen unabhängig von der Reihenfolge der Nutzerauswahl im Dialogfenster in der Reihenfole 1, 2, 3 geöffnet werden. Gibt es dafür eine Möglichkeit zur Umsetzung?
Hier mein Beispielcode:


Sub GetOpen_CHRs()
Application.DisplayAlerts = False
Application.ScreenUpdating = False
  
'Variablendeklaration
Dim varRetVal As Variant
Dim n, x         As Integer
x = 1
n = 1
'Dateiauswahlfenster und Definition des Startordnerpfads
ChDir "Beispielpfad"
varRetVal = Application.GetOpenFilename(FileFilter:="Microsoft Excel-Dateien (*.txt), *.txt",   _
_
Title:="Bitte wählen Sie die Dateien aus", MultiSelect:=True)
'Öffnen aller ausgewählten Dateien
If IsArray(varRetVal) Then
On Error Resume Next
    For n = LBound(varRetVal) To UBound(varRetVal)
      Workbooks.Open varRetVal(n)
       With ActiveSheet.QueryTables.Add(Connection:=varRetVal(n), Destination:=Range("$A$1"))
        .FieldNames = True
        .RowNumbers = False
        .FillAdjacentFormulas = False
        .PreserveFormatting = True
        .RefreshOnFileOpen = False
        .RefreshStyle = xlInsertDeleteCells
        .SavePassword = False
        .SaveData = True
        .AdjustColumnWidth = True
        .RefreshPeriod = 0
        .TextFilePromptOnRefresh = False
        .TextFilePlatform = 1252
        .TextFileStartRow = 1
        .TextFileParseType = xlDelimited
        .TextFileTextQualifier = xlTextQualifierDoubleQuote
        .TextFileConsecutiveDelimiter = False
        .TextFileTabDelimiter = True
        .TextFileSemicolonDelimiter = False
        .TextFileCommaDelimiter = False
        .TextFileSpaceDelimiter = False
        .TextFileColumnDataTypes = Array(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,   _
_
1, 1, 1, _
        1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
        .TextFileThousandsSeparator = "'" 'dient der Beseitigung der Tausendertrennzeichen die   _
_
sonst automatisch gesetzt werden 
        .TextFileTrailingMinusNumbers = True
        .Refresh BackgroundQuery:=False
     End With
    
    'Übertragung der geöffneten Dateien in die Tabellenblätter
    Range("A1").Select
    Range(Selection, Selection.End(xlToRight)).Select
    Range(Selection, Selection.End(xlDown)).Select
    Selection.Copy
    Windows("Beispieldatei.xlsm").Activate
    Sheets("Beispieltabellenblatt_" & x).Select
    x = x + 1
    Range("A1").Select
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False,  _
Transpose:=False
        
    'Schließen der geöffneten Importdateien
    For Each Wkb In Workbooks
      If Wkb.Name <> ThisWorkbook.Name Then
        Wkb.Close savechanges:=False
        End If
        Next Wkb
    Next
On Error GoTo 0
End If
Application.DisplayAlerts = True
Application.ScreenUpdating = True
Call Beispielsub
  
End Sub

Bin über jede Hilfe dankbar!
Beste Grüße
Cornelius

Bild

Betrifft: Dateiöffnüngsreihenfolge bestimmen
von: Rudi Maintaire
Geschrieben am: 06.08.2015 13:35:54
Hallo,
sortiere varRetVal nach der 9. Stelle.
Gruß
Rudi

Bild

Betrifft: genau
von: Michael
Geschrieben am: 06.08.2015 13:48:27
Hi zusammen,
z.B. so:

Sub minisort()
Dim varRetVal As Variant
Dim von&, bis&, i&
varRetVal = Range("B12:B14")      ' nur hier zur Bestückung des Arrays
von = 12: bis = UBound(varRetVal) - LBound(varRetVal) + von
Range("D" & von & ":D" & bis) = varRetVal
For i = von To bis
Range("E" & i & ":E" & i) = Mid(Range("D" & i & ":D" & i), 9, 1)
Next
Range("D" & von & ":E" & bis).Sort key1:=Range("E" & i)
varRetVal = Range("D" & von & ":D" & bis)
End Sub
Arrays haben leider keine eingebaute Sortierfunktion; wenn Du excel vba array sort recherchierst, findest Du alle möglichen Treffer, die mit Quicksort oder anderen Algorithmen hantieren, aber die Werte schnell irgendwohin (z.B. in ein verstecktes Tabellenblatt) zu schreiben, zu sortieren und wieder auszulesen geht fix und ohne großes Nachdenken.
Schöne Grüße,
Michael

Bild

Betrifft: AW: genau
von: Conelius
Geschrieben am: 06.08.2015 14:37:43
Vielen Dank schon einmal an euch beide. Aber damit komm ich leider noch nicht richtig weiter.
Leider habe ich in jeder Zeile den gleichen Inhalt des Arrays. Wieso wird der Inhalt des Arrays nicht durchlaufen mit der For-Schleife?
Ich hab nun in Spalte "E" immer in allen Zeilen dieselbe Zahl stehen und kann dementsprechend auch nicht sortieren.

Sub Datei_oeffnen
'Dateiauswahlfenster und Definition des Startordnerpfads
ChDir "Beispielpfad"
varRetVal = Application.GetOpenFilename(FileFilter:="Microsoft Excel-Dateien (*.txt), *.txt",    _
_
_
Title:="Bitte wählen Sie die Dateien aus", MultiSelect:=True)
'Öffnen aller ausgewählten CHR-Dateien in separaten Importdateien
If IsArray(varRetVal) Then
For n = LBound(varRetVal) To UBound(varRetVal)
von = 1: bis = UBound(varRetVal) - LBound(varRetVal) + von
Range("D" & von & ":D" & bis) = varRetVal
For i = von To bis
Range("E" & i & ":E" & i) = Left(Right(Range("D" & i & ":D" & i), 9), 1)
Next
Range("D" & von & ":E" & bis).Sort key1:=Range("E" & i)
varRetVal = Range("D" & von & ":D" & bis)
'Range("D1:E3").Clear
Next
End If
'Workbooks.Open varRetVal(n)
End Sub


Bild

Betrifft: Array
von: Rudi Maintaire
Geschrieben am: 06.08.2015 14:53:20
Hallo,
varRetVal ist eindimensional, ein Zellbereich immer zweidimensional.
Range("D" & von & ":D" & bis) = WorksheetFunction.Transpose(varRetVal)
....
....
varRetVal = WorksheetFunction.Transpose(Range("D" & von & ":D" & bis))
Achtung: das Array beginnt dann mit Index 1!!!
Ich würde das Array per Code sortieren.
z.B.

Sub sortiere(a)
  Dim i As Long, j As Long, tmp
  For i = LBound(a) To UBound(a)
    For j = i + 1 To UBound(a)
      If CInt(Mid(a(i), 9, 1)) > CInt(Mid(a(j), 9, 1)) Then
        tmp = a(i)
        a(i) = a(j)
        a(j) = tmp
      End If
    Next j
  Next i
End Sub

Gruß
Rudi
Gruß
Rudi

Bild

Betrifft: richtige Einfügeposition
von: Michael
Geschrieben am: 06.08.2015 15:25:20
Hi zusammen,
Du hast den Codeschnipsel zum Sortieren an der falschen Stelle eingefügt.
Richtig wäre er hier:

Sub Datei_oeffnen()
' bis hierher vorhandener Code incl. nächste Zeile
If IsArray(varRetVal) Then
' ***************** hier sortieren **********
von = 12: bis = UBound(varRetVal) - LBound(varRetVal) + von
Range("D" & von & ":D" & bis) = varRetVal
For i = von To bis
Range("E" & i & ":E" & i) = Mid(Range("D" & i & ":D" & i), 9, 1)
Next
Range("D" & von & ":E" & bis).Sort key1:=Range("E" & i)
varRetVal = Range("D" & von & ":D" & bis)
' ***************** hier sortieren **********
' ab hier vorhandener Code *************
On Error Resume Next
    For n = LBound(varRetVal) To UBound(varRetVal)
' usw.
End Sub
Aber das nur der Vollständigkeit halber.
Rudis Codeschnipsel ist eine Implementation von Bubblesort, z.B. hier nachzulesen:
https://de.wikipedia.org/wiki/Bubblesort
Schöne Grüße,
Michael

Bild

Betrifft: das ist FALSCH!!!!
von: Rudi Maintaire
Geschrieben am: 06.08.2015 16:08:20
Hallo,
mit

Range("D" & von & ":D" & bis) = varRetVal

wird in alle Zellen immer das erste Element von varRetVal geschrieben, da varRetVal 1-dimensional ist (0 to 2).
varRetVal = Range("D" & von & ":D" & bis)

macht aus varRetval ein 2-dimensionales Array (1 to 3, 1 to 1)
Durch einfaches Transponieren wird daraus varRetVal(1 to 3)
Deshalb würde ich per Code sortieren, da die Dimensionen erhalten bleiben. Bei so wenigen Elementen ist die Methode wurscht.
Gruß
Rudi

Bild

Betrifft: AW: das ist FALSCH!!!!
von: Conelius
Geschrieben am: 07.08.2015 08:27:48
Sehr gut! Vielen Dank Rudi Maintaire es klappt!!!

Bild

Betrifft: Vielen Dank für die Korrektur,
von: Michael
Geschrieben am: 07.08.2015 13:30:34
Rudi,
Du hast ja Recht!
Entschuldigung, Cornelius, daß ich Dich auf den falschen Weg geführt habe.
Happy Exceling,
Michael

 Bild

Beiträge aus den Excel-Beispielen zum Thema "Dialogfenster Dateiöffnüngsreihenfolge bestimmen"