Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1040to1044
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Sortierung v. Array n. Dimensionentausch fehlerh.

Sortierung v. Array n. Dimensionentausch fehlerh.
23.01.2009 14:51:00
Andreas
Hallo Herber Fans,
ich versuche mich gerade an der Sortierung eines Arrays. In einer ersten Version von Erich wurde das Array mit Row und Column Angaben von Fundstellen befüllt und anschließend so sortiert, daß die Fundstellen ausgehend von Cells(1,1) in ihrer korrekten Reihenfolge erscheinen. Da ich die Suchkriterien modifizierte, um den Code weniger anfällig zu machen, bekam ich einen Fehler im Redim Preserve, da die erste Dimension Redimed werden sollte, was nicht geht. Also habe ich es umgestellt. Zwei Fixe Zeilen im Array, dafür werden die Spalten entsprechend der Anzahl der Fundstellen neu dimensioniert. Nun funktioniert die Sortierung nicht mehr. Ich ahnte es schon und habe mich seit ca. Zwei Stunden an der Fehlerbehebung versucht. In Sachen Array komme ich schon ganz gut klar, aber mit einer Sortierung nach zwei Kriterien noch nicht. Der Code ist für meinen Kenntnisstand zu komplex.
Ich will diesen aber als Beispiel verwenden, um es zu lernen.
Kann mir einer von Euch sagen, an welcher entscheidenden Stelle der Fehler liegt? Was muß ich umstellen, damit es funktioniert.
Wenn ich diesen und einen funktionierenden Code miteinander vergleiche, hoffe ich die Logik zu kapieren.
https://www.herber.de/bbs/user/58724.xls
Vielen Dank und Grüße, Andreas

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Sortierung v. Array n. Dimensionentausch fehlerh.
23.01.2009 15:45:00
bst
Hi Andreas,
M.E. geht das so nicht da der Quicksort von Max immer zeilenweise sortiert, auch wenn Du die Spaltennummern nach denen sortiert werden soll in einem Array vorgeben kannst.
Versuche das vielleicht mal so.
cu, Bernd
--
Option Explicit

'# # # Codes für die Guided Tour_START # # #
Sub FindCells()
    Dim SuchRange As Range, rngF As Range, rngC As Range
    Dim arrZs(), lngA As Long, lngC As Long, i As Long
    
    Set rngF = Range(Cells(1, 1), Cells(40, 15)).SpecialCells(xlCellTypeAllValidation)
    
    i = 0
    ' Array gross genug machen, dann spart man sich die vielen Preserves
    Redim arrZs(1 To 2, 1 To rngF.Count)
    For Each rngC In rngF
        If rngC.Validation.ShowInput = True Then
            i = i + 1
            arrZs(1, i) = rngC.Row
            arrZs(2, i) = rngC.Column
        End If
    Next rngC
    
    ' einer am Ende muss nun aber (meistens) sein
    If i <> UBound(arrZs, 2) Then Redim Preserve arrZs(1 To 2, 1 To i)
    ' Zeilen und Spalten im Array vertauschen
    arrZs = WorksheetFunction.Transpose(arrZs)
    
    'TESTDEBUG
    For i = 1 To UBound(arrZs)
        Debug.Print "unsorted: Rows("; arrZs(i, 1); ") Column("; arrZs(i, 2); ")"
    Next i
    
    prcQuicksort Array(1, 2), arrZs()
    
    'TESTDEBUG
    Debug.Print vbLf
    For i = 1 To UBound(arrZs)
        Debug.Print "sorted : Rows("; arrZs(i, 1); ") Column("; arrZs(i, 2); ")"
    Next i
    
    For i = 1 To UBound(arrZs)
        Cells(arrZs(i, 1), arrZs(i, 2)).Select 'Die Reihenfolge ist vertauscht?
        'Die Reihenfolge der Aktivierung ist derzeit: Meldung 1, 2, 3, 4
        'Soll aber sein: Meldung 1, 4, 3, 2
        Application.Wait Now + TimeSerial(0, 0, 2)
    Next i
End Sub


Anzeige
AW: Sortierung v. Array n. Dimensionentausch fehlerh.
23.01.2009 16:28:49
Andreas
Hallo Bernd,
vielen Dank! Das funktioniert! Ich hatte den Befehl Transpose schon wieder vergessen... In meinem ersten komplexeren Array hatte ich die Spalten immer erweitert und es ging. Da es hier anders benötigt wird, ist Transpose Obligatorisch.
Auch der Ansatz mit der initalen Dimensionierung eines Arrays ausreichend groß und dann zum Schluß auf die benötigte Größe eindampfen macht nun Sinn. Ich hatte ja permanent neu dimensioniert.
Alles in allem wieder clevere Sachen gelernt.
Habe Dank und ein schönes bevorstehendes Wochenende.
Grüße, Andreas
AW: Sortierung v. Array n. Dimensionentausch fehlerh.
23.01.2009 16:36:46
bst
Hi Andreas,

Da es hier anders benötigt wird, ist Transpose Obligatorisch.


Nicht unbedingt. Du könntest auch das Array anders herum aufbauen, also am Anfang als Redim arrZs(1 To rngF.Count, 1 To 2) dimensionieren und am Ende entweder:
a) nur die benutzten Zeilen umkopieren mit einer Art 'Slice' Funktion
b) dem Quicksort die Grenzen übergeben und die 'unbelegten' Array-Zeilen dort sowie im restlichen Programm einfach ignorieren
Ebenfalls ein schönes Wochenende,
Bernd

Anzeige
AW: Sortierung v. Array n. Dimensionentausch fehlerh.
23.01.2009 17:01:01
Andreas
Hallo Bernd,
wir hatten uns zwar schon verabschiedet, aber da ich gerade die "geistige Rüstzeit" schon investiert habe, probierte ich auch Deinen Folgevorschlag aus. Dieser Code bringt nun den Debugger im ReDim des Arrays, daß der Index außerhalb des gültigen Bereiches ist. Und das an der gleichen Stelle, wo ich ihn schon einmal vor ca. 5 Tagen hatte und deswegen auch im Forum war.
Ich kann mir keinen Reim drauf machen. Obwohl mit Transpose ja ein funktionierender Code existiert, möchte ich auch Deinen zweiten Vorschlag umsetzen um zu verstehen.
Habe ich es richtig angepaßt? Warum kommt der Debugger?
Ich würde mich sehr freuen, wenn Du noch einen Blick drauf werfen könntest. Modifiziert habe ich den Sub „FindCells_ArrayAndersAufgebaut“
https://www.herber.de/bbs/user/58734.xls
Dank und Gruß, Andreas
Anzeige
AW: Sortierung v. Array n. Dimensionentausch fehlerh.
23.01.2009 17:45:00
bst
Hi Andreas,

ReDim Preserve arrZs(1 To i, 1 To 2)


das geht nicht. Mit M$ VBA kannst Du nur die letzte Dimension verändern, Open Office hat dieses Problem anscheinend nicht ;-)
Hier die Variante a) mit einem Slice.
HTH, Bernd
--
If i UBound(arrZs, 1) Then arrZs = Slice2(arrZs, 1, i, 1, 2)
sowie:

Function Slice2(ar As Variant, i1 As Long, i2 As Long, j1 As Long, j2 As Long) As Variant
    Redim arNeu(1 To i2 - i1 + 1, 1 To j2 - j1 + 1)
    Dim i As Long, j As Long
    For i = i1 To i2
        For j = j1 To j2
            arNeu(i - i1 + 1, j - j1 + 1) = ar(i, j)
        Next
    Next
    Slice2 = arNeu
End Function


Anzeige
AW: Sortierung v. Array n. Dimensionentausch fehlerh.
23.01.2009 17:50:55
Andreas
Hallo Bernd,
deswegen stutzte ich ja. OK, da nur die letzte Dimension veränderbar ist, geht es nicht. Das deckt sich mit meinem bisherigen Wissen.
Auch ein Auschluß einer Möglichkeit ist neues Wissen ;-)
Dank und Gruß, Andreas

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige