array
lima-city → Forum → Programmiersprachen → Basic
array
beginnen
beitrag
blatt
cell
daten
dimension
doubeln
exit
listen
not
recht
reihen
spalt
spalten
stehen
typ
verweisen
zeile
zeilennummer
-
Hallo,
ich möchte einen dynamischen zweidimensionalen array machen.und dieser array sollte durch einen logarythmus sortiert werden.
Das ganze progge ich unter VBA für Excel.
Dieses Zweidimensionale Array sollte aus zwei spalten bestehen. Die erste ist die Zeilennummer.
Die zweite Spalte besteht aus Zahlenwerten von 1-10. Dabei sollten die Reihen so sortiert werden, dass die Zahlenwerte >5 beginnen 5 und dann die zahlenwerte <5...
Beispiel:
Znr Zahlenwert
1........6
2........5
3........1
Ist es möglich dass ich die Zahlenwerte z.B. 7 mit der zugehörigen Znr sortiere.
Bin für jede Hilfe dankbar.
ich glaube die sortierung könnte mit diesm code funktioneierne:
Sub BubbleSort(ByRef sArray As Variant) ' ' BubbleSort() ' ' Sortieren eines Arrays mit dem BubbleSort-Algorithmus ' ' IN: sArray das zu sortierende Array ' Dim j As Long ' Zähler Dim i As Long ' noch ein Zähler Dim vDummy As Variant ' Dummy für Dreiecks-Tausch ' ' Schleife über alle Elemente des Arrays ' For j = UBound(sArray) - 1 To LBound(sArray) Step -1 ' ' Schleife vom Anfang des Arrays bis zum (n - j)'ten ' Element des Arrays ' For i = LBound(sArray) To j ' ' Prüfen, ob der Nachfolger kleiner als das ' aktuelle Element ist ' If sArray(i) > sArray(i + 1) Then ' ' Werte der Elemente vertauschen ' vDummy = sArray(i) sArray(i) = sArray(i + 1) sArray(i + 1) = vDummy End If Next i Next j End Sub
Beitrag geändert: 5.10.2007 14:09:36 von zordy -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Das Problem ist ja, dass wenn ich dieses hier habe:
1 8
2 5
3 4
4 2
5 3
6 4
7 9
8 1
Dies sind die Zahlen im Excelsheet Links ist die leiste mit den aufsteigenden zahlen und rechts ist eine spalte. Ich will nun die rechte spalte in einen array packen.
Dieser array sollte sortiert werde...allerdings sollten dann auch die passenden Zahlen an der richtigen stelle stehen. -
Hier ist mal ein Beispiel zum Sortieren eines Array mit nur einer Dimension (=mit einer Spalte):
Sub SortList_Simple() 'Für Arrays mit einer Dimension Dim List(1 To 3) As Integer List(1) = 10 List(2) = -2 List(3) = 4 'Sortierverfahren nach "Insertionsort" Dim Index As Integer Dim Cache As Integer Dim PreIndex As Integer For Index = LBound(List) + 1 To UBound(List) Cache = List(Index) PreIndex = Index - 1 Do While PreIndex > LBound(List) - 1 If Not List(PreIndex) > Cache Then Exit Do List(PreIndex + 1) = List(PreIndex) PreIndex = PreIndex - 1 Loop List(PreIndex + 1) = Cache Next Index End Sub
Und hier für deinen Fall angepasst:
Ich hab angenommen, dass du nur die Daten aus Spalte A brauchst aus dem Tabellenblatt und die Zeilennummer automatisch miteingefügt wird ins Array.
Dazu sieht das Sortierverfahren so aus:
Sub SortList_Extra() 'Für Arrays mit zwei Dimensionen 'Sortiert wird nach der zweiten Dimension 'Beispieldaten... Const Zeilenanzahl As Integer = 5 ' Hier: Zeile 1 bis 5 Dim List(1 To Zeilenanzahl, 1 To 2) As Integer Dim Zeile As Integer For Zeile = 1 To Zeilenanzahl List(Zeile, 1) = Zeile 'Zeilennummer, später CacheRow List(Zeile, 2) = Cells(Zeile, 1) 'Daten, später CacheSort Next Zeile 'Sortierverfahren nach "Insertionsort" Dim Index As Integer Dim CacheSort As Integer Dim CacheRow As Integer Dim PreIndex As Integer For Index = LBound(List) + 1 To UBound(List) CacheSort = List(Index, 2) CacheRow = List(Index, 1) PreIndex = Index - 1 Do While PreIndex > LBound(List) - 1 If Not List(PreIndex, 2) > CacheSort Then Exit Do List(PreIndex + 1, 2) = List(PreIndex, 2) List(PreIndex + 1, 1) = List(PreIndex, 1) PreIndex = PreIndex - 1 Loop List(PreIndex + 1, 2) = CacheSort List(PreIndex + 1, 1) = CacheRow Next Index MsgBox ("Fertig sortiert.") End Sub
Die Liste "List" ist so aufgebaut: List(Spaltennummer, Zeilennummer)
In Spalte 1 stehen die originalen Zeilennummern des Tabellenblatts, in Spalte 2 stehen deine Daten, und zwar sortiert. -
wow...
Wird jetzt eigentlich nicht die ganze reihe sortiert sondern nur die eine spalte mit den daten.
Ich musste jetzt noch mal eine Änderung an dem Sheet jetzt nochmal was ändern. Und zwar stehen da nun keine Zahlen mehr von 0-10 sondern Zahlen von -150 bis 50
Und ich soll nun so sortieren dass Reihen in denen die Zahlen mit 25 beginne am Anfanf stehen(im Array) dann alle Zahlen die größer als 25 sind und dann alle kleineren(auch negative Zahlen).
muss ich da jetzt den Insertionsort ändern?
Wie verweise ich mit dieser Funktion auf meinen Array den ich so definiert habe:
Dim Array() as Integer ReDim row_nr(136)
__________________
Zordy bewundert cbhp
Beitrag geändert: 9.10.2007 8:07:20 von zordy
Beitrag geändert: 9.10.2007 8:09:00 von zordy -
Der Code von oben funktioniert auch mit negativen Zahlen, es ist also keine Änderung notwendig.
Wenn du es so sortieren willst, dass erst alle Zahlen gleich 25, dann größer 25 und dann kleiner 25 aufgelistet werden sollen, ist ein solches Sortierverfahren wie Insertionsort überflüssig, denn es kann nur absteigend oder aufsteigend sortieren.
Deshalb muss man die Abfrage so gestalten: Zuerst werden alle Zahlen = 25 in das Array gelesen, anschließend alle Zahlen > 25 und danach < 25. Während diesen Vergleichen werden die anderen Zahlen einfach übersprungen.
Du brauchst ein Array mit 2 Dimensionen, deshalb kannst du dein Array mit "ReDim row_nr(136)" nicht deklarieren. Du willst nämlich (1.) die Zeilennummer speichern des Wertes und (2.) den Wert selbst. Die Zeilennummer kannst du ja auch nicht aus dem Tabellenblatt nehmen, weil sich die Reihenfolge ändert durch die Sortierung.
Somit muss das Array so delariert werden:
Dim Liste(Bereich1, Bereich2) As Datentyp
In Bereich1 werden die Zeilennummern eingetragen, in Bereich2 die Werte zu den entsprechenden Zeilen. Bei der Sortierung muss dann auch darauf geachtet werden, dass ein zusammenhängender Datensatz vollständig verschoben wird, also sowohl die Daten aus Bereich1 als auch die Daten aus Bereich2.
Wenn man auf die Schnelle sich den Code schreibt, sieht das in etwa so aus:
(Könnte zwar noch etwas optimiert werden, aber so ist er ganz anschaulich)
Code:
http://nopaste.info/8ab3dc3b98.html
Edit by Felix:
Bei so großen Sache bitte immer NoPaste.info oder Ähnliches Benutzen ;)
LG, Felix
Beitrag geändert: 10.10.2007 16:15:53 von felixbayer -
hi,
wow danke das ist echt super genau das hab ich gemeint.
Was ich jetzt noch gerne einbauen würde wäre das man wieder eine Const. macht:
Const enabled_column As Integer = 10
die erkennen soll ob da X oder x eingetragen ist zur aktivierung des ganzen.
Wenn keins eingetragen ist dann sollte das prog diese zeile überspringen und die nächste auslesen.
Es wäre auch schön wenn das bei der Data funktioniert. D.h. wenn weder irgend eine Zahl eingetragen ist(25,<25,>25), dass er die Zeile dort auch überspringt.
Das wäre dann wirklich Perfekt.
Danke cbhp du bist echt der Beste! -
So, nach leichten Änderungen gibts hier die neue Version:
Code:
http://nopaste.info/d91fefc828_nl.html
Hinweise: Die Reihenfolge der Dimensionen im Array Liste() musste ich ändern, aber das siehst du im Code. Grund dafür ist eine spätere erforderliche Redimensionierung, die nur die letzte Dimension ändern kann. -
danke
-
zordy schrieb:
Liste(0, NeueListenposition) = Zeile
Liste(1, NeueListenposition) = CDbl(Cells(Zeile, Spaltennummer))
Wenn du dir das vorstellen willst, kannst du z.B. sagen dass 0 bzw. 1 die Spalte in der Liste angibt und NeueListenposition die Zeile in der Liste.
In der ersten Spalte (=0) der Liste sollen die Zeilennummern des Excel-Blattes gespeichert werden und
in der zweiten Spalte (=1) der Liste soll der Zellinhalt einer bestimmten Zelle des Blattes gespeichert werden.
CDbl() wandelt ein Objekt in eine Zahl des Typs Double um.
Cells(Zeile, Spaltennummer) gibt den Zellinhalt einer Zelle im Blatt zurück.
Beitrag geändert: 21.10.2007 21:28:47 von cbhp -
danke nochmals
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage