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
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: [url=http://www.starbasicfaq.de/WiekannmanZellbereichesortieren..html]Danhöfer[/url])
Wenn man mehr Spalten haben will, nach denen sortiert werden soll, dann ruft man einfach meine Sortierfunktion mehrmahls hintereinander auf:
[code]
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
[/code]
Der Sortier-bereich kann auch bei meinem Makro während der Laufzeit des Makros angepasst werden.
z.B. So:
[code]
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
[/code]
Gruß Frieder
P.S.
Bei deinem Listener fehlt die Methode "disposing" , da es sich um einen Event-Listener handelt.
[code]
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
[/code]
P.P.S
Warum nimmst du Funktionen, wenn die funktionen nichts zurückgeben?
einfache Subs sind in solchen fällen sinnvoller.
[code]
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
[/code]