kostenloser Webspace werbefrei: lima-city


algorithmus

lima-cityForumProgrammiersprachenBasic

  1. Autor dieses Themas

    zordy

    Kostenloser Webspace von zordy, auf Homepage erstellen warten

    zordy hat kostenlosen Webspace.

    hallo,
    ich habe probleme mit einem sortieralgorithmus.
    Ich arbeite mit einem excel sheet. In diesem excelsheet gibt es nun Zellen die in einer Spalte B absteigend(unsortiert) aufgereit sind.
    Bei diesen Zellen gibt es nun eine spezifikation. sie sind eingeteilt in 3 Gruppen A, B und C.
    Die Definition der einzelnen Zelle zu einer gruppe steht in der selben reihe allerings in Spalte A.
    Ein anderes VB Prog von mir soll jetzt auf diese Zellen zugreifen(was es genau macht ist jetzt nicht so wichtig da es ja eigentlich um die sortierung geht)
    Bisher geht das Programm die Zellen von oben nach unten durch. Die Sortierung sollte nun so funktionieren (ähnlich wie ein Filter), dass das Prog von oben nach unten zuerst alle von A durchgeht dann B und dann C
    ich habe das sheet so definiert unter einer public cons
    Public Const sheet1 As String = "sheet1"


    so greif ich dann darauf zu:
    Worksheets(sheet1).Cells(sheet1_row + test_nr, sheet_col) <> "")


    Beitrag geändert: 3.10.2007 15:17:11 von zordy
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

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

  3. cbhp

    Co-Admin Kostenloser Webspace von cbhp

    cbhp hat kostenlosen Webspace.

    Eigentlich ist die Umsetzung dafür nicht besonders schwer...

    Aber wie immer erstmal ein paar grundlegende Fragen:
    - Greifst du von einer eigenen Anwendung auf Excel zu oder über VBA?

    Falls du nicht über VBA arbeitest:
    - Wie greifst du auf Excel zu? Über ADO.NET, Excel-Automatisierungs-Objekte, über ein Steuerelement in deiner Anwendung etc.?
    - Welche Version von Visual Basic verwendest du?
  4. Autor dieses Themas

    zordy

    Kostenloser Webspace von zordy, auf Homepage erstellen warten

    zordy hat kostenlosen Webspace.

    ich greife mit vba auf excel zu also: Alt + F11 im Excel
    Die Version ist denke ich 6.0
    kannst du mir helfen?

    Beitrag geändert: 3.10.2007 15:36:02 von zordy
  5. cbhp

    Co-Admin Kostenloser Webspace von cbhp

    cbhp hat kostenlosen Webspace.

    Also willst du in Excel die Spalte B sortieren lassen unter Beachtung der Reihenfolge in Spalte A (je nach Kategorie)...

    Das würde dann so aussehen:
    (Ich hab ein Makro aufgezeichnet und den Code dann etwas angepasst.)
    Sub Sortieren()
        With ActiveWorkbook.Worksheets("Tabelle1")
            .Columns("A:B").Select
            With .Sort
                .SortFields.Clear
                .SortFields.Add Key:=Cells(1, 1), SortOn:=0, Order:=1, DataOption:=0
                .SetRange Selection
                .Header = 2
                .MatchCase = False
                .Orientation = 1
                .SortMethod = 1
                .Apply
            End With
        End With
    End Sub
  6. Autor dieses Themas

    zordy

    Kostenloser Webspace von zordy, auf Homepage erstellen warten

    zordy hat kostenlosen Webspace.

    hey danke!!!

    du bist echt ein genie!!!
    Kannst du mir auch noch eine kurze erklärung posten

    wie müsste ich das machen wenn ich es von diesem einem excelsheet unabhängig programmieren will...
    d.h. die Kategorien und angaben nicht unbedingt in A und B stehen?
    muss er das sheet da durchsuchen oder wie geht das?
    mfg

    wo ich mir nicth sicher bin ob das richtig ist ist ... das ich meinte das nicht direkt die sortierung ins exel eingeschrieben wird sondern eine call funktion diese cells nach der geänderten reihenfolge abarbeitet und in die richtigen zeilen schreibt
    Beitrag geändert: 4.10.2007 8:23:15 von zordy

    Beitrag geändert: 4.10.2007 11:13:15 von zordy
  7. cbhp

    Co-Admin Kostenloser Webspace von cbhp

    cbhp hat kostenlosen Webspace.

    Hier der Code nochmal mit ein paar Kommentaren:

    Sub Sortieren()
    
        ' Hier wird der Sheetname eingegeben, dies kann auch als Index-Zahl erfolgen
        With ActiveWorkbook.Worksheets("Tabelle1")
    
            ' Hier werden die Spalten markiert, die sortiert werden sollen
            ' (Die komplette Spalte wird sortiert, z.B. Spalten A bis B (A:B) oder B bis F (B:F)
            .Columns("A:B").Select
    
            With .Sort
    
                ' Alle bisherigen Filterregeln löschen
                .SortFields.Clear
    
                ' Neue Filterregeln definieren, und zwar soll absteigend sortiert werden (Order)
                ' und es soll die Reihenfolge in Spalte A (=1) beachtet werden, deshalb muss man
                ' Cells(1, spalte) schreiben. Die erste 1 (=Zeile) ist nicht weiter zu beachten.
                .SortFields.Add Key:=Cells(1, 1), SortOn:=0, Order:=1, DataOption:=0
    
                ' Der Bereich, der sortiert werden soll, in diesem Fall also der markierte Bereich
                .SetRange Selection
    
                ' In den Spalten befinden sich keine Überschriften (=2)
                .Header = 2
    
                ' Groß- und Kleinschreibung unterscheiden?
                .MatchCase = False
    
                ' Sortierrichtung, hier sortiert nach Spalten (=1)
                .Orientation = 1
    
                ' Sortiermethode, hier PinYin (=1)
                .SortMethod = 1
    
                ' Einstellungen anwenden und ausführen
                .Apply
            End With
        End With
    End Sub



    Wolltest du Zellen nicht im Original sortieren sondern das Ergebnis woanders ausgeben?
    Dann kopiere die Daten einfach in andere Spalten und lass sie dann sortieren.

    Wenn du die Zellen eigentlich gar nicht sortiert haben wolltest sondern nur so, dass die Funktion die Zellen der Reihenfolge nach abarbeitet, dann musst du die Daten in ein Array lesen und dann sortieren, oder die Daten in andere Spalten kopieren, sortieren lassen und dann wieder löschen..

    Beitrag geändert: 4.10.2007 11:28:15 von cbhp
  8. Autor dieses Themas

    zordy

    Kostenloser Webspace von zordy, auf Homepage erstellen warten

    zordy hat kostenlosen Webspace.

    Oh... okay das hab ich vergessen...
    Wie mach ich das wenn ich oben eine überschrift habe (also einen header) der bis zur Spalte 15 geht
    bezieht sich das:
    .Header = 2
    auf die 2 spalten muss ich jetzt 15 hinschreiben?

    Sorry, ich hab da noch was vergessen und hoffe, dass du mir hier auch weiterhelfen kannst...
    ich hab bei meinem ersten post von zellen geschrieben... ist es jetzt ganz anders wenn ich die ganze dazugehörige Reihe sortieren möchte(also nicht nur A und B in Reihe 16 sondern von A - Z in der Reihe 16)?
    ändert sich hier dann hier Order und SortOn?
    .SortFields.Add Key:=Cells(1, 1), SortOn:=0, Order:=1, DataOption:=0



    Wenn du die Zellen eigentlich gar nicht sortiert haben wolltest sondern nur so, dass die Funktion die Zellen der Reihenfolge nach abarbeitet, dann musst du die Daten in ein Array lesen und dann sortieren, oder die Daten in andere Spalten kopieren, sortieren lassen und dann wieder löschen..

    Ich denke am saubersten programmier wäre es wenn ich es zuerst in ein Array lese und dann sortiere.
    ich weiß das man mit arrays vergleichen kann
    ActiveSheet.Columns("A:B").AutoFit

    aber wie das in diesem fall geht ist mir nicht ganz klar.

    Also ich finde wirklich du hättest einen bezahlten Moderator posten in diesem forum verdient!
    danke nochmals für deine hilfe!

    Beitrag geändert: 4.10.2007 14:15:59 von zordy
  9. cbhp

    Co-Admin Kostenloser Webspace von cbhp

    cbhp hat kostenlosen Webspace.

    Hier noch einmal der Code, diesmal hab ich die Zahlen durch durch Excel-Konstanten ersetzt, damit es verständlicher wird.

    Sub Sortieren()
    
        ' Hier wird der Sheetname eingegeben, dies kann auch als Index-Zahl erfolgen
        With ActiveWorkbook.Worksheets("Tabelle1")
    
            ' Hier werden die Spalten markiert, die sortiert werden sollen
            ' Beispiele: Spalten A bis Z ("A:Z") oder B bis F ("B:F")
            .Columns("A:B").Select
    
            With .Sort
    
                ' Löscht alle bisherigen Filterregeln.
                .SortFields.Clear
    
                ' Erstellt ein neues Sortierfeld.
                ' - Key:        Gibt einen Schlüsselwert für die Sortierung an. Muss ein Range-Objekt sein, also z. B. eine Zelle.
                '               Cells(1, columnindex) bedeutet, dass unter Beachtung der Spalte columnindex sortiert werden soll.
                ' - SortOn:     Das Feld, nach dem sortiert werden soll. (xlSortOnCellColor, xlSortOnFontColor, xlSortOnIcon, xlSortOnValues)
                ' - Order:      Gibt die Sortierreihenfolge an. (xlAscending, xlDescending)
                ' - DataOption: Gibt die Datenoption an. (xlSortNormal , xlSortTextAsNumbers)
                .SortFields.Add Key:=Cells(1, 1), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
    
                ' Legt die Position des Anfangs- und Endzeichens für das Sort-Objekt fest.
                .SetRange Selection
    
                ' Gibt an, ob die erste Zeile Überschrifteninformationen enthält. (xlNo, xlYes, xlGuess)
                .Header = xlNo
    
                ' Unterscheiden von Groß- und Kleinschreibung. (True, False)
                .MatchCase = False
    
                ' Gibt die Sortierrichtung an. (xlSortColumns, xlSortRows)
                .Orientation = xlSortColumns
    
                ' Wendet das kopierte Sortierungsformat an.
                .Apply
            End With
        End With
    End Sub



    Wenn du eine Überschrift hast (diese darf nur in Zeile 1 sein), dann must du .Header = xlYes schreiben, sonst muss nichts angepasst werden. Diese Option greift für alle Spalten.

    Wenn du nicht nur die Spalten A und B sortieren willst nach der Reihenfolge, die in Spalte A angegeben ist, dann vergrößerst du einfach die Markierung, z.B. .Columns("A:Z" ).Select
    Sonst muss nichts geändert werden.



    Wenn du die Daten aber unsortiert in ein Array einlesen willst und dann das Array sortieren willst, funktioniert das ganz anders.
    So würde der Anfang dafür aussehen:

    Sub Array_Sortieren()
    
        Const Spaltenanzahl As Integer = 26     ' Hier: Spalte A bis Z
        Const Zeilenanzahl As Integer = 100     ' Hier: Zeile 1 bis 100
        
        Dim MeinArray(1 To Zeilenanzahl, 1 To Spaltenanzahl) As String
        
        Dim Spalte As Integer
        Dim Zeile As Integer
        
        ' Hier wird jede Zelle in das Array eingelesen.
        For Zeile = 1 To Zeilenanzahl
            For Spalte = 1 To Spaltenanzahl
                MeinArray(Zeile, Spalte) = Cells(Zeile, Spalte)
            Next Spalte
        Next Zeile
    
        ' Hier würde weiterer Code folgen, z.B. zum Sortieren des Arrays
        ' VBA bietet für das Sortieren von Arrays keine interne Funktion
        ' an, aber man kann sich selber eine Funktion dafür schreiben =)
    
        MsgBox MeinArray(1, 1)
    
    End Sub



    zordy schrieb:
    Also ich finde wirklich du hättest einen bezahlten Moderator posten in diesem forum verdient!
    danke nochmals für deine hilfe!


    ;) Vielleicht irgendwann =)

    cbhp

    Beitrag geändert: 4.10.2007 19:20:35 von cbhp
  10. Autor dieses Themas

    zordy

    Kostenloser Webspace von zordy, auf Homepage erstellen warten

    zordy hat kostenlosen Webspace.

    hallo, nochmal,

    Hier würde weiterer Code folgen, z.B. zum Sortieren des Arrays
    ' VBA bietet für das Sortieren von Arrays keine interne Funktion
    ' an, aber man kann sich selber eine Funktion dafür schreiben =)

    Kannst du mir noch hierbei helfen?
    warum ist das sortieren eines arrays anders... warum könnte ich jetzt nicht einfach den code zum sortieren des exelsheets einfügen.
    Ich hab dir ja gesagt das ich nach eingeteilten Gruppen sortieren möchte (ABC)
    Wenn ich mir jetzt aber nicht die Arbeit antun will jeweils immer ABC vornehin zuschreiben... es wär auch sauberer wenn ich anders sortieren würde.In meinem excelsheet sind die gruppen so definiert
    ZU gruppe A gehört die Zahl 5, zu B alle Zahlen bis 10 die größer als 5 sind und C = 0-4(also <5)
    Ich wollte sie jedoch in dieser Reihenfolge sortieren das zuerst alle Reihen sind die 5 haben dann alle die >5 und am Schluss <5...
    muss ich da für ABC jeweils ein eigenes Array machen?


    Beitrag geändert: 5.10.2007 8:43:09 von zordy
  11. cbhp

    Co-Admin Kostenloser Webspace von cbhp

    cbhp hat kostenlosen Webspace.



    zordy schrieb:
    Kannst du mir noch hierbei helfen?
    warum ist das sortieren eines arrays anders... warum könnte ich jetzt nicht einfach den code zum sortieren des exelsheets einfügen.
    Ich hab dir ja gesagt das ich nach eingeteilten Gruppen sortieren möchte (ABC)
    Wenn ich mir jetzt aber nicht die Arbeit antun will jeweils immer ABC vornehin zuschreiben... es wär auch sauberer wenn ich anders sortieren würde.In meinem excelsheet sind die gruppen so definiert
    ZU gruppe A gehört die Zahl 5, zu B alle Zahlen bis 10 die größer als 5 sind und C = 0-4(also <5)
    Ich wollte sie jedoch in dieser Reihenfolge sortieren das zuerst alle Reihen sind die 5 haben dann alle die >5 und am Schluss <5...
    muss ich da für ABC jeweils ein eigenes Array machen?


    Für das Sortieren eines Arrays brauchst du deshalb einen anderen Code als die Sort-Methode von Excel, weil die Sort-Methode nur interaktiv mit dem Tabellenblatt arbeiten kann und mit nichts anderem. (Das Array stellt keine Excel-Tabelle dar.)

    Also den Aufbau deiner Tabelle hab ich nur zum Teil verstanden, am besten wäre es, wenn du eine Beispieltabelle mal zeigen kannst (unsortiert und sortiert), Screenshot etc.

    Ein Array kannst du so groß dimensionieren, wie du es brauchst, also müsstest du alles in das Array bringen könnnen.

    Den Code zum Sortieren eines Arrays hab ich mal in Informatik geschrieben, aber den muss ich erst wieder suchen. Das Prinzip ist ganz einfach für eine alphabetische/numerische Sortierung:
    Du baust eine Schleife, die solange arbeitet, bis jeder Eintrag kleiner ist als der nächstgrößere. Ist dies nicht der Fall, so vertauscht du die beiden Einträge, da immer nur zwei Einträge zugleich betrachtet werden.
    Du kannst es ja selber probieren, das ist eine ideale Übung =)
    Vielleicht find ich den Code in den nächsten Tagen...
  12. 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!