Seite 1 von 1
[gelöst] Calc: Sortier-Macros über Pulldown ausführen
Verfasst: Do, 16.02.2012 07:52
von TrueColor
Hallo,
ich wurde aus dem Calc-Forum hierher verwiesen.
viewtopic.php?f=2&t=52290
Wie da schon beschrieben, hab ich eigentlich kein Problem mit den Macros selber sondern mit der Einbindung/dem Starten des entsprechenden Macros abh. von der Auswahl.
Danke!
Edit: Topic [gelöst]
Grüße
TrueColor
Re: Calc: Sortier-Macros über Pulldown ausführen
Verfasst: Do, 16.02.2012 11:24
von Frieder D.
Hallo TrueColor
Dazu gibt es verschiedene Möglichkeiten.
Wenn wir nicht genau wissen, wie die Kombobox-Einträge lauten, und wie für jeden einzelnen Eintrag sortiert werden soll,
so können wir dir hier nur bedingt helfen.
Ich habe dir mal eine Beispieldatei erstellt.
Hier der Code:
Code: Alles auswählen
sub Sort (oEvent)
dim oDoc as object
dim oSheet as object
dim oRange as object
dim nCol As Integer
dim sText as String
odoc=ThisComponent
oSheet= odoc.Sheets.GetByName("Tabelle1")
oRange= oSheet.getCellRangeByName("C6:F17")
nCol= oEvent.Selected 'Index der Selection. ich verwende ihn dazu die Sortier-Spalte festzulegen.
sText= oEvent.Source.Text 'Der Selectierte Text
If SortCalcTable(oRange , nCol , True, True) Then
MsgBox "Die Tabelle wurde gerade nach der Spalte """ & sText & """ sortiert."
else
MsgBox "Es ist ein fehler aufgetreten"
end if
end sub
'----------------------------------------------------------------------
'sortierfunktion: SortCalcTable(Zellbereich als object, Sortierspalte , True=Aufsteigend, True=Hat KopfZeile)
'giebt "True" zurück, wenn die sortierung erfolgreich war, sonst "False"
Function SortCalcTable(oRange as object, nCol As Integer, bAscending As Boolean, bhasHeader as boolean)As Boolean
Dim aSortFields(0) As New com.sun.star.util.SortField
Dim aSortDesc(1) As New com.sun.star.beans.PropertyValue
on error goto errorHandler
aSortFields(0).Field = nCol
aSortFields(0).SortAscending = bAscending
aSortFields(0).FieldType = com.sun.star.util.SortFieldType.AUTOMATIC
aSortDesc(0).Name = "SortFields"
aSortDesc(0).Value = aSortFields()
aSortDesc(1).Name = "ContainsHeader"
aSortDesc(1).Value = bhasHeader
oRange.sort(aSortDesc())
SortCalcTable=True
Exit Function
errorHandler:
SortCalcTable=False
End Function
Das Sub "Sort(oEvent)" ist mit dem Ereignis "Status Geändert" der KomboBox verknüpft.
Wenn wir allerdings genauere Infos haben, können wir dir auch genauer helfen.
Am besten du postest hier deinen bisherigen Code, vielleicht habe ich eine noch bessere Lösung für dich.
Gruß Frieder
Re: Calc: Sortier-Macros über Pulldown ausführen
Verfasst: Do, 16.02.2012 14:02
von TrueColor
Hallo Frieder,
wenn ich dich richtig verstanden hab, braucht man also ein weiteres Macro, damit man die Auswahl weiterverarbeiten kann?
Ich hab mal meine Tabelle angehängt.
Prj_Übersicht ist das Arbeitsblatt, Pulldown enthält den Kram für das Pulldownmenü. Die Macros für die ersten 3 Sortierungen hab ich noch nicht gemacht, aber das stellt für mich kein Problem dar (deshalb sind auch die Knöpfe ausgegraut, aber ich will ja von den Knöpfen weg).
Was für mich wichtig wäre, dass das ganze (für mich) einfach erweiterbar ist, sprich, dass ich weitere Sortierungen/Ansichten als separate Macros über den Macrorecorder aufzunehmen und das Pulldown grad ergänzen kann. Den Macro-Quelltext versteh ich leider nur in sehr begrenztem Umfang. Aber ich glaube zu verstehen, dass du in deinem Macro immer nur nach einer Spalte sortieren kannst und dass du den Input für das 2. Macro schon im 1. übergibst, das macht das Ganze IMHO recht unflexibel.
Vielen Dank!
Grüße
TrueColor
Re: Calc: Sortier-Macros über Pulldown ausführen
Verfasst: Do, 16.02.2012 14:52
von Frieder D.
Hallo TrueColor
Grundsätzlich versuche ich dort wo es geht den Dispache zu vermeiden.
Denn wenn du aus versehen während des Makroablaufs irgendwo hin klickst, kommt es zu gravierenden Problemen.
Mann kann auch mit der API nach bis zu 3 Spalten gleichzeitig Sortieren(Sihe:
Danhöfer)
Wenn man mehr Spalten haben will, nach denen sortiert werden soll, dann ruft man einfach meine Sortierfunktion mehrmahls hintereinander auf:
Code: Alles auswählen
for n=5 To 0 Step -1
SortCalcTable(oRange , n , bAscending , bhasHeader )
next
'Bewirkt, das die Tabelle nach de Spalten 0-5 sortiert wird, wobei 0 die höchste Priorität hat.
'Oder:
SortCalcTable(oRange , 3, bAscending , bhasHeader )
SortCalcTable(oRange , 7, bAscending , bhasHeader )
SortCalcTable(oRange , 1, bAscending , bhasHeader )
SortCalcTable(oRange , 4, bAscending , bhasHeader )
SortCalcTable(oRange , 2, bAscending , bhasHeader )
'Sortierung nach Spalte: 2,4,1,7,3
Der Sortier-bereich kann auch bei meinem Makro während der Laufzeit des Makros angepasst werden.
z.B. So:
Code: Alles auswählen
sub Sort (oEvent)
dim oDoc as object
dim oSheet as object
dim oRange as object
dim nCol As Integer
dim sText as String
odoc=ThisComponent
oSheet= odoc.Sheets.GetByName("Tabelle1")
oRange= oSheet.getCellRangeByPosition(0,0,GetLastUsedColumn(oSheet),GetLastUsedRow(oSheet))
nCol= oEvent.Selected 'Index der Selection. ich verwende ihn dazu die Sortier-Spalte festzulegen.
sText= oEvent.Source.Text 'Der Selectierte Text
If SortCalcTable(oRange , nCol , True, True) Then
MsgBox "Die Tabelle wurde gerade nach der Spalte """ & sText & """ sortiert."
else
MsgBox "Es ist ein fehler aufgetreten"
end if
end sub
Function GetLastUsedRow(oSheet as Object) As Integer
Dim oCell
Dim oCursor
Dim aAddress
oCell = oSheet.getCellByPosition(0, 0)
oCursor = oSheet.createCursorByRange(oCell)
oCursor.gotoEndOfUsedArea(True)
aAddress = oCursor.RangeAddress
GetLastUsedRow = aAddress.EndRow
End Function
REM Returns the number of the last column of a continuous data range in a sheet.
Function GetLastUsedColumn(oSheet as Object) As Long
Dim oCell
Dim oCursor
Dim aAddress
oCell = oSheet.getCellByPosition(0, 0)
oCursor = oSheet.createCursorByRange(oCell)
oCursor.gotoEndOfUsedArea(True)
aAddress = oCursor.RangeAddress
GetLastUsedColumn = aAddress.EndColumn
End Function
Gruß Frieder
P.S.
Bei deinem Listener fehlt die Methode "disposing" , da es sich um einen Event-Listener handelt.
Code: Alles auswählen
sub CrngListener_disposing( oEvent )
'Dises Sub MUSS vorhanden sein obwohl es nichts macht.!!!!!!
'Wenn es fehlt, kann es zu Abstürzen von LibreOffice oder OpenOffice kommen.!!!!!!
end sub
P.P.S
Warum nimmst du Funktionen, wenn die funktionen nichts zurückgeben?
einfache Subs sind in solchen fällen sinnvoller.
Code: Alles auswählen
Function ZelleEinfuegen (Blatt as String,Zelle as String, Typ as Integer)
...
End Function
' sollte z.B. so heißen:
Sub ZelleEinfuegen (Blatt as String,Zelle as String, Typ as Integer)
...
End Sub
Re: Calc: Sortier-Macros über Pulldown ausführen
Verfasst: Do, 16.02.2012 15:28
von TrueColor
Hallo Frieder,
erstmal danke!
Den Danhöfer muss ich mir heute abend zu hause mal anschauen, ist hier gesperrt.
> [p.s., p.p.s.]
die stammen nicht von mir, ich hab die fix und fertig verwendet, nur die Zellbezüge angepasst, aber ich werd's ändern und weitergeben
Grüße
TrueColor
Re: Calc: Sortier-Macros über Pulldown ausführen
Verfasst: Di, 21.02.2012 08:15
von TrueColor
[sub vs. function]
Nur so interessehalber: Gibts dazu auch noch nen anderen Hintergrund ausser der Unterscheidung mit oder ohne Rückgabewert? Weniger Rechenzyklen, schneller oder ähnliches? Weil sonst wäre es ja uneffektiv, 2 Befehle für ein und das selbe bereitzustellen.
Noch einige Fragen zu den Sortiermacros selbst:
GetLastUsedColumn(oSheet),GetLastUsedRow(oSheet)
Gibts dazu auch ein einfaches Kostrukt? Meist will man ja nur ne fixe Anzahl kompletter Spalten oder Zeilen sortieren. Vlt. sowas ähnliches wie
Aber nur die Spalten angeben fkt. halt nicht.
Und: Wie kann man
und
Code: Alles auswählen
oSheet.getCellRangeByPosition(0,0,GetLastUsedColumn(oSheet),GetLastUsedRow(oSheet)
mischen, um feste Spalten- und variable Zeilenanzahl zu erhalten? Kann ich einfach den letzten Spaltenbuchsaben einsetzen oder muss ich die Spaltennummer (Zählung beginnt bei 0) verwenden? Oder ganz anders?
Mann kann auch mit der API nach bis zu 3 Spalten gleichzeitig Sortieren(Sihe: Danhöfer)
Wenn man mehr Spalten haben will, nach denen sortiert werden soll, dann ruft man einfach meine Sortierfunktion mehrmahls hintereinander auf
Hab ich grad ausprobiert (OOo330m20): auch mit der API kann man mehr sortieren. Ist dann wohl wie beim MOTTCO, dass das GUI nur 3 zur Verfügung stellt, aber im Hintergrund mehr erlaubt, ausser MS Excel, was dann vlt. auch wieder abstürzen würde.
SortCalcTable(oRange , 3, bAscending , bhasHeader )
wie müsste ich hier vorgehen, wenn absteigend und ohne Header sortiert werden soll? Weglassen?
Danke für die Geduld bei den vielen Fragen, aber ich will immer gerne die Hintergründe (zumindest etwas) kennen. Nur stumpf abschreiben bringts nicht, weil dann meist irgendwas nicht geht und ich gar keine Chance hab, das zu reparieren.
Grüße
Robert
Re: Calc: Sortier-Macros über Pulldown ausführen
Verfasst: Di, 21.02.2012 10:47
von Frieder D.
Hallo Robert
Nur so interessehalber: Gibts dazu auch noch nen anderen Hintergrund ausser der Unterscheidung mit oder ohne Rückgabewert? Weniger Rechenzyklen, schneller oder ähnliches? Weil sonst wäre es ja uneffektiv, 2 Befehle für ein und das selbe bereitzustellen.
Ob ein Sub weniger Rechenschritte benötigt habe ich bis jetzt noch nicht ausprobiert.
Der Übersichtlichkeit, und besseren Lesbarkeit halber sollte man aber die Unterscheidung machen.
Eine Funktion ist natürlich eine Variable, die Arbeitsspeicher verwendet, allerdings weiß ich nicht, ob erst dann Speicherplatz reserviert wird,
wenn ihr auch ein wert zugewiesen wird, oder immer.
Ein weiterer Grund ist, das Funktionen in der Standard Bibliothek auch wie ganz normale Calc-Funktionen in einer Tabelle angewendet werden können.
Gibts dazu auch ein einfaches Kostrukt? Meist will man ja nur ne fixe Anzahl kompletter Spalten oder Zeilen sortieren. Vlt. sowas ähnliches wie
CODE:
oRange= oSheet.getCellRangeByName("C:F")
Nein so einfach geht es nicht. Mann sollte das auch nicht machen, denn dann hättest du den Bereich "C1:F1000000" ,
und eine Millionen Zeilen zu sortieren ist natürlich wesentlich mehr aufwand als z.B.100. (auch wenn fast alle lehr sind.)
und
CODE: ALLES AUSWÄHLEN
oSheet.getCellRangeByPosition(0,0,GetLastUsedColumn(oSheet),GetLastUsedRow(oSheet)
mischen, um feste Spalten- und variable Zeilenanzahl zu erhalten? Kann ich einfach den letzten Spaltenbuchsaben einsetzen oder muss ich die Spaltennummer (Zählung beginnt bei 0) verwenden? Oder ganz anders?
Ja du musst die Spaltennummer eingeben.(bei 0 beginnent)
Code: Alles auswählen
oSheet.getCellRangeByPosition(0,0,5,GetLastUsedRow(oSheet)) 'Alles bis Spalter F
SortCalcTable(oRange , 3, bAscending , bhasHeader )
wie müsste ich hier vorgehen, wenn absteigend und ohne Header sortiert werden soll? Weglassen?
So:
Code: Alles auswählen
bhasHeader=False
bAscending=False
SortCalcTable(oRange , 3, bAscending , bhasHeader )
'Oder:
SortCalcTable(oRange , 3, False , False )
Gruß Frieder
Re: Calc: Sortier-Macros über Pulldown ausführen
Verfasst: Di, 21.02.2012 14:08
von TrueColor
Hallo Frieder.
ah, danke dir, da wird einiges klarer! Nun hab ichs verstanden und kann das auch immer wieder einsetzen.
Jetzt hab ich mich an das Pulldown gesetzt. Mit deinem Ansatz komm ich leider nicht zurecht, da du nur nach 1 Kriterium sortierst und das direkt im PD wählst. Also hab ich was gebastelt, was (natürlich) nicht fkt. Wie kann ich das Macro, dessen Name in der schwarzen Zelle steht, aufrufen?
Im Grunde genommen muss ich ja den String aus der Zelle in eine Variable holen. Aber wie kann ich ein Sub aufrufen, dessen Namen in der Variable steht?
p.s.: Auf eine Fehlerbehandlung kann ich wohl verzichten, weil ich ja sehe, ob es sortiert hat oder nicht. Und "Es ist ein Fehler aufgetreten!" ist ja auch nicht gerade hilfreich. Zumindest fallen mir keine User-verursachten Fehlerszenarien ein, die hier auftreten könnten.
Gruß
Robert
Re: Calc: Sortier-Macros über Pulldown ausführen
Verfasst: Di, 21.02.2012 17:48
von Frieder D.
Hallo Robert
Am einfachen erreichst du das, indem du mit "Select Case" oder einer "If -Elseif" Abfrage herausbekommst,
welcher Text jeweils ausgewählt wurde, und dann das entsprechende Sub aufrufst:
Code: Alles auswählen
Sub AuswahlSortieren (oEvent)
Dim sName AS String
sName = oEvent.Source.SelectedText
Select Case sName
Case "SortiereBereich1"
SortiereBereich1
Case "SortiereBereich2"
SortiereBereich2
end select
End Sub
'--------------------------------------------------------------------------------------------
Sub SortiereBereich1
Dim SortFeld(2) As new com.sun.star.table.TableSortField
Dim SortProps(2) As new com.sun.star.beans.PropertyValue
dim oDatei As Object
dim oSheet As Object
dim oBereich As Object
oDatei = ThisComponent
oSheet = oDatei.Sheets("Daten")
oBereich = oSheet.getCellRangeByPosition(0,0,5,GetLastUsedRow(oSheet)
SortFeld(0).Field = 0 'Spalte Nummer, Spaltennummer - Zaehlung beginnt mit Null
SortFeld(0).IsAscending = True
SortFeld(0).FieldType = com.sun.star.util.SortFieldType.ALPHANUMERIC
SortFeld(1).Field = 1 'Spalte Name
SortFeld(1).IsAscending = True
SortFeld(1).FieldType = com.sun.star.util.SortFieldType.ALPHANUMERIC
SortFeld(2).Field = 2 'Spalte Stadt
SortFeld(2).IsAscending = True
SortFeld(2).FieldType = com.sun.star.util.SortFieldType.ALPHANUMERIC
SortProps(0).Name = "SortFields"
SortProps(0).Value = SortFeld()
SortProps(1).Name = "SortColumns"
SortProps(1).Value = False
SortProps(2).Name = "ContainsHeader"
SortProps(2).Value = true
oBereich.Sort(SortProps())
End Sub
'-----------------------------------------------------------------------------------------
Sub SortiereBereich2
Dim SortFeld(3) As new com.sun.star.table.TableSortField
Dim SortProps(2) As new com.sun.star.beans.PropertyValue
dim oDatei As Object
dim oSheet As Object
dim oBereich As Object
oDatei = ThisComponent
oSheet = oDatei.Sheets("Daten")
oBereich = oSheet.getCellRangeByPosition(0,0,5,GetLastUsedRow(oSheet)
SortFeld(0).Field = 2 'Spalte Stadt, Spaltennummer - Zaehlung beginnt mit Null
SortFeld(0).IsAscending = True
SortFeld(0).FieldType = com.sun.star.util.SortFieldType.ALPHANUMERIC
SortFeld(1).Field = 1 'Spalte Name
SortFeld(1).IsAscending = True
SortFeld(1).FieldType = com.sun.star.util.SortFieldType.ALPHANUMERIC
SortFeld(2).Field = 3 'Spalte Land
SortFeld(2).IsAscending = True
SortFeld(2).FieldType = com.sun.star.util.SortFieldType.ALPHANUMERIC
SortFeld(3).Field = 5 'Spalte Baum
SortFeld(3).IsAscending = True
SortFeld(3).FieldType = com.sun.star.util.SortFieldType.ALPHANUMERIC
SortProps(0).Name = "SortFields"
SortProps(0).Value = SortFeld()
SortProps(1).Name = "SortColumns"
SortProps(1).Value = False
SortProps(2).Name = "ContainsHeader"
SortProps(2).Value = true
oBereich.Sort(SortProps())
End Sub
'----------------------------------------------------
Function GetLastUsedRow(oSheet as Object) As Integer
Dim oCell
Dim oCursor
Dim aAddress
oCell = oSheet.getCellByPosition(0, 0)
oCursor = oSheet.createCursorByRange(oCell)
oCursor.gotoEndOfUsedArea(True)
aAddress = oCursor.RangeAddress
GetLastUsedRow = aAddress.EndRow
End Function
Man kann zwar über Umwege zur Laufzeit aus einem String ein Befehl machen,
aber das ist erstens sehr kompliziert (und erfordert tiefere Kenntnisse, als du hast),
und zweitens aus Stabilitäts-gründen nicht zu empfehlen.
In anderen (Logischen-oder Funktionalen) Programmiersprachen z.B. Lisp oder Haskell ist das kein Problem.
aber in Basic (es ist eine Imperative Sprache) ist das nicht so vorgesehen.
Gruß Frieder
Re: Calc: Sortier-Macros über Pulldown ausführen
Verfasst: Mi, 22.02.2012 16:53
von TrueColor
Hallo Frieder,
in der Testdatei fkt. das alles super, vielen Dank! Mal schauen, ob ich morgen die Zeit finde, das komplett in die richtige Tabelle einzubauen. Ich melde mich dann auf jeden Fall nochmal!
Gruß
Robert
Re: Calc: Sortier-Macros über Pulldown ausführen
Verfasst: Do, 23.02.2012 11:26
von TrueColor
Hallo Frieder,
so, nun hat Murphy zugeschlagen. Ich hab's übertragen und jetzt fkt.'s nicht mehr.
(1)
Code: Alles auswählen
Sub AuswahlSortieren (oEvent)
Dim sName As String
sName = oEvent.Source.SelectedText
Basic Laufzeitfehler.
Eigenschaft oder Methode nicht gefunden: SelectedText.
Woran kann das liegen?
(2)
Und die einzelnen Sortiermacros (ich hab ja die Buttons noch nicht rausgelöscht) reagieren auch nicht mehr, sogar ganz ohne Fehlermeldung. Hab die Bereiche und das Blatt angepasst, alles andere ist gleich geblieben. Könntest du hier bitte auch mal drüberschauen, wenn es deine Zeit zulässt?
(3)
(Wie) kann man
Code: Alles auswählen
Dim oDatei As Object
Dim oSheet As Object
Dim oBereich As Object
oDatei = ThisComponent
oSheet = oDatei.Sheets("Prj_Uebersicht")
oBereich = oSheet.getCellRangeByPosition(0,0,13,GetLastUsedRow(oSheet))
global definieren? Es ist ja immer wieder gleich und beim Editieren der Tabelle vergisst man leicht, dass da u.U. auch was angepasst werden muss.
(4)
Halb-OffTopic:
Gibts eigentlich 'ne gute Befehlsreferenz mit Beispielen, z.B. sowas wie die Dokumentationen des W3C oder wie beim SelfHTML-Projekt?
Edit: Fehlerkorrektur in Datei
Danke!
Gruß
Robert
Re: Calc: Sortier-Macros über Pulldown ausführen
Verfasst: Do, 23.02.2012 12:19
von Frieder D.
Hallo Robert
zu 1:
Du verwendest ein Listenfeld statt einer KomboBox.
Bei dir muss es also Heißen:
Ich empfehle dir
Xray oder MRI zu nutzen,
dann bekommst du so etwas ganz schnell selber heraus.
Zu den anderen Problemen gleich mehr.
Gruß Frieder
Re: Calc: Sortier-Macros über Pulldown ausführen
Verfasst: Do, 23.02.2012 12:40
von Frieder D.
Hallo
nun zu 3:
Du könntest die variablen natürlich als Global Deklarieren, und sie dann im 1. Sub initialisieren.
Dadurch stehen sie dir in allen anderen Subs und Funktionen zur Verfügung.
Code: Alles auswählen
Global oDatei As Object 'Steht in allen Modulen zur Verfügung
...
Sub AuswahlSortieren (oEvent)
oDatei = ThisComponent
...
Da Globale Variablen aber Speicherplatz verbrauchen, so lange das Dokument geöffnet ist, würde ich in dem Fall aber eher Public Verwenden,
da diese Variablen nach beendigung des Makros wieder aus dem Speicher gelöscht wird.
Code: Alles auswählen
Public oDatei As Object 'Steht nur innerhalb des Moduls zur Verfügung
Allerdings würde ich dir Empfehlen es noch anders zu Lösen:
Im Sub AuswahlSortieren Deklarierst, und Befüllst du die Variable oBereich.
Anschließend übergibst du den sortier Routinen die Variable als Parameter.
Du musst aber darauf achten, dass die Variable in den Sortier.Subs nicht nochmal deklariert wird.
Code: Alles auswählen
Sub AuswahlSortieren (oEvent)
Dim sName As String
Dim oSheet As Object
Dim oBereich As Object
oSheet = ThisComponent.Sheets.GetByName("Prj_Uebersicht")
oBereich = oSheet.getCellRangeByPosition(0,0,13,GetLastUsedRow(oSheet))
sName = oEvent.Source.SelectedItem
Select Case sName
Case "SortBy_TKunde"
SortBy_TKunde (oBereich)
Case "SortBy_TProd"
SortBy_TProd (oBereich)
Case "SortBy_Fertig"
SortBy_Fertig (oBereich)
Case "SortBy_Status"
SortBy_Status (oBereich)
Case "SortBy_BV"
SortBy_BV (oBereich)
End Select
End Sub
Sub SortBy_TKunde (ByVal oBereich As Object)
Dim SortFeld(0) As new com.sun.star.table.TableSortField
Dim SortProps(2) As new com.sun.star.beans.PropertyValue
SortFeld(0).Field = 2 'Spalte Termin Kunde, Spaltennummer - Zaehlung beginnt mit Null
SortFeld(0).IsAscending = True
SortFeld(0).FieldType = com.sun.star.util.SortFieldType.ALPHANUMERIC
SortProps(0).Name = "SortFields"
SortProps(0).Value = SortFeld()
SortProps(1).Name = "SortColumns"
SortProps(1).Value = False
SortProps(2).Name = "ContainsHeader"
SortProps(2).Value = True
oBereich.Sort(SortProps())
End Sub
Sub SortBy_TProd (ByVal oBereich As Object)
Dim SortFeld(0) As new com.sun.star.table.TableSortField
Dim SortProps(2) As new com.sun.star.beans.PropertyValue
SortFeld(0).Field = 3 'Spalte Termin Produktion, Spaltennummer - Zaehlung beginnt mit Null
SortFeld(0).IsAscending = True
SortFeld(0).FieldType = com.sun.star.util.SortFieldType.ALPHANUMERIC
SortProps(0).Name = "SortFields"
SortProps(0).Value = SortFeld()
SortProps(1).Name = "SortColumns"
SortProps(1).Value = False
SortProps(2).Name = "ContainsHeader"
SortProps(2).Value = True
oBereich.Sort(SortProps())
End Sub
Sub SortBy_Fertig (ByVal oBereich As Object)
Dim SortFeld(0) As new com.sun.star.table.TableSortField
Dim SortProps(2) As new com.sun.star.beans.PropertyValue
SortFeld(0).Field = 4 'Spalte Fertigstellung, Spaltennummer - Zaehlung beginnt mit Null
SortFeld(0).IsAscending = True
SortFeld(0).FieldType = com.sun.star.util.SortFieldType.ALPHANUMERIC
SortProps(0).Name = "SortFields"
SortProps(0).Value = SortFeld()
SortProps(1).Name = "SortColumns"
SortProps(1).Value = False
SortProps(2).Name = "ContainsHeader"
SortProps(2).Value = True
oBereich.Sort(SortProps())
End Sub
Sub SortBy_Status (ByVal oBereich As Object)
Dim SortFeld(2) As new com.sun.star.table.TableSortField
Dim SortProps(2) As new com.sun.star.beans.PropertyValue
SortFeld(0).Field = 5 'Spalte Status, Spaltennummer - Zaehlung beginnt mit Null
SortFeld(0).IsAscending = True
SortFeld(0).FieldType = com.sun.star.util.SortFieldType.ALPHANUMERIC
SortFeld(1).Field = 6 'Spalte Bauvorhaben
SortFeld(1).IsAscending = True
SortFeld(1).FieldType = com.sun.star.util.SortFieldType.ALPHANUMERIC
SortFeld(2).Field = 8 'Spalte Bauteil
SortFeld(2).IsAscending = True
SortFeld(2).FieldType = com.sun.star.util.SortFieldType.ALPHANUMERIC
SortProps(0).Name = "SortFields"
SortProps(0).Value = SortFeld()
SortProps(1).Name = "SortColumns"
SortProps(1).Value = False
SortProps(2).Name = "ContainsHeader"
SortProps(2).Value = True
oBereich.Sort(SortProps())
End Sub
Sub SortBy_BV (ByVal oBereich As Object)
Dim SortFeld(2) As new com.sun.star.table.TableSortField
Dim SortProps(2) As new com.sun.star.beans.PropertyValue
SortFeld(0).Field = 6 'Spalte Bauvorhaben, Spaltennummer - Zaehlung beginnt mit Null
SortFeld(0).IsAscending = True
SortFeld(0).FieldType = com.sun.star.util.SortFieldType.ALPHANUMERIC
SortFeld(1).Field = 7 'Spalte Verleger
SortFeld(1).IsAscending = True
SortFeld(1).FieldType = com.sun.star.util.SortFieldType.ALPHANUMERIC
SortFeld(2).Field = 8 'Spalte Bauteil
SortFeld(2).IsAscending = True
SortFeld(2).FieldType = com.sun.star.util.SortFieldType.ALPHANUMERIC
SortProps(0).Name = "SortFields"
SortProps(0).Value = SortFeld()
SortProps(1).Name = "SortColumns"
SortProps(1).Value = False
SortProps(2).Name = "ContainsHeader"
SortProps(2).Value = True
oBereich.Sort(SortProps())
End Sub
Function GetLastUsedRow(oSheet as Object) As Integer
Dim oCell
Dim oCursor
Dim aAddress
oCell = oSheet.getCellByPosition(0, 0)
oCursor = oSheet.createCursorByRange(oCell)
oCursor.gotoEndOfUsedArea(True)
aAddress = oCursor.RangeAddress
GetLastUsedRow = aAddress.EndRow
End Function
Diese Lösung garantiert eine bessere Lesbarkeit des Codes.
Gruß Frieder
P.S. Das "ByVal" bewirkt, das der Inhalt der Variablen von der unter-Routine nicht verändert werden kann.
Re: Calc: Sortier-Macros über Pulldown ausführen
Verfasst: Do, 23.02.2012 13:02
von Frieder D.
Hallo
Nun zu 2:
Du hast geschreiben:
Richtig ist aber:
Code: Alles auswählen
oSheet = ThisComponent.Sheets.GetByName("Prj_Uebersicht")
Ohne "GetByName" bekommst du Keinen Namens-Zugriff auf die Tabelle.
Gruß Frieder
Re: Calc: Sortier-Macros über Pulldown ausführen
Verfasst: Do, 23.02.2012 14:36
von TrueColor
Hallo Frieder,
was lange währt, wird endlich gut! Es fkt. nun so, wie ich mir das vorgestellt hatte.
Nochmals vielen Dank!
Gruß
Robert