Calc: Zellen ein-/ausblenden

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: Calc: Zellen ein-/ausblenden

Re: Calc: Zellen ein-/ausblenden

von DPunch » Do, 23.06.2011 12:29

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.

Re: Calc: Zellen ein-/ausblenden

von Ey-Ko » Do, 23.06.2011 09:34

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..

Re: Calc: Zellen ein-/ausblenden

von DPunch » Mi, 22.06.2011 18:24

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.

Re: Calc: Zellen ein-/ausblenden

von Ey-Ko » Mi, 22.06.2011 14:37

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.

Re: Calc: Zellen ein-/ausblenden

von DPunch » Mi, 22.06.2011 13:27

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.

Re: Calc: Zellen ein-/ausblenden

von balu » Mi, 22.06.2011 12:47

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

Re: Calc: Zellen ein-/ausblenden

von Tictac » Mi, 22.06.2011 12:11

Faszinierenderweise bei mir nicht....Welche OOo Version nutzt du?

Re: Calc: Zellen ein-/ausblenden

von Ey-Ko » Mi, 22.06.2011 12:00

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

Re: Calc: Zellen ein-/ausblenden

von Tictac » Mi, 22.06.2011 11:42

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?

Re: Calc: Zellen ein-/ausblenden

von Tictac » Mi, 22.06.2011 11:39

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

Re: Calc: Zellen ein-/ausblenden

von Ey-Ko » Mi, 22.06.2011 11:33

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..

Re: Calc: Zellen ein-/ausblenden

von Ey-Ko » Mi, 22.06.2011 10:48

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..

Re: Calc: Zellen ein-/ausblenden

von komma4 » Mi, 22.06.2011 10:28

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?

Calc: Zellen ein-/ausblenden

von Ey-Ko » Mi, 22.06.2011 10:07

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

Nach oben