ich bin gerade dabei eine Art Livefilter für Calc zu programmieren.
Dazu kann in einem Formularfeld(Textfeld) im Tabellenkopf Text, Zahlen ...(was auch immer)eingegeben werden. Nach jedem Tastendruck erscheint die Eingabe sofort (ohne "ENTER") in Zelle G1.
Diese Zelle habe überwache ich mit einen Listener (.XModifyListener) der dann jedesmal das Sub Zeilenfilter ausführt.
Das ganze funktioniert auch einwandfrei nur dauert das ausblenden der Zeilen bei vielen Listeneinträgen recht lange.
Das aus- und einblenden wird mit "oSheet.Rows(i).isVisible = True/False" realisiert. siehe Codebeispiel 1
Code: Alles auswählen
Sub Zeilenfilter
'Liest die Daten aus Zelle G1 (Daten werden dort von Formularfeld abgelegt) und
'vergleicht den Suchtext mit Zeilenweise Spalte A bis C
'bei Fund wird Zeile eingeblendt sonst ausgeblendet
'Ist G1 "" dann alles eingeblendet.
'Aufruf des Zeilenfilter über .XModifyListener auf Zelle G1 als Livefilter verwendbar
'benötigt Fkt. MaxEintraegeBestimmen
Dim oDoc as Object
Dim oSheet as Object
Dim Blatt as String
Dim x as Integer
oDoc = thisComponent
oDoc.LockControllers 'Bildschirmupdate reduzieren
Blatt ="Prj_Übersicht"
oSheet=oDoc.Sheets.getByName(Blatt) 'Tabellenblatt definieren
x = MaxEintraegeBestimmen(Blatt,0, 1) 'Procedur um Anzahl Einträge in Liste bestimmen
sFil = oSheet.getCellRangeByName("G1").getString 'Suchtext lesen
'Alles einblenden wenn kein Suchfiltertext vorhanden
If sFil ="" then
oZeilen =oSheet.getcellrangebyposition(0,1,6,x).rows
ozeilen.isvisible = True
oDoc.UnlockControllers 'Bildschirmupdate normal setzen
Exit Sub
End if
'Suchfilter ausführen
For i = 1 to x 'Schleife über Liste (x = Anzahl der Einträge
Sichtbar = False
sA = oSheet.getCellRangeByName("A"&i+1).getString
sB = oSheet.getCellRangeByName("B"&i+1).getString
sC = oSheet.getCellRangeByName("C"&i+1).getString
sichtbar = False
If InStr(sA,sFil)<>0 then 'Vergleich G1 mit Zelle A bis der jeweiligen Zeile
Sichtbar = True
Elseif InStr(sB,sFil)<>0 then ' "
Sichtbar = True
Elseif InStr(sC,sFil)<>0 then ' "
Sichtbar = True
Endif
If Sichtbar = true then
oSheet.Rows(i).isVisible = True
else
oSheet.Rows(i).isVisible = False
End if
Next i
oDoc.UnlockControllers 'Bildschirmupdate normal setzen
End Sub
'------------------------------------
'------------------------------------
Auf dem Tabellenblatt geht das ganz gut (mehrere versch. Zellen markieren dann Format - Zeilen - ausblenden und fertig.
Das gruppieren der Zellen (Zeilen) bekomme ich auch hin Siehe Codebeispiel 2. Und für diese Selektion kann ich auch ohne schwierigkeiten Eigenschaften wie z.B. die Textfarbe etc. ändern.
Finde jedoch keine Möglichkeit die Selektion auszublenden.
Kann mir vielleicht jemand von Euch helfen?
Code: Alles auswählen
Sub Filtertest
oDoc=thisComponent
oSheet = odoc.Sheets.getByName("Tabelle1")
oRanges = thisComponent.createInstance("com.sun.star.sheet.SheetCellRanges")
For i = 0 to 30
If oSheet.getCellByPosition(1,i).getString <>"" then
oZeilen = osheet.Rows(i)
'Alternativ oZeilen =oSheet.getCellRangeByPosition(0,i,6,i).rows 'wenn man nur Teile der Zeile auswählen will
oRanges.addRangeAddress(oZeilen.getRangeAddress(),False) 'Gruppierung in Mehrfachauswahl
End if
Next i
'oRanges.CellProtection.IsHidden = True
oRanges.setPropertyValue( "CharColor", RGB(0,0,255)) 'Veränderung Textfarbe der Zeile
'Zeile ausblenden
'oZeilen =oSheet.getcellrangebyposition(0,7,6,10).rows
'ozeilen.isvisible = False
End Sub