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

Forumthread: mehrdimensionales array einlesen sortieren

mehrdimensionales array einlesen sortieren
07.03.2008 10:30:59
chris
Hallo VBA profis,
ich habe ein Problem und komme nicht weiter :((
Bitte deshalb um eure Hilfe.
ich möchte gerne Daten in ein Array einlesen.
Beispiel. Werte_Array
dort möchte ich (beispiel) Spalte A einlesen bis zeile 500 und Spalte B bis zeile 500
Dann möchte ich das array sorieren lassen nach Spalte A
Also das ich auch palte B im array so verändert wie die Daten in spalte A und nicht extra sortiert wird sonst passen die array nummern(Daten) nicht mehr zusammen.
Ich bekomme es aber nicht hin :(((
Hier das was ich bis jetzt habe aber es funktioniert nicht:
For x = 2 To obj_datenbank.Worksheets(1).Cells(obj_datenbank.Worksheets(1).Rows.Count, 2).End(xlUp).Row
ReDim Preserve array_nr(x, x)
array_nr(x - 1, x - 2) = obj_datenbank.Worksheets(1).Cells(x, 2).Value
array_nr(x - 2, x - 2) = obj_datenbank.Worksheets(1).Cells(x, 3).Value
Next

Anzeige

17
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: mehrdimensionales array einlesen sortieren
07.03.2008 10:44:00
Nepumuk
Hallo chris,
einlesen geht so:
Public Sub test()
    Dim vntArray As Variant
    Dim lngIndex As Long
    
    'einlesen ins Array
    vntArray = Range(Cells(2, 1), Cells(Rows.Count, 2).End(xlUp))
    
    'zum testen mal anzeigen
    For lngIndex = LBound(vntArray) To UBound(vntArray)
        Debug.Print vntArray(lngIndex, 1), vntArray(lngIndex, 2)
    Next
End Sub

Gruß
Nepumuk

Anzeige
AW: dieser code
07.03.2008 10:55:35
chris
Hallo noch einmal,
ich verwende jetzt diesen Code zum einlesen:
vntArray = Range(obj_datenbank.Worksheets(1).Cells(2, 2), obj_datenbank.Worksheets(1).Cells(Rows.Count, 3).End(xlUp))
vntArray = WorksheetFunction.Transpose(vntArray)
QuickSort vntArray
und die

Function QuickSort  sieht so aus:
Aber bei mir hängt sich das Programm auf.
Option Explicit
'Zum sortieren von Array


Sub QuickSort(ByRef VA_array, Optional V_Low1, Optional V_high1)
On Error Resume Next
Dim V_Low2, V_high2, V_loop As Integer
Dim V_val1, V_val2 As Variant
If IsMissing(V_Low1) Then
V_Low1 = LBound(VA_array, 1)
End If
If IsMissing(V_high1) Then
V_high1 = UBound(VA_array, 1)
End If
V_Low2 = V_Low1
V_high2 = V_high1
V_val1 = VA_array((V_Low1 + V_high1) / 2)
While (V_Low2  V_val1 And _
V_high2 > V_Low1)
V_high2 = V_high2 - 1
Wend
If (V_Low2  V_Low1) Then Call _
QuickSort(VA_array, V_Low1, V_high2)
If (V_Low2 


Anzeige
AW: mehrdimensionales array einlesen sortieren
07.03.2008 10:47:01
Harald
Hi Chris,
die Sortierung würde ich im Excelsheet vornehmen, ansonsten hast Du einen großen Aufwand beim Sortieren eines Array (falls Du nicht ein Tool im Netzt dafür findest). Danach würde ich die Daten folgendermaßen einlesen:

Sub einlesen
dim aDaten
aDaten = sheets(1).range("A1: B500").value
End Sub

oder


Sub einlesen2
dim aDaten
aDaten = sheets(1).range("A1: B" & sheets(1).usedrange.rows.count).value
End Sub


Probiers mal aus.
Grüße
Harald

Anzeige
AW sortieren noch nepumuk
07.03.2008 10:49:00
chris
Danke aber das geht in meinem fall nichT ;(
Würde mich freuen wenn mir jemand beim sortieren helfen könnte.
Ich hatte mal eine function die hieß Quick sort aber ich weiß nicht ob er mir dieses 2 dimensionale array soriert.
Das einlesen funktioniert so super Nepumuk

AW: mehrdimensionales array einlesen sortieren
07.03.2008 10:54:00
Erich
Hallo Chris,
hier mit dem Sort (von Nepumuk):

Option Explicit
Sub Bsp_Sort()
Dim arrA(), arrS
arrA = Range(Cells(1, 1), Cells(500, 2))
arrS = Array(1, 0)
Call prcSort(arrS, arrA())
Range("D1:E50").Value = arrA()             ' Ausgabe Testarray
End Sub
' http://www.online-excel.de/ _
excel/singsel_vba.php?f=97
'                  Code: Max Kaffl (Nepumuk) 2005
'Quicksort mit mehreren Sortierkriterien
'  Parameter:  arrK = Sortkey(s)
'              arrD = zu sortierendes Array
'Der Sortierschlüssel ist ein Array mit minimal einem Eintrag,
'  Der erste Eintrag gibt die Spalte mit dem obersten Sortierkriterium an.
'  Ist die Zahl positiv, wird aufsteigend, sonst absteigend sortiert.
Sub prcSort(arrK As Variant, arrD() As Variant)
Dim iiK As Integer, nnB As Long, nnC As Long, nArrZ() As Long
Dim nnZ As Long, nnA As Long, vntTemp As Variant
ReDim nArrZ(0 To 1, 0 To UBound(arrD) * 2)
nArrZ(0, 0) = LBound(arrD)                ' Array für den 1. Sortierlauf
nArrZ(0, 1) = UBound(arrD)
nnZ = 1
For iiK = LBound(arrK) To UBound(arrK)
If arrK(iiK)  0 Then                 ' Wenn eine Spalte angegeben
nnA = -1
For nnB = 0 To nnZ Step 2           ' Schleife zum sortieren der Bereiche
If nArrZ(0, nnB)  nArrZ(0, nnB + 1) Then   ' Sortieren, wenn Zeilenzahl größer 1
Call prcQSort(CLng(nArrZ(0, nnB)), _
CLng(nArrZ(0, nnB + 1)), CInt(Abs(arrK(iiK))), _
CBool(arrK(iiK) > 0), arrD())
nnA = nnA + 2                       ' sortierten Bereich merken
nArrZ(1, nnA - 1) = nArrZ(0, nnB)
nArrZ(1, nnA) = nArrZ(0, nnB + 1)
End If
Next
nnZ = -1
For nnB = 0 To nnA Step 2  'Durchsuchen der eben sortierten Spalte nach Wertewechsel
vntTemp = arrD(nArrZ(1, nnB), Abs(arrK(iiK))) '1. Zeile des zu sort. Bereichs
nnZ = nnZ + 1
nArrZ(0, nnZ) = nArrZ(1, nnB)
For nnC = nArrZ(1, nnB) To nArrZ(1, nnB + 1)  ' Suche nach Wechsel im Bereich
If vntTemp  arrD(nnC, Abs(arrK(iiK))) Then
nnZ = nnZ + 2
nArrZ(0, nnZ - 1) = nnC - 1
nArrZ(0, nnZ) = nnC
vntTemp = arrD(nnC, Abs(arrK(iiK)))
End If
Next
nnZ = nnZ + 1                                 ' letzte Zeile im Bereich
nArrZ(0, nnZ) = nArrZ(1, nnB + 1)
Next nnB
End If
Next iiK
End Sub
Private Sub prcQSort(lngLB As Long, lngUB As Long, iiZ As Integer, bAufAb As Boolean, arrD())
Dim iiK As Integer, nnB As Long, nnC As Long, vntTemp As Variant, vntBuffer As Variant
nnB = lngLB
nnC = lngUB
vntBuffer = arrD((lngLB + lngUB) \ 2, iiZ)
Do
If bAufAb Then
Do While arrD(nnB, iiZ)  vntBuffer: nnB = nnB + 1: Loop
Do While vntBuffer > arrD(nnC, iiZ): nnC = nnC - 1: Loop
End If
If nnB  arrD(nnC, iiZ) Then
For iiK = LBound(arrD, 2) To UBound(arrD, 2)
vntTemp = arrD(nnB, iiK)
arrD(nnB, iiK) = arrD(nnC, iiK)
arrD(nnC, iiK) = vntTemp
Next
End If
nnB = nnB + 1
nnC = nnC - 1
ElseIf nnB = nnC Then
nnB = nnB + 1
nnC = nnC - 1
End If
Loop Until nnB > nnC
If lngLB 

Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort

Anzeige
AW: mehrdimensionales array einlesen sortieren
07.03.2008 10:57:00
chris
Hallo Erich,
Vielen Dank.
Verstehe ich zwar nicht aber vielleicht kannst du mir sagen wie ich den code verwenden soll für meinen code.
Wenn du in meinen letzten beitrag schreibst siehst du wie ich bisher sortiere:

AW: mehrdimensionales array einlesen sortieren
07.03.2008 10:57:37
chris
Hallo Erich,
Vielen Dank.
Verstehe ich zwar nicht aber vielleicht kannst du mir sagen wie ich den code verwenden soll für meinen code.
Wenn du in meinen letzten beitrag schreibst siehst du wie ich bisher sortiere:

Anzeige
AW: mehrdimensionales array einlesen sortieren
07.03.2008 11:06:00
Erich
Hallo Chris,
so sollte es gehen:

Sub Bsp_Sort()
Dim vntArray(), arrS
vntArray = Range(obj_datenbank.Worksheets(1).Cells(2, 2), _
obj_datenbank.Worksheets(1).Cells(Rows.Count, 3).End(xlUp))
arrS = Array(1, 0)
Call prcSort(arrS, vntArray())
End Sub

Wie ist bei dir vntArray deklariert?
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort

Anzeige
AW: erich hier ist der fehler
07.03.2008 11:13:01
chris
Also ich habe es so und es klappt leider nichT.
Siehst du einene fehler:?
Dim vntArray
Dim arrS
vntArray = Range(obj_datenbank.Worksheets(1).Cells(2, 2), obj_datenbank.Worksheets(1).Cells(Rows.Count, 3).End(xlUp))
arrS = Array(1, 0)
Call prcSort(arrS, vntArray())
main_project_form.cbo_number.List = vntArray
'main_project_form.cbo_number_zwei.List = vntArray
Das Problem ist auch das ich gerne in die listbox spalte 2 einlesen möchte und in die zweite listbox spalte 3
Wie geht das.
Echt super und vielen Dank für die Hilfe

Anzeige
AW: erich hier ist der fehler
07.03.2008 11:25:55
Erich
Hallo Chris,
kannst du es etwas genauer beschreiben? "Es klappt leider nicht" reicht nicht aus...
Gibt es einen Fehlerabbruch? Wenn ja, in welcher Codezeile, mit welcher Fehlermeldung?
Wenn es keinen Fehlerabbruch gibt: Was kommt jetzt raus, was sollte rauskommen?
vntArray hat zwei Spalten. Die beiden Listboxen sind aber wohl einspaltig, oder?
Dann müsstest du vor ...Listbox.List = xyArray
in einer Schleife die Werte aus vntArray in ein einspaltiges Array xyArray übertragen.
xyArray könntest du anlegen mit Redim xyArray(1 to ubound(vntArray))
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort

Anzeige
AW: mehrdimensionales array einlesen sortieren
07.03.2008 10:56:28
Erich
Hallo Chris,
nochmal ohne Umbruchfehler:

Option Explicit
Sub Bsp_Sort()
Dim arrA(), arrS
arrA = Range(Cells(1, 1), Cells(500, 2))
arrS = Array(1, 0)
Call prcSort(arrS, arrA())
Range("D1:E50").Value = arrA()             ' Ausgabe Testarray
End Sub
'                  bei www.online-excel.de/excel/singsel_vba.php?f=97
'                  Code: Max Kaffl (Nepumuk) 2005
'Quicksort mit mehreren Sortierkriterien
'  Parameter:  arrK = Sortkey(s)
'              arrD = zu sortierendes Array
'Der Sortierschlüssel ist ein Array mit minimal einem Eintrag,
'  Der erste Eintrag gibt die Spalte mit dem obersten Sortierkriterium an.
'  Ist die Zahl positiv, wird aufsteigend, sonst absteigend sortiert.
Sub prcSort(arrK As Variant, arrD() As Variant)
Dim iiK As Integer, nnB As Long, nnC As Long, nArrZ() As Long
Dim nnZ As Long, nnA As Long, vntTemp As Variant
ReDim nArrZ(0 To 1, 0 To UBound(arrD) * 2)
nArrZ(0, 0) = LBound(arrD)                ' Array für den 1. Sortierlauf
nArrZ(0, 1) = UBound(arrD)
nnZ = 1
For iiK = LBound(arrK) To UBound(arrK)
If arrK(iiK)  0 Then                 ' Wenn eine Spalte angegeben
nnA = -1
For nnB = 0 To nnZ Step 2           ' Schleife zum sortieren der Bereiche
If nArrZ(0, nnB)  nArrZ(0, nnB + 1) Then   ' Sortieren, wenn Zeilenzahl größer 1
Call prcQSort(CLng(nArrZ(0, nnB)), _
CLng(nArrZ(0, nnB + 1)), CInt(Abs(arrK(iiK))), _
CBool(arrK(iiK) > 0), arrD())
nnA = nnA + 2                       ' sortierten Bereich merken
nArrZ(1, nnA - 1) = nArrZ(0, nnB)
nArrZ(1, nnA) = nArrZ(0, nnB + 1)
End If
Next
nnZ = -1
For nnB = 0 To nnA Step 2  'Durchsuchen der eben sortierten Spalte nach Wertewechsel
vntTemp = arrD(nArrZ(1, nnB), Abs(arrK(iiK))) '1. Zeile des zu sort. Bereichs
nnZ = nnZ + 1
nArrZ(0, nnZ) = nArrZ(1, nnB)
For nnC = nArrZ(1, nnB) To nArrZ(1, nnB + 1)  ' Suche nach Wechsel im Bereich
If vntTemp  arrD(nnC, Abs(arrK(iiK))) Then
nnZ = nnZ + 2
nArrZ(0, nnZ - 1) = nnC - 1
nArrZ(0, nnZ) = nnC
vntTemp = arrD(nnC, Abs(arrK(iiK)))
End If
Next
nnZ = nnZ + 1                                 ' letzte Zeile im Bereich
nArrZ(0, nnZ) = nArrZ(1, nnB + 1)
Next nnB
End If
Next iiK
End Sub
Private Sub prcQSort(lngLB As Long, lngUB As Long, iiZ As Integer, bAufAb As Boolean, arrD())
Dim iiK As Integer, nnB As Long, nnC As Long, vntTemp As Variant, vntBuffer As Variant
nnB = lngLB
nnC = lngUB
vntBuffer = arrD((lngLB + lngUB) \ 2, iiZ)
Do
If bAufAb Then
Do While arrD(nnB, iiZ)  vntBuffer: nnB = nnB + 1: Loop
Do While vntBuffer > arrD(nnC, iiZ): nnC = nnC - 1: Loop
End If
If nnB  arrD(nnC, iiZ) Then
For iiK = LBound(arrD, 2) To UBound(arrD, 2)
vntTemp = arrD(nnB, iiK)
arrD(nnB, iiK) = arrD(nnC, iiK)
arrD(nnC, iiK) = vntTemp
Next
End If
nnB = nnB + 1
nnC = nnC - 1
ElseIf nnB = nnC Then
nnB = nnB + 1
nnC = nnC - 1
End If
Loop Until nnB > nnC
If lngLB 

Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort

Anzeige
AW: mehrdimensionales array einlesen sortieren
07.03.2008 11:26:00
Harald
Hi Erich, sehr schöne Subs. Kennst Du eine Erweiterung, dass auch weitere Spalten in den Sortierschlüssel eingebunden werden?
Grüße
Harald
P.S.: Zeile 9 Range("D1:E50").Value = arrA() ' Ausgabe Testarray
nach Range("D1:E500").Value = arrA() ' Ausgabe Testarray
ändern.

Anzeige
AW: mehrdimensionales array einlesen sortieren
07.03.2008 11:30:00
Erich
Hi Harald,
das ginge z. B. so:

Sub Bsp_Sort()
Dim arrA(), arrS
arrA = Range(Cells(1, 1), Cells(500, 5))
arrS = Array(0, 1, 0, -1, 0)  ' Sort nach Sp. B aufst./Sp. D abst.
Call prcSort(arrS, arrA())
Range("G1:K500").Value = arrA()             ' Ausgabe Testarray
End Sub

Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort

Anzeige
AW: mehrdimensionales array einlesen sortieren
07.03.2008 12:39:00
Harald
Hi Erich, obiges Beispiel gibt die selben Ergebnisse wie vorher. Aber, ich werde weiterprobieren. Die Subs sind es Wert.
Grüße
Harald

AW: mehrdimensionales array einlesen sortieren
07.03.2008 13:11:06
Nepumuk
Hi ihr zwei,
mit Array(0, 1, 0, -1, 0) sortierst du die Spalte 1 erst aufsteigend und anschließend wieder absteigen (die Null wird ignoriert).
Die Nummer gibt nämlich die zu sortierende Spalte an. Die Reihenfolge im Array gibt die Reihenfolge an wie sortiert wird. Ist in Online-Excel auch so beschrieben. http://www.online-excel.de/excel/singsel_vba.php?f=97
Wenn du also nach Spalte 2 aufsteigend und nach Spalte 4 absteigend sortieren willst, muss das Array so aufgebaut sein: Array(2, -4).
Willst du erst nach Spalte 4 absteigend und anschließend nach Spalte 2 aufsteigend sortieren, dann muss das Array so aufgebaut sein: Array(-4, 2).
Jetzt klar ?
Gruß
Nepumuk

Anzeige
AW: mehrdimensionales array einlesen sortieren
07.03.2008 13:33:00
chris
Wow,
vielen dank euch beiden ! Echt prima danke

AW: mehrdimensionales array sortieren
07.03.2008 13:48:52
Erich
H Max, Harald, Chris,
toll, da hatte ich wohl eine Möglichkeit gesehen, mit viel Aufwand wenig zu erreichen...
Solche Sorts habe ich an vielen Stellen eingesetzt.
Vielleicht hätte ich doch noch mal genauer hinsehen oder auch ein wenig nachdenken sollen,
bevor ich hier das Key-Array "uminterpretiert" habe.
Max, danke für die Richtigstellung!
Ein dickes SORRY und Grüße von Erich aus Kamp-Lintfort
Anzeige
;

Forumthreads zu verwandten Themen

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

Mehrdimensionales Array in Excel VBA einlesen und sortieren


Schritt-für-Schritt-Anleitung

  1. Daten einlesen: Zuerst musst du die Daten in ein mehrdimensionales Array einlesen. Das geht einfach mit folgendem VBA-Code:

    Dim vntArray As Variant
    vntArray = Range("A2:B500").Value
  2. Array sortieren: Um das Array zu sortieren, kannst du die QuickSort-Methode verwenden. Hier ist ein Beispiel für die QuickSort-Funktion:

    Sub QuickSort(ByRef VA_array, Optional V_Low1, Optional V_high1)
        If IsMissing(V_Low1) Then V_Low1 = LBound(VA_array, 1)
        If IsMissing(V_high1) Then V_high1 = UBound(VA_array, 1)
        Dim V_Low2, V_high2, V_loop As Integer
        Dim V_val1, V_val2 As Variant
    
        ' Sortierlogik hier einfügen
    End Sub
  3. Sortieren aufrufen: Nach dem Einlesen der Daten rufst du die QuickSort-Funktion auf:

    Call QuickSort(vntArray)
  4. Daten zurückschreiben: Zum Schluss schreibst du das sortierte Array zurück ins Excel-Sheet:

    Range("D1:E500").Value = vntArray

Häufige Fehler und Lösungen

  • Fehler beim Einlesen: Wenn du beim Einlesen des Arrays einen Fehler bekommst, überprüfe, ob der Bereich korrekt definiert ist. Achte darauf, dass die Zellen existieren und Werte enthalten.

  • Array hängt sich auf: Wenn das Programm beim Sortieren des Arrays abstürzt, könnte dies an einer fehlerhaften Sortierlogik in der QuickSort-Funktion liegen. Stelle sicher, dass die Bedingungen und Schleifen korrekt gesetzt sind.

  • Daten passen nicht zusammen: Achte darauf, dass du das Array richtig sortierst, sodass die Verknüpfung zwischen den Spalten erhalten bleibt.


Alternative Methoden

  • Excel-Funktion verwenden: Anstatt ein Array zu sortieren, könntest du auch die Excel-Funktion Sort verwenden, um die Daten direkt im Sheet zu sortieren. Dies ist oft einfacher und weniger fehleranfällig.

  • Matrix sortieren: Wenn du mit sehr großen Datenmengen arbeitest, könnte es sinnvoll sein, die Daten in eine Tabelle (ListObject) zu konvertieren, die direkt mit Excel-Funktionen sortiert werden kann.


Praktische Beispiele

  1. Einlesen und Sortieren nach einer Spalte:

    Sub SortiereNachSpalte()
        Dim vntArray As Variant
        Dim arrS As Variant
        vntArray = Range("A2:B500").Value
        arrS = Array(1, 0) ' Sortierung nach Spalte 1
        Call prcSort(arrS, vntArray)
        Range("D1:E500").Value = vntArray
    End Sub
  2. Sortieren mit mehreren Kriterien:

    Sub MehrereSortierkriterien()
        Dim arrA As Variant
        arrA = Range("A1:E500").Value
        Dim arrS As Variant
        arrS = Array(2, -4) ' Sortierung nach Spalte 2 aufsteigend und Spalte 4 absteigend
        Call prcSort(arrS, arrA)
        Range("G1:K500").Value = arrA
    End Sub

Tipps für Profis

  • Nutze Option Explicit in deinen Modulen, um sicherzustellen, dass alle Variablen deklariert sind. Dies hilft, Fehler zu vermeiden.

  • Wenn du mit großen Datenmengen arbeitest, erwäge die Verwendung von Arrays anstelle von Zellen, um die Performance zu verbessern.

  • Vertraue auf Debug.Print, um die Werte im Array während des Sortiervorgangs zu überprüfen und Fehler aufzudecken.


FAQ: Häufige Fragen

1. Wie kann ich ein mehrdimensionales Array in Excel VBA einlesen?
Du kannst das Array mit der Range()-Methode einlesen. Beispiel: vntArray = Range("A2:B500").Value.

2. Was ist QuickSort und wie funktioniert es in VBA?
QuickSort ist ein schneller Sortieralgorithmus, der in VBA verwendet werden kann. Du musst eine Funktion implementieren, die das Array entsprechend sortiert.

3. Kann ich mehrere Spalten gleichzeitig sortieren?
Ja, du kannst mehrere Sortierkriterien in einem Array definieren und die Sortierfunktion entsprechend anpassen.

4. Wie gebe ich die Werte eines Arrays in eine Listbox aus?
Du kannst die Werte des Arrays in ein neues Array übertragen und dann der Listbox zuweisen, beispielsweise: ListBox1.List = xyArray.

5. Wo finde ich weiterführende Informationen zu VBA und Arrays?
Es gibt viele Ressourcen online, darunter die Excel-Hilfeseiten und Foren wie online-excel.de.

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