Calc: Zellen ein-/ausblenden

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

Moderator: Moderatoren

Ey-Ko
Beiträge: 8
Registriert: Di, 08.12.2009 15:46

Calc: Zellen ein-/ausblenden

Beitrag von Ey-Ko »

Guten Morgen,

ich bin auf der Suche nach einem OO Calc makro, was Zeilen bei verschiedenen Bedingungen automatisch ausblendet..

Folgendes habe ich gefunden:

Code: Alles auswählen

Sub ausblenden_einblenden
'die Spalte in welcher die zu prüfende Zelle steht
'hier eintragen. Spalte 1 (Spalte A) entspricht 0
vorgabe = 0
'die letzte zu prüfende Zeile hier eintragen
'Zeile 1 entspricht 0
max_zeile = 20
For x = 0 to max_zeile
If ThisComponent.Sheets.GetByName("Tabelle1").getCellByPosition(vorgabe, x).String = "" Then
If ThisComponent.Sheets.GetByName("Tabelle1").Rows(x).isVisible = False Then
ThisComponent.Sheets.GetByName("Tabelle1").Rows(x).isVisible = True
Else
ThisComponent.Sheets.GetByName("Tabelle1").Rows(x).isVisible = False
End if
End if
Next x
Habe schon probiert dieses Makro für jeden bereich (s.u.) einzeln anzulegen..
+ weitere Bedingung mit Inhalt "Manuelle Eingabe" (s.u.)
nur leider ist es so, wenn ich das nächste makro aktiviere werden die zuvor ausgeblendeten zeilen wieder eingeblendet..
und zwar so:

Code: Alles auswählen

Sub Fac_ausblenden
'die Spalte in welcher die zu prüfende Zelle steht
'hier eintragen. Spalte 1 (Spalte A) entspricht 0
vorgabe = 0
'die letzte zu prüfende Zeile hier eintragen
'Zeile 1 entspricht 0
min_zeile = 32
max_zeile = 80
For x = 0 to max_zeile
If ThisComponent.Sheets.GetByName("Tabelle1").getCellByPosition(vorgabe, x).String = ""&"Manuelle Eingabe" Then
If ThisComponent.Sheets.GetByName("Tabelle1").Rows(x).isVisible = False Then
ThisComponent.Sheets.GetByName("Tabelle1").Rows(x).isVisible = True
Else
ThisComponent.Sheets.GetByName("Tabelle1").Rows(x).isVisible = False
End if
End if
Next x
End Sub
Bedingungen sind:
- verschiedene Zeilenbereiche
10-28
32-80
89-94
99-106
- nicht nur ausblenden wenn zeilen leer, sondern auch beim Inhalt "Manuelle Eingabe"
- zuletzt ist noch wichtig, dass man mehrere Tabellennamen einfügen kann, denn dieses makro ist wichtig für rund 30 Tabellen..

hat jemand eine loesung?
denn ich kenne mich leider nicht mit der schreibweise aus..

Hat jemand vielleicht eine Idee?

Grüße
Ey-Ko



Moderation,4: verschoben in BASIC-Unterbereich, wo alle Makro-Fragen hin gehören; Betreff angepasst; CODE tags gesetzt
Benutzeravatar
komma4
********
Beiträge: 5332
Registriert: Mi, 03.05.2006 23:29
Wohnort: Chon Buri Thailand Asia
Kontaktdaten:

Re: Calc: Zellen ein-/ausblenden

Beitrag von komma4 »

Vielleicht hilft Dir mein folgendes Makro aus dem englischen Forum weiter:

Code: Alles auswählen

Sub ooo124252
' 2011-06-12

' column's A, B, D, G to Q, T, W to AC, AE to AG, and hide them all.
' Then i need to stretch C to be 11 CM and E to be 3CM

oDoc = ThisComponent
oSheets = oDoc.Sheets()


sHide = "A,B,D,G,H,I,J,K,L,M,N,O,P,Q,T,W,X,Y,Z,AA,AB,AC,AE,AF,AG"
sWidth11 = "C"
sWidth3 = "E"
sSheets = "Tabelle1,Tabelle2"


s() = split( sSheets, ",")
h() = split( sHide, "," )
w11() = split( sWidth11, "," )
w3() = split( sWidth3, "," )

' work on every sheetname given
For idxS = 0 To UBound( s )

    oSheet = oSheets.getByName( s(idxS) )
    
    For idxH = 0 To UBound( h )
       oCol = oSheet.Columns().getByName( h( idxH )
       oCol.isVisible = FALSE
    Next idxH
    
    For idxW = 0 To UBound( w11 )
       oCol = oSheet.Columns().getByName( w11( idxW )
       oCol.Width = 11000
    Next idxW
    For idxW = 0 To UBound( w3 )
       oCol = oSheet.Columns().getByName( w3( idxW )
       oCol.Width = 3000
    Next idxW

Next idxS

End Sub

Blendet die angegebenen Spalten, in den angegebenen Tabellenblättern aus (und setzt die Spalten in sWidth11 bzw. sWidth3 auf vorgegebene Breite).


Kannst Du das für Deinen Bedarf anpassen?
Cheers
Winfried
aktuell: LO 5.3.5.2 30m0(Build:2) SUSE rpm, unter Linux openSuSE Leap 42.3 x86_64/KDE5
DateTime2 Einfügen von Datum/Zeit/Zeitstempel (als OOo Extension)
Ey-Ko
Beiträge: 8
Registriert: Di, 08.12.2009 15:46

Re: Calc: Zellen ein-/ausblenden

Beitrag von Ey-Ko »

Vielen Dank für die Antwort,

aber leider komme ich damit nicht zurecht, zumal weiß ich auch nicht bei welchen Bedingungen es die Spalten ausblendet..

Bei meiner Funktion soll ja jede Zeile die Leer ist oder mit den Inhalt "Manuelle Eingabe" befüllt ist ausgeblendet werden, dass aber nur in gewissen bereichen von Zellen..
Ey-Ko
Beiträge: 8
Registriert: Di, 08.12.2009 15:46

Re: Calc: Zellen ein-/ausblenden

Beitrag von Ey-Ko »

ist es vielleicht auch einfach möglich bestimmte zeilennummern nicht zu auszublenden..
dass dieses makro gewisse zeilennummern nicht zu berühren hat, denn dann denke ich könnt es klappen..
also zeilennummer ausgeschlossen sind..
Tictac
**
Beiträge: 25
Registriert: Di, 12.01.2010 15:12

Re: Calc: Zellen ein-/ausblenden

Beitrag von Tictac »

Ich würde dir empfehlen deine Bereiche mit einer For Schleife zu durchlaufen und den Rest auszulagern
Das Problem wegen der beiden Eingaben muss ich noch kurz testen.

Code: Alles auswählen

Sub Iteration

For i= 9 to 27 REM Erster Zellbereich (Nicht vergessen Zeilen werden als Array addressiert und das beginnt bei Zeile 0)
ZeileAusblenden(x)
Next

For i=31 To 79
ZeileAusblenden(x)
Next

.....

End Sub

sub ZeileAusblenden(x as Integer)
If ThisComponent.Sheets.GetByName("Tabelle1").getCellByPosition(vorgabe, x).String = "" Then
If ThisComponent.Sheets.GetByName("Tabelle1").Rows(x).isVisible = False Then
ThisComponent.Sheets.GetByName("Tabelle1").Rows(x).isVisible = TrueElse
ThisComponent.Sheets.GetByName("Tabelle1").Rows(x).isVisible = False
End if
End if
end Sub
Tictac
**
Beiträge: 25
Registriert: Di, 12.01.2010 15:12

Re: Calc: Zellen ein-/ausblenden

Beitrag von Tictac »

Für die beiden Bedingungen "" und Manuelle Eingabe musst du die IF etwas anpassen

Code: Alles auswählen

If ThisComponent.Sheets.GetByName("Tabelle1").getCellByPosition(vorgabe, x).String = "" [b]OR ThisComponent.Sheets.GetByName("Tabelle1").getCellByPosition(vorgabe, x).String = "Manuelle Eingabe" [/b] Then
Noch irgendwelche Fragen offen?
Ey-Ko
Beiträge: 8
Registriert: Di, 08.12.2009 15:46

Re: Calc: Zellen ein-/ausblenden

Beitrag von Ey-Ko »

Sehr gut vielen Dank,

ich denke das geht schon in die richtige Richtung:

Sub Iteration

For i= 9 to 27 REM Erster Zellbereich (Nicht vergessen Zeilen werden als Array addressiert und das beginnt bei Zeile 0)
ZeileAusblenden(x)
Next

For i=31 To 79
ZeileAusblenden(x)
Next

For i=88 To 93
ZeileAusblenden(x)
Next

For i=98 To 105
ZeileAusblenden(x)
Next

End Sub

sub ZeileAusblenden(x as Integer)
If ThisComponent.Sheets.GetByName("Tabelle1").getCellByPosition(vorgabe, x).String = "" OR ThisComponent.Sheets.GetByName("Tabelle1").getCellByPosition(vorgabe, x).String = "Manuelle Eingabe" Then
If ThisComponent.Sheets.GetByName("Tabelle1").Rows(x).isVisible = False Then
ThisComponent.Sheets.GetByName("Tabelle1").Rows(x).isVisible = TrueElse
ThisComponent.Sheets.GetByName("Tabelle1").Rows(x).isVisible = False
End if
End if
End Sub

Nur zeigt er mir hier eine Fehlermeldung:

..(vorgabe, x).String = "" OR ThisComponent.. _ Erwartet wird Then
Tictac
**
Beiträge: 25
Registriert: Di, 12.01.2010 15:12

Re: Calc: Zellen ein-/ausblenden

Beitrag von Tictac »

Faszinierenderweise bei mir nicht....Welche OOo Version nutzt du?
Benutzeravatar
balu
********
Beiträge: 3812
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: Calc: Zellen ein-/ausblenden

Beitrag von balu »

Hallo Leute,

Lösung simpel.

Code: Alles auswählen

If ThisComponent.Sheets.GetByName("Tabelle1").getCellByPosition(vorgabe, x).String = "" OR ThisComponent.Sheets.GetByName("Tabelle1").getCellByPosition(vorgabe, x).String = "Manuelle Eingabe" Then
Das gehört nämlich nicht in 2 (ZWEI) Zeilen, sondern in 1 (EINE) Zeile. Es darf KEIN Zeilenumbruch dazwischen sein.


Oder aber folgendermaßen.

Code: Alles auswählen

If ThisComponent.Sheets.GetByName("Tabelle1").getCellByPosition(vorgabe, x).String = "" OR _ ThisComponent.Sheets.GetByName("Tabelle1").getCellByPosition(vorgabe, x).String = "Manuelle Eingabe" Then
Dann ist aber darauf dringend zu achten, dass nach OR hinter dem Unterstrich (_) KEIN weiteres Zeichen mehr ist, also auch kein Leerzeichen. Dann müsste es passen.



Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Calc: Zellen ein-/ausblenden

Beitrag von DPunch »

Aloha

Alternativer Vorschlag, da das Iterieren über die Zellen sehr langsam ist bei OOo Basic:

Code: Alles auswählen

	oDoc = thisComponent	
	aTables = Array("Tabelle1","Tabelle2","Tabelle3") REM **Sheetnamen
	aRowRanges = Array("10-28","32-80","89-94","99-106") REM **Zellbereiche
	nColumn = 0 REM **Suchspalte
	oSheets = oDoc.Sheets
	oDoc.lockControllers
	sMissing = ""
	For each Tablename in aTables
		If oSheets.hasByName(Tablename) Then
			oSheet = oSheets.getByName(Tablename)
			oRows = oSheet.Rows
			For each DefinedRowRange in aRowRanges
				aTmp = Split(DefinedRowRange,"-")
				nStart = aTmp(0)
				nEnd = aTmp(1)
				oRange = oSheet.getCellRangeByPosition(nColumn,nStart,nColumn,nEnd)
				aData = oRange.getDataArray
				For i = 0 To UBound(aData)
					If Len(aData(i)(0)) = 0 OR aData(i)(0) = "Manuelle Eingabe" Then
						oRows(i+nStart).isVisible = NOT oRows(i+nStart).IsVisible
					End If
				Next i			
			Next DefinedRowRange
		Else
			sMissing = sMissing & Chr(13) & Tablename
		End If
	Next Tablename
	Do While oDoc.hasControllersLocked
		oDoc.unlockControllers
	Loop
	sMsg = "Abgeschlossen"
	If Len(sMissing) > 0 Then
		sMsg = sMsg & Chr(13) & Chr(13) & "Nicht gefundene Tabellen:" & sMissing
	End If
	MsgBox sMsg,64,"Info"
Bedauerlicherweise ist die Funktion ".queryEmptyCells" buggy, ansonsten könnte man das per SearchDescriptor und queryEmptyCells noch ein wenig eleganter und schneller lösen.
Ey-Ko
Beiträge: 8
Registriert: Di, 08.12.2009 15:46

Re: Calc: Zellen ein-/ausblenden

Beitrag von Ey-Ko »

Vielen Dank für eure Mühe..
balu hat geschrieben:Hallo Leute,

Lösung simpel.

Code: Alles auswählen

If ThisComponent.Sheets.GetByName("Tabelle1").getCellByPosition(vorgabe, x).String = "" OR ThisComponent.Sheets.GetByName("Tabelle1").getCellByPosition(vorgabe, x).String = "Manuelle Eingabe" Then
Das gehört nämlich nicht in 2 (ZWEI) Zeilen, sondern in 1 (EINE) Zeile. Es darf KEIN Zeilenumbruch dazwischen sein.


Oder aber folgendermaßen.

Code: Alles auswählen

If ThisComponent.Sheets.GetByName("Tabelle1").getCellByPosition(vorgabe, x).String = "" OR _ ThisComponent.Sheets.GetByName("Tabelle1").getCellByPosition(vorgabe, x).String = "Manuelle Eingabe" Then
Dann ist aber darauf dringend zu achten, dass nach OR hinter dem Unterstrich (_) KEIN weiteres Zeichen mehr ist, also auch kein Leerzeichen. Dann müsste es passen.



Gruß
balu
Leider beides Fehler..

DPunch hat geschrieben:Aloha

Alternativer Vorschlag, da das Iterieren über die Zellen sehr langsam ist bei OOo Basic:

Code: Alles auswählen

	oDoc = thisComponent	
	aTables = Array("Tabelle1","Tabelle2","Tabelle3") REM **Sheetnamen
	aRowRanges = Array("10-28","32-80","89-94","99-106") REM **Zellbereiche
	nColumn = 0 REM **Suchspalte
	oSheets = oDoc.Sheets
	oDoc.lockControllers
	sMissing = ""
	For each Tablename in aTables
		If oSheets.hasByName(Tablename) Then
			oSheet = oSheets.getByName(Tablename)
			oRows = oSheet.Rows
			For each DefinedRowRange in aRowRanges
				aTmp = Split(DefinedRowRange,"-")
				nStart = aTmp(0)
				nEnd = aTmp(1)
				oRange = oSheet.getCellRangeByPosition(nColumn,nStart,nColumn,nEnd)
				aData = oRange.getDataArray
				For i = 0 To UBound(aData)
					If Len(aData(i)(0)) = 0 OR aData(i)(0) = "Manuelle Eingabe" Then
						oRows(i+nStart).isVisible = NOT oRows(i+nStart).IsVisible
					End If
				Next i			
			Next DefinedRowRange
		Else
			sMissing = sMissing & Chr(13) & Tablename
		End If
	Next Tablename
	Do While oDoc.hasControllersLocked
		oDoc.unlockControllers
	Loop
	sMsg = "Abgeschlossen"
	If Len(sMissing) > 0 Then
		sMsg = sMsg & Chr(13) & Chr(13) & "Nicht gefundene Tabellen:" & sMissing
	End If
	MsgBox sMsg,64,"Info"
Bedauerlicherweise ist die Funktion ".queryEmptyCells" buggy, ansonsten könnte man das per SearchDescriptor und queryEmptyCells noch ein wenig eleganter und schneller lösen.
Hier ist das Problem, dass entweder Einblenden oder Ausblenden automatisch erzwungen wird.. (Besser wäre es, wenn es jeweils ein Makro für beides gibt.. Alle Felder Einblenden in allen Sheets oder gewünschte Zellen in allen Sheets ausblenden..)
Zudem werden die Zeilen ab 99 nicht korrekt ausgeblendet.. (habs auch schon einzelnb probiert also "99","100","101","102"...)

Trotzdem vielen Dank für die Mühe an euch alle..

Version ist 3.2.1.
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Calc: Zellen ein-/ausblenden

Beitrag von DPunch »

Aloha
Ey-Ko hat geschrieben:Hier ist das Problem, dass entweder Einblenden oder Ausblenden automatisch erzwungen wird.
Nun, ich hatte mich einfach nur an Deinen ersten Post gehalten.
Eine solche Unterscheidung kannst Du ja problemlos einbauen, z.B. per Inputbox.

Code: Alles auswählen

       oDoc = thisComponent   
       aTables = Array("Tabelle1","Tabelle2","Tabelle3") REM **Sheetnamen
       aRowRanges = Array("10-28","32-80","89-94","96-97","99-106") REM **Zellbereiche
       nColumn = 0 REM **Suchspalte
       sChoice = InputBox("Sollen die Zeilen" & Chr(13) & "(e) eingeblendet" & Chr(13) & "(a) ausgeblendet" & Chr(13) & "werden?", "Zeilen ein-/ausblenden", "e")
	    If LCase(Left(sChoice,1)) = "e" Then
	       bHide = False
	    ElseIf LCase(Left(sChoice,1)) = "a" Then
	       bHide = True	   
	    Else
	       Exit Sub  
	    End If
       oSheets = oDoc.Sheets
       oDoc.lockControllers
       sMissing = ""
       For each Tablename in aTables
          If oSheets.hasByName(Tablename) Then
             oSheet = oSheets.getByName(Tablename)
             oRows = oSheet.Rows
             If bHide Then
             	For each DefinedRowRange in aRowRanges                	
                	aTmp = Split(DefinedRowRange,"-")
                	nStart = aTmp(0)
                	nEnd = aTmp(1)
	                oRange = oSheet.getCellRangeByPosition(nColumn,nStart,nColumn,nEnd)                
	                aData = oRange.getDataArray
	                For i = 0 To UBound(aData)
	                   If Len(aData(i)(0)) = 0 OR aData(i)(0) = "Manuelle Eingabe" Then
	                      oRows(i+nStart).isVisible = False
	                   End If
	                Next i
	            Next DefinedRowRange
	         Else
	          	oRows.isVisible = True
	         End If   
          Else
             sMissing = sMissing & Chr(13) & Tablename
          End If
       Next Tablename
       Do While oDoc.hasControllersLocked
          oDoc.unlockControllers
       Loop
       sMsg = "Abgeschlossen"
       If Len(sMissing) > 0 Then
          sMsg = sMsg & Chr(13) & Chr(13) & "Nicht gefundene Tabellen:" & sMissing
       End If
       MsgBox sMsg,64,"Info"
Ey-Ko hat geschrieben:Zudem werden die Zeilen ab 99 nicht korrekt ausgeblendet.. (habs auch schon einzelnb probiert also "99","100","101","102"...)
Was genau meinst Du mit "nicht korrekt"? Wie macht sich das bemerkbar?
Bei mir werden die Zeilen absolut korrekt aus- und eingeblendet (OOo Version 3.2.1).
Wenn der Code bis 99 einwandfrei läuft, gibt es auch keinerlei Grund, warum er das ab 99 nicht mehr machen sollte.
Ey-Ko
Beiträge: 8
Registriert: Di, 08.12.2009 15:46

Re: Calc: Zellen ein-/ausblenden

Beitrag von Ey-Ko »

That´s it..

Die Zeilen die er mir trotz eingabe von..
aRowRanges = Array("10-28","32-80","89-94","96-97","99-106") REM **Zellbereiche
..ausblendete habe ich nun mit Leerzeichen befüllt.
z.B. hat er auch 30 ausgeblendet.. naja nun hab ich ne einfache lösung gefunden..
Und für die Sverweise habe ich auch eine simple formelloesung gefunden..


Vielen Dank für die tolle Zusammenarbeit..
und besonders für deine Mühen..
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: Calc: Zellen ein-/ausblenden

Beitrag von DPunch »

Aloha
Ey-Ko hat geschrieben:Die Zeilen die er mir trotz eingabe von..
aRowRanges = Array("10-28","32-80","89-94","96-97","99-106") REM **Zellbereiche
..ausblendete habe ich nun mit Leerzeichen befüllt.
Wie gesagt, der Code gibt keinen derartigen Fehler her.

Möglicherweise scheitert es daran, dass Dir nicht bewusst ist, dass die Zeilen in Basic 0-basiert sind?
Zeile 1 im Calc-Sheet eintspricht Zeile 0 in einem Makro, ein im Makro definierter Zeilenbereich "1-5" blendet also im Calc-Sheet die Zeilen 2-6 aus.
Antworten