Calc Standard-Filter per Makro anwenden

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

Hago
****
Beiträge: 135
Registriert: Di, 07.12.2004 16:44

Calc Standard-Filter per Makro anwenden

Beitrag von Hago »

Hallo,

ich habe versucht, ein Makro aufzuzeichnen, mit dem die Anwendung des Standard-Filters automatisiert werden soll.

Es gibt da die Spalte I.
Die meißten Zellen sind leer, aber manche enthalten ein x.
Die Zeilen mit dem x in Spalte I sollen ausgeblendet werden.

Nun ja, wenn ich versuche, das Makro anzuwenden, stürzt OO ab.
Ich habe im Makro-Editor nachgeschaut und mir scheint, daß das Filtern gar nicht aufgezeichnet wird.

Ich schaffe es zwar, nach einiger Lektüre, den Zellbereich zu selektieren, aber dann ist es schon aus. Ich habe auch in verschiedenen Handbüchern nichts Erhellendes zu diesem Filter gefunden.

Kann mir da jemand weiterhelfen?

Gruß, Hago
Charly
*****
Beiträge: 450
Registriert: Di, 20.01.2004 13:14
Wohnort: München

Beitrag von Charly »

Hallo!

Ich muss gestehen mit dem Filter kenne ich mich auch nicht aus.

Es gibt da die Spalte I.
Die meißten Zellen sind leer, aber manche enthalten ein x.
Die Zeilen mit dem x in Spalte I sollen ausgeblendet werden
Für diese Aufgabe hätte ich ein Makro. Spalte I ist die dabei die neunte Spalte mit Index 8.

Code: Alles auswählen

Sub Filterein()

Dok = ThisComponent
Controller = Dok.CurrentController
Blatt = Controller.ActiveSheet

Cursor =Blatt.createCursor()
Cursor.GotoEndofUsedArea(True)
EndZeile = Cursor.getRangeAddress.EndRow

For I = 0 To EndZeile
Zelle = Blatt.getCellByPosition(8,I)
Wert = Zelle.String
If Wert = "x"  then
	Zeile = Blatt.rows(I)
	Zeile.IsVisible = False
End If
next

End Sub

Ich hoffe das Makro funktioniert. Ich hatte keine Zeit es zu testen.
Um die Zeilen wieder einzublenden ist das gleiche Makro nötig. Nur bei dem Befehl Zeile.IsVisible ist false durch true zu ersetzen.

Gruß
Charly
Hago
****
Beiträge: 135
Registriert: Di, 07.12.2004 16:44

Beitrag von Hago »

Hallo Charly,

Ich danke Dir für den Code.
Leider funktioniert er bis jetzt nicht.
Keine Reaktion, auch keine Fehler.
.....................
For I = 0 To EndZeile
Zelle = Blatt.getCellByPosition(8,I)
Wert = Zelle.String
If Wert = "x" then
Zeile = Blatt.rows(I)
Zeile.IsVisible = False
End If
......................

Wenn ich es recht verstehe, wird I hochgezählt und ist in jedem Durchgang eine Zahl (einen Wert höher als im Durchgang zuvor)
Wenn das stimmt, verstehe ich die Zeile
"Zelle = Blatt.getCellByPosition(8,I)"
nicht so recht. Eine Zelle wird doch immer definiert durch eine Zahl und einen Buchstaben. Wenn I aber eine Zahl ist stehen in der Klammer ja zwei Zahlen... Das bezeichnet doch eigentlich keine Zelle.
Ich habe natürlich etwas rumprobiert, aber ohne Erfolg.

Gruß, Hago
Charly
*****
Beiträge: 450
Registriert: Di, 20.01.2004 13:14
Wohnort: München

Beitrag von Charly »

Hallo Hago!

Das kommt davon wenn man einen Code schreibt und diesen nicht testet.
Ich habe ihn jetzt getestet und hatte zunächst auch keine Reaktion bis ich auf den Fehler gekommen bin. Ich habe in der Spalte I in paar Zeilen ein kleines x geschrieben und nicht gemerkt, dass die Autokorrektur daraus ein großes X gemacht hat.
Wenn das stimmt, verstehe ich die Zeile
"Zelle = Blatt.getCellByPosition(8,I)"
nicht so recht. Eine Zelle wird doch immer definiert durch eine Zahl und einen Buchstaben. Wenn I aber eine Zahl ist stehen in der Klammer ja zwei Zahlen... Das bezeichnet doch eigentlich keine Zelle.
Eine Zelle kann man mit ihrem Namen aufrufen zB I3 oder mit ihrer Position. Dabei werden die Buchstaben durch Zahlen ersetzt. Die Nummerierung beginnt jedoch mit 0. Das heißt bei dem Klammerwert (8,I) bezieht sich 8 auf die neunte Spalte also I , und die Variable I zählt die Zeilen hoch von Index 0 bis zur letzten benutzten Zeile.

Ich habe meinen Code neugeschrieben und auch die Ausschaltung des Filters eingebaut. Sind die Zeilen vorhanden werden sie ausgeblendet. Sind sie ausgeblendet werden sie wieder eingeblendet.

Code: Alles auswählen

Sub Filterein_aus()

Dok = ThisComponent
Controller = Dok.CurrentController
Blatt = Controller.ActiveSheet

Cursor =Blatt.createCursor()
Cursor.GotoEndofUsedArea(True)
EndZeile = Cursor.getRangeAddress.EndRow

For I = 0 To EndZeile

Zelle = Blatt.getCellByPosition(8,I)
Wert = Zelle.String

If Wert = "x" or Wert = "X"  then
	
   Zeile = Blatt.rows(I)
   
   If Zeile.IsVisible then
  	 Zeile.IsVisible = False
   else Zeile.IsVisible = true
   end if
   		 
End If
next

End Sub 
gruß
Charly
Hago
****
Beiträge: 135
Registriert: Di, 07.12.2004 16:44

Beitrag von Hago »

Hallo Carly,

toll, jetzt funktioniert es bei mir auch.

Und Du hast Recht, wenn ich "or Wert = "X"" im ersten Makro einfüge klappt auch das bei mir.

Vielen Dank. Das wird so einiges vereinfachen.

Gruß, Hago
Antworten