an einer größeren Tabelle, die immer wieder in drei verschiedenen "Standard-Sortierungen" betrachtet werden will, habe ich drei gruppierte Optionsfelder angebracht und alle mit dem nachfolgenden Makro verknüpft, um mit einem einzigen Klick (d.h. ohne erst mühsam und fehlerträchtig den Sortierbereich markieren und dann den Sortierdialog bedienen zu müssen) eine Standardsortierung auswählen und anwenden zu können. Das funktioniert grundsätzlich sogar:
Code: Alles auswählen
Sub SortiereDatenbereich()
Dim aSortFields(1) as New com.sun.star.util.SortField ' zwei Sortierfelder
Dim aSortDesc(0) as New com.sun.star.beans.PropertyValue ' Sortierschlüssel
Dim iRow, iRecordCount As Integer
Dim oDoc, oSheet, oRange, oForm, oOptA, oOptB, oOptC, as object
oDoc=thisComponent
oSheet = oDoc.sheets.getByName(SHEET_NAME)
oForm =oSheet.DrawPage.forms.getbyIndex(0)
oOptA = oForm.getbyname("optA") ' Drei Optionsfelder für drei häufig gebrauchte Sortiereinstellungen
oOptB = oForm.getbyname("optB")
oOptC = oForm.getbyname("optC")
oDoc.lockControllers() ' Bildschirmaktualisierung abschalten
oDoc.AddActionLock() ' Berechnungen stoppen
oRange = oSheet.getCellRangeByPosition(0,FIRST_DATA_ROW , DATA_WIDTH, (FIRST_DATA_ROW + iRecordCount - 1) 'nLeft, nTop. nRight, nBottom;
thisComponent.CurrentController.Select(oRange) ' Erforderlichen Datenbereich selektieren
if oOptA.State then
aSortFields(0).Field = iCol_lnr
aSortFields(0).SortAscending = True
aSortFields(1).Field = iCol_Nachname
aSortFields(1).SortAscending = True
aSortFields(2).Field = iCol_Vorname
aSortFields(2).SortAscending = True
aSortDesc(0).Name = "SortFields"
aSortDesc(0).Value = aSortFields()
oRange.Sort(aSortDesc())
End If
if oOptB.State then
' analog mit anderen Sortiereinstellungen
End If
if oOptC.State then
' analog mit anderen Sortiereinstellungen
End If
oDoc.removeActionLock() ' Updateberechnungen wieder einschalten
oDoc.unlockControllers() ' Bildschirmaktualisierung wieder einschalten!
'Bildschirmaktualisierung auslösen:
' ** Das fehlt leider noch! **
End Sub
Weder konnte ich dazu in den Libre/Open-Office-Foren etwas finden noch per xray auf den verschiedenen Objekten eine Methode wie "repaint", "refresh" oder Ähnliches (in Excel gab/gibt es m.w. etwas wie ".Repaint"). Auch abschließend einen anderen Range zu selektieren funktioniert zwar, aber beläßt ansonsten die alten Daten in der Anzeige.
Auch "oDoc.CalculateAll" oder Einfügen von "DoEvents" an allen denkbaren Stellen ändert nichts daran, daß der Bildschirm nicht aktualisiert wird.
Das einzige, was ich als wirksamen Notbehelf durch Versuch und Irrtum auftreiben konnte, ist:
Code: Alles auswählen
oDoc.getCurrentController().getFrame().getContainerWindow().Visible= False
oDoc.getCurrentController().getFrame().getContainerWindow().Visible= True
Daher die Frage: Kennt jemand eine sanftere Möglichkeit, den im Calc-Fenster sichtbaren Datenbereich zu aktualisieren?
Kontext: Libreoffice 4.2.6.2 auf Debian/testing, 64bit