kostenloser Webspace werbefrei: lima-city


array

lima-cityForumProgrammiersprachenBasic

  1. Autor dieses Themas

    zordy

    Kostenloser Webspace von zordy, auf Homepage erstellen warten

    zordy hat kostenlosen Webspace.

    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
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Autor dieses Themas

    zordy

    Kostenloser Webspace von zordy, auf Homepage erstellen warten

    zordy hat kostenlosen Webspace.

    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.
  4. cbhp

    Co-Admin Kostenloser Webspace von cbhp

    cbhp hat kostenlosen Webspace.

    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.
  5. Autor dieses Themas

    zordy

    Kostenloser Webspace von zordy, auf Homepage erstellen warten

    zordy hat kostenlosen Webspace.

    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
  6. cbhp

    Co-Admin Kostenloser Webspace von cbhp

    cbhp hat kostenlosen Webspace.

    Der Code von oben funktioniert auch mit negativen Zahlen, es ist also keine &Auml;nderung notwendig.
    Wenn du es so sortieren willst, dass erst alle Zahlen gleich 25, dann gr&ouml;&szlig;er 25 und dann kleiner 25 aufgelistet werden sollen, ist ein solches Sortierverfahren wie Insertionsort &uuml;berfl&uuml;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&szlig;end alle Zahlen > 25 und danach < 25. W&auml;hrend diesen Vergleichen werden die anderen Zahlen einfach &uuml;bersprungen.

    Du brauchst ein Array mit 2 Dimensionen, deshalb kannst du dein Array mit "ReDim row_nr(136)" nicht deklarieren. Du willst n&auml;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 &auml;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&auml;ngender Datensatz vollst&auml;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&ouml;nnte zwar noch etwas optimiert werden, aber so ist er ganz anschaulich)

    Code:
    http://nopaste.info/8ab3dc3b98.html


    Edit by Felix:
    Bei so gro&#223;en Sache bitte immer NoPaste.info oder &#196;hnliches Benutzen ;)

    LG, Felix


    Beitrag geändert: 10.10.2007 16:15:53 von felixbayer
  7. Autor dieses Themas

    zordy

    Kostenloser Webspace von zordy, auf Homepage erstellen warten

    zordy hat kostenlosen Webspace.

    hi,
    wow danke das ist echt super genau das hab ich gemeint.
    Was ich jetzt noch gerne einbauen w&#252;rde w&#228;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 &#252;berspringen und die n&#228;chste auslesen.
    Es w&#228;re auch sch&#246;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 &#252;berspringt.
    Das w&#228;re dann wirklich Perfekt.
    Danke cbhp du bist echt der Beste!:thumb:
  8. cbhp

    Co-Admin Kostenloser Webspace von cbhp

    cbhp hat kostenlosen Webspace.

    So, nach leichten &Auml;nderungen gibts hier die neue Version:

    Code:
    http://nopaste.info/d91fefc828_nl.html

    Hinweise: Die Reihenfolge der Dimensionen im Array Liste() musste ich &auml;ndern, aber das siehst du im Code. Grund daf&uuml;r ist eine sp&auml;tere erforderliche Redimensionierung, die nur die letzte Dimension &auml;ndern kann.
  9. Autor dieses Themas

    zordy

    Kostenloser Webspace von zordy, auf Homepage erstellen warten

    zordy hat kostenlosen Webspace.

  10. Autor dieses Themas

    zordy

    Kostenloser Webspace von zordy, auf Homepage erstellen warten

    zordy hat kostenlosen Webspace.

    hey ich hab da noch ne bitte:
    kannst du mir das hier noch mal genauer erkl&auml;ren?
    Liste(0, NeueListenposition) = Zeile
    Liste(1, NeueListenposition) = CDbl(Cells(Zeile, Spaltennummer))
  11. cbhp

    Co-Admin Kostenloser Webspace von cbhp

    cbhp hat kostenlosen Webspace.

    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&#252;ck.


    Beitrag geändert: 21.10.2007 21:28:47 von cbhp
  12. Autor dieses Themas

    zordy

    Kostenloser Webspace von zordy, auf Homepage erstellen warten

    zordy hat kostenlosen Webspace.

    danke nochmals
  13. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!