[gelöst] Calc: Sortier-Macros über Pulldown ausführen
Moderator: Moderatoren
[gelöst] Calc: Sortier-Macros über Pulldown ausführen
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
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
Zuletzt geändert von TrueColor am Do, 23.02.2012 14:38, insgesamt 1-mal geändert.
System:
LibO 6 + LibO 7
LibO 6 + LibO 7
-
- ****
- Beiträge: 115
- Registriert: Di, 10.01.2012 10:51
- Kontaktdaten:
Re: Calc: Sortier-Macros über Pulldown ausführen
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:
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
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
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
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
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
- Dateianhänge
-
- Projekte aktuell_erweitert_20120214.ods
- (28.99 KiB) 132-mal heruntergeladen
System:
LibO 6 + LibO 7
LibO 6 + LibO 7
-
- ****
- Beiträge: 115
- Registriert: Di, 10.01.2012 10:51
- Kontaktdaten:
Re: Calc: Sortier-Macros über Pulldown ausführen
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:
Der Sortier-bereich kann auch bei meinem Makro während der Laufzeit des Makros angepasst werden.
z.B. So:
Gruß Frieder
P.S.
Bei deinem Listener fehlt die Methode "disposing" , da es sich um einen Event-Listener handelt.
P.P.S
Warum nimmst du Funktionen, wenn die funktionen nichts zurückgeben?
einfache Subs sind in solchen fällen sinnvoller.
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
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
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
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
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
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
System:
LibO 6 + LibO 7
LibO 6 + LibO 7
Re: Calc: Sortier-Macros über Pulldown ausführen
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.[sub vs. function]
Noch einige Fragen zu den Sortiermacros selbst:
Gibts dazu auch ein einfaches Kostrukt? Meist will man ja nur ne fixe Anzahl kompletter Spalten oder Zeilen sortieren. Vlt. sowas ähnliches wieGetLastUsedColumn(oSheet),GetLastUsedRow(oSheet)
Code: Alles auswählen
oRange= oSheet.getCellRangeByName("C:F")
Und: Wie kann man
Code: Alles auswählen
oSheet.getCellRangeByName("A1:F9999")
Code: Alles auswählen
oSheet.getCellRangeByPosition(0,0,GetLastUsedColumn(oSheet),GetLastUsedRow(oSheet)
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.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
wie müsste ich hier vorgehen, wenn absteigend und ohne Header sortiert werden soll? Weglassen?SortCalcTable(oRange , 3, bAscending , bhasHeader )
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
- Dateianhänge
-
- sortiermacro_test.ods
- Sortierung mit API nach 4 Kriterien (Sort 2)
- (11.75 KiB) 138-mal heruntergeladen
System:
LibO 6 + LibO 7
LibO 6 + LibO 7
-
- ****
- Beiträge: 115
- Registriert: Di, 10.01.2012 10:51
- Kontaktdaten:
Re: Calc: Sortier-Macros über Pulldown ausführen
Hallo Robert
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.
und eine Millionen Zeilen zu sortieren ist natürlich wesentlich mehr aufwand als z.B.100. (auch wenn fast alle lehr sind.)
Gruß Frieder
Ob ein Sub weniger Rechenschritte benötigt habe ich bis jetzt noch nicht ausprobiert.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.
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.
Nein so einfach geht es nicht. Mann sollte das auch nicht machen, denn dann hättest du den Bereich "C1:F1000000" ,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")
und eine Millionen Zeilen zu sortieren ist natürlich wesentlich mehr aufwand als z.B.100. (auch wenn fast alle lehr sind.)
Ja du musst die Spaltennummer eingeben.(bei 0 beginnent)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?
Code: Alles auswählen
oSheet.getCellRangeByPosition(0,0,5,GetLastUsedRow(oSheet)) 'Alles bis Spalter F
So:SortCalcTable(oRange , 3, bAscending , bhasHeader )
wie müsste ich hier vorgehen, wenn absteigend und ohne Header sortiert werden soll? Weglassen?
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
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
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
- Dateianhänge
-
- sortiermacro_pd_test.ods
- Sortierung mit Pulldown
- (12.32 KiB) 137-mal heruntergeladen
System:
LibO 6 + LibO 7
LibO 6 + LibO 7
-
- ****
- Beiträge: 115
- Registriert: Di, 10.01.2012 10:51
- Kontaktdaten:
Re: Calc: Sortier-Macros über Pulldown ausführen
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:
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
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
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
- Dateianhänge
-
- sortiermacro_pd_test2.ods
- (13.1 KiB) 129-mal heruntergeladen
Re: Calc: Sortier-Macros über Pulldown ausführen
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
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
System:
LibO 6 + LibO 7
LibO 6 + LibO 7
Re: Calc: Sortier-Macros über Pulldown ausführen
Hallo Frieder,
so, nun hat Murphy zugeschlagen. Ich hab's übertragen und jetzt fkt.'s nicht mehr.
(1)
(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
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
so, nun hat Murphy zugeschlagen. Ich hab's übertragen und jetzt fkt.'s nicht mehr.
(1)
Woran kann das liegen?Basic Laufzeitfehler.Code: Alles auswählen
Sub AuswahlSortieren (oEvent) Dim sName As String sName = oEvent.Source.SelectedText
Eigenschaft oder Methode nicht gefunden: SelectedText.
(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))
(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
- Dateianhänge
-
- Projekte aktuell_erweitert_20120223_macrotest.ods
- (30.02 KiB) 91-mal heruntergeladen
System:
LibO 6 + LibO 7
LibO 6 + LibO 7
-
- ****
- Beiträge: 115
- Registriert: Di, 10.01.2012 10:51
- Kontaktdaten:
Re: Calc: Sortier-Macros über Pulldown ausführen
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
zu 1:
Du verwendest ein Listenfeld statt einer KomboBox.
Bei dir muss es also Heißen:
Code: Alles auswählen
sName = oEvent.Source.SelectedItem
dann bekommst du so etwas ganz schnell selber heraus.
Zu den anderen Problemen gleich mehr.
Gruß Frieder
-
- ****
- Beiträge: 115
- Registriert: Di, 10.01.2012 10:51
- Kontaktdaten:
Re: Calc: Sortier-Macros über Pulldown ausführen
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.
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.
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.
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.
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 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
Gruß Frieder
P.S. Das "ByVal" bewirkt, das der Inhalt der Variablen von der unter-Routine nicht verändert werden kann.
-
- ****
- Beiträge: 115
- Registriert: Di, 10.01.2012 10:51
- Kontaktdaten:
Re: Calc: Sortier-Macros über Pulldown ausführen
Hallo
Nun zu 2:
Du hast geschreiben:
Richtig ist aber:
Ohne "GetByName" bekommst du Keinen Namens-Zugriff auf die Tabelle.
Gruß Frieder
Nun zu 2:
Du hast geschreiben:
Code: Alles auswählen
oSheet = ThisComponent.Sheets("Prj_Uebersicht")
Code: Alles auswählen
oSheet = ThisComponent.Sheets.GetByName("Prj_Uebersicht")
Gruß Frieder
Re: Calc: Sortier-Macros über Pulldown ausführen
Hallo Frieder,
was lange währt, wird endlich gut! Es fkt. nun so, wie ich mir das vorgestellt hatte.
Nochmals vielen Dank!
Gruß
Robert
was lange währt, wird endlich gut! Es fkt. nun so, wie ich mir das vorgestellt hatte.
Nochmals vielen Dank!
Gruß
Robert
System:
LibO 6 + LibO 7
LibO 6 + LibO 7