ich hab da nen kleines makro geschrieben welches eigentlich die zeilen eines ausgewählten Bereiches sortieren soll.
Leider muß ich feststellen das es nicht funktionert so wie ich es will. Genau genommen passiert gar nix .
sub main
dim count as integer
dim zero as integer
Dim SortierKrit(3) As new com.sun.star.beans.PropertyValue
Dim SortierFeld(0) As new com.sun.star.table.TableSortField
dim check as double
dim colour as long
dim fil as object
count = 1
check = 1
colour = 16777062
do while check >0
count = count + 1
check = thisComponent.sheets(0).getCellByPosition(0,count).value
loop
SortierFeld(0).field = 5
SortierFeld(0).IsAscending = false
SortierFeld(0).FieldType = com.sun.star.util.SortFieldType.ALPHANUMERIC
SortierKrit(0).Name = "SortFields"
SortierKrit(0).Value = SortierFeld()
SortierKrit(1).Name = "SortColumns"
SortierKrit(1).Value = true
SortierKrit(2).Name = "ContainsHeader"
SortierKrit(2).Value = false
SortierKrit(3).Name = "IsCaseSensitive"
SortierKrit(3).Value = false
fil = thiscomponent.sheets(0).getcellrangebyposition(0,1,9,count).sort(SortierKrit())
end sub
danke wie immer schonmal im vorraus
Zuletzt geändert von der_Zerstreute am Fr, 21.02.2014 09:14, insgesamt 1-mal geändert.
der_Zerstreute hat geschrieben:
ich hab da nen kleines makro geschrieben welches eigentlich die zeilen eines ausgewählten Bereiches sortieren soll
.
.
SortierKrit(1).Name = "SortColumns"
SortierKrit(1).Value = true
Du willst nach Zeilen sortieren, schreibst aber in deinem Makro, dass es nach Spalten sortieren soll. Schreibe mal:
ich habe die Zeile noch angepasst aber es funktioniert trotzdem nicht ..
vieleicht könnt ihr mir besser helfen wenn ihr die Tabelle kennt die er sortieren soll.
Ich pack also mal anbei ein Bildschirmausschnitt von der Tabelle.
Ziel des Makros soll es sein die Spalte "aktuell" (F) von groß nach klein zu sortieren .
Am Anfang des Makros ist eine Schleife die erkennen soll von wo sich der letzte Eintrag in der Tabelle befindet um den zu markierenden Bereich zu definieren.
Eines vorweg. Du wirst schneller und mehr Antworten bekommen, wenn du die Calc-Datei als Datei und nicht als Bild anhängst.
Es ist nämlich eine ganz schöne Tiparbeit, um eine Testdatei zu erzeugen, was wohl nicht jedermanns Sache ist.
Ich habe deinen Code berichtigt. Hier das Ergebnis.
sub main
dim count as integer
dim zero as integer
Dim SortierKrit(3) As new com.sun.star.beans.PropertyValue
Dim SortierFeld(0) As new com.sun.star.table.TableSortField
dim check as double
dim colour as long
dim fil as object
count = 1
check = 1
colour = 16777062
do while check >0
count = count + 1
check = thisComponent.sheets(0).getCellByPosition(0,count).value
loop
SortierFeld(0).field = 5
SortierFeld(0).IsAscending = false
SortierFeld(0).FieldType = com.sun.star.util.SortFieldType.AUTOMATIC
SortierKrit(0).Name = "SortFields"
SortierKrit(0).Value = SortierFeld()
SortierKrit(1).Name = "SortColumns"
SortierKrit(1).Value = false
SortierKrit(2).Name = "ContainsHeader"
SortierKrit(2).Value = false
SortierKrit(3).Name = "IsCaseSensitive"
SortierKrit(3).Value = false
thiscomponent.sheets(0).getcellrangebyposition(0,2,9,count).sort(SortierKrit())
end sub
Welche Formatierung meinst du? Vielleicht kannst du deine Wünsche noch etwas erläutern.
Wenn du die gelbe Markierung für die Null-Restbestände meinst, würde ich dazu kein Makro verwenden, sondern eine Bedingte Formatierung. Bedingung: Die Zeile soll gelb sein, wenn Restbestand = 0.
Beim Sortierungsvorgang gibt es meines Wissens keine Möglichkeit, das Mitsortieren der Formatierung zu unterbinden. Das ist auch nicht sinnvoll, da sich Formatierungen ja nicht nur auf Rahmen beschränken, sondern z.B auch auf Datums und Zahlenformate.
Im Makro kann man allerdings zunächst den Rahmen auf "dünn" setzen um ihn am Ende wieder auf den Ursprung zurückzusetzen.
Ich habe das mal in dein Makro eingebaut. Die Rahmenstärke musst du dabei noch überprüfen. Diese habe ich nur geschätzt.
Ich habe heute festgestellt, dass es beim Sortieren über das Menü eine Einstellung gibt, die das Sortieren von Formaten verhindert. Leider ist mir die entsprechende Einstellung in Starbasic nicht bekannt. Ich habe daher jetzt das Sortieren mit dem Makrorekorder aufgezeichnet und in dein Programm integriert.
sub sortieren1()
dim count as integer
dim zero as integer
dim ende as integer
dim check as double
dim colour as long
Dim Dok as object
Dim Controller as Object
dim document as object
dim dispatcher as object
Dim Blatt as object
Dim Bereich as object
dim args1(6) as new com.sun.star.beans.PropertyValue
Dok = ThisComponent
Controller = Dok.GetCurrentController
Blatt = dok.sheets(0)
document = Controller.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
args1(0).Name = "ByRows"
args1(0).Value = true
args1(1).Name = "HasHeader"
args1(1).Value = false
args1(2).Name = "CaseSensitive"
args1(2).Value = false
args1(3).Name = "IncludeAttribs"
args1(3).Value = false
args1(4).Name = "UserDefIndex"
args1(4).Value = 0
args1(5).Name = "Col1"
args1(5).Value = 6
args1(6).Name = "Ascending1"
args1(6).Value = false
' ----------------------------------------------------------------------------------------
' Grundvariablen beschreiben
' ----------------------------------------------------------------------------------------
count = 1
check = 1
colour = 16777062
' ----------------------------------------------------------------------------------------
' ermitteln der letzten Zeile
' ----------------------------------------------------------------------------------------
do while check >0
count = count + 1
check = Blatt.getCellByPosition(0,count).value
loop
ende = count - 1
' ----------------------------------------------------------------------------------------
' Tabelle nach vorhandener Menge sortieren
' ----------------------------------------------------------------------------------------
Bereich = Blatt.getcellrangebyposition(0,2,9,ende)
Controller.select(Bereich)
dispatcher.executeDispatch(document, ".uno:DataSort", "", 0, args1())
' ----------------------------------------------------------------------------------------
' Erste Zeile ohne Restbestand suchen
' ----------------------------------------------------------------------------------------
check = 1
count = 1
do while check >0
count = count + 1
check = thisComponent.sheets(0).getCellByPosition(5,count).value
loop
zero = count
' ----------------------------------------------------------------------------------------
' Vorhandene Lebensmittel nach Artikelnummer sortieren
' ----------------------------------------------------------------------------------------
Bereich= Blatt.getcellrangebyposition(0,2,9,zero)
Controller.select(Bereich)
args1(5).Value = 1
dispatcher.executeDispatch(document, ".uno:DataSort", "", 0, args1())
' ----------------------------------------------------------------------------------------
' nicht vorhandene Lebensmittel nach Artikelnummer sortieren und farblich hinterlegen
' ----------------------------------------------------------------------------------------
Bereich = Blatt.getcellrangebyposition(0,zero+1,9,ende)
Controller.select(Bereich)
dispatcher.executeDispatch(document, ".uno:DataSort", "", 0, args1())
Bereich.cellbackcolor = colour
end sub
Jetzt bin ich im Internet doch fündig geworden. Im Starbasic gibt es jetzt einen SortDesciptor. Dort kann man einstellen, dass ohne Formate sortiert werden soll. Name = BindFormatsToContent. Allerdings braucht beim SortDescriptor nicht mehr der Name mitgegeben zu werden. Die Daten müssen nur im richtigen Arrayfeld stehen. Ich habe daher die Namen zwar mitgeschrieben, ober durch Hochkomma auskommentiert.
sub Sortieren2()
dim count as integer
dim zero as integer
dim ende as integer
Dim SortierKrit as object
Dim SortierFeld(0) As new com.sun.star.table.TableSortField
dim check as double
dim colour as long
Dim Dok as Object
Dim Blatt as Object
Dim Bereich as Object
Dok = ThisComponent
Blatt = Dok.Sheets(0)
SortierKrit = Blatt.createSortDescriptor()
' ----------------------------------------------------------------------------------------
' Grundvariablen beschreiben
' ----------------------------------------------------------------------------------------
count = 1
check = 1
colour = 16777062
' ----------------------------------------------------------------------------------------
' ermitteln der letzten Zeile
' ----------------------------------------------------------------------------------------
do while check >0
count = count + 1
check = Blatt.getCellByPosition(0,count).value
loop
ende = count - 1
' ----------------------------------------------------------------------------------------
' Tabelle nach vorhandener Menge sortieren
' ----------------------------------------------------------------------------------------
SortierFeld(0).field = 5
SortierFeld(0).IsAscending = false
SortierFeld(0).IsCaseSensitive = false
SortierFeld(0).FieldType = com.sun.star.util.SortFieldType.AUTOMATIC
Bereich = Blatt.getcellrangebyposition(0,2,9,ende)
'SortierKrit(0).Name = "IsSortColumns"
SortierKrit(0).Value = false
'SortierKrit(1).Name = "ContainsHeader"
SortierKrit(1).Value = false
'SortierKrit(3).Name = "SortFields"
SortierKrit(3).Value = SortierFeld
'SortierKrit(4).Name = "BindFormatsToContent"
SortierKrit(4).Value = false
Bereich.sort(SortierKrit())
' ----------------------------------------------------------------------------------------
' Erste Zeile ohne Restbestand suchen
' ----------------------------------------------------------------------------------------
check = 1
count = 1
do while check >0
count = count + 1
check = Blatt.getCellByPosition(5,count).value
loop
zero = count
' ----------------------------------------------------------------------------------------
' Vorhandene Lebensmittel nach Artikelnummer sortieren
' ----------------------------------------------------------------------------------------
SortierFeld(0).field = 0
SortierKrit(3).Value = SortierFeld()
Bereich = Blatt.getcellrangebyposition(0,2,9,zero)
Bereich.sort(SortierKrit())
' ----------------------------------------------------------------------------------------
' nicht vorhandene Lebensmittel nach Artikelnummer sortieren und farblich hinterlegen
' ----------------------------------------------------------------------------------------
SortierFeld(0).field = 0
SortierKrit(3).Value = SortierFeld()
Bereich = Blatt.getcellrangebyposition(0,zero+1,9,ende)
Bereich.sort(SortierKrit())
Blatt.getcellrangebyposition(0,zero+1,9,ende).cellbackcolor = colour
end sub
Ich hoffe unter den ganzen Varianten, findest du eine dir genehme.