[gelöst] Calc: Sortier-Macros über Pulldown ausführen

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: [gelöst] Calc: Sortier-Macros über Pulldown ausführen

Re: Calc: Sortier-Macros über Pulldown ausführen

von TrueColor » Do, 23.02.2012 14:36

Hallo Frieder,

was lange währt, wird endlich gut! Es fkt. nun so, wie ich mir das vorgestellt hatte.

Nochmals vielen Dank!

Gruß
Robert

Re: Calc: Sortier-Macros über Pulldown ausführen

von Frieder D. » Do, 23.02.2012 13:02

Hallo

Nun zu 2:

Du hast geschreiben:

Code: Alles auswählen

oSheet = ThisComponent.Sheets("Prj_Uebersicht")
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

von Frieder D. » Do, 23.02.2012 12:40

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

von Frieder D. » Do, 23.02.2012 12:19

Hallo Robert

zu 1:
Du verwendest ein Listenfeld statt einer KomboBox.
Bei dir muss es also Heißen:

Code: Alles auswählen

  sName = oEvent.Source.SelectedItem
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

von TrueColor » Do, 23.02.2012 11:26

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
Dateianhänge
Projekte aktuell_erweitert_20120223_macrotest.ods
(30.02 KiB) 91-mal heruntergeladen

Re: Calc: Sortier-Macros über Pulldown ausführen

von TrueColor » Mi, 22.02.2012 16:53

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

von Frieder D. » Di, 21.02.2012 17:48

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
Dateianhänge
sortiermacro_pd_test2.ods
(13.1 KiB) 130-mal heruntergeladen

Re: Calc: Sortier-Macros über Pulldown ausführen

von TrueColor » Di, 21.02.2012 14:08

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
Dateianhänge
sortiermacro_pd_test.ods
Sortierung mit Pulldown
(12.32 KiB) 137-mal heruntergeladen

Re: Calc: Sortier-Macros über Pulldown ausführen

von Frieder D. » Di, 21.02.2012 10:47

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

von TrueColor » Di, 21.02.2012 08:15

[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

Code: Alles auswählen

oRange= oSheet.getCellRangeByName("C:F")
Aber nur die Spalten angeben fkt. halt nicht.

Und: Wie kann man

Code: Alles auswählen

oSheet.getCellRangeByName("A1:F9999")
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
Dateianhänge
sortiermacro_test.ods
Sortierung mit API nach 4 Kriterien (Sort 2)
(11.75 KiB) 139-mal heruntergeladen

Re: Calc: Sortier-Macros über Pulldown ausführen

von TrueColor » Do, 16.02.2012 15:28

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

von Frieder D. » Do, 16.02.2012 14:52

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

von TrueColor » Do, 16.02.2012 14:02

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
Dateianhänge
Projekte aktuell_erweitert_20120214.ods
(28.99 KiB) 133-mal heruntergeladen

Re: Calc: Sortier-Macros über Pulldown ausführen

von Frieder D. » Do, 16.02.2012 11:24

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.
sort Calc.ods
(12.14 KiB) 196-mal heruntergeladen
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

[gelöst] Calc: Sortier-Macros über Pulldown ausführen

von TrueColor » Do, 16.02.2012 07:52

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

Nach oben