Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
956to960
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
956to960
956to960
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
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

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:

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

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.

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

7 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige