Seite 1 von 1
Calc: Zellen ein-/ausblenden
Verfasst: Mi, 22.06.2011 10:07
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
Re: Calc: Zellen ein-/ausblenden
Verfasst: Mi, 22.06.2011 10:28
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?
Re: Calc: Zellen ein-/ausblenden
Verfasst: Mi, 22.06.2011 10:48
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..
Re: Calc: Zellen ein-/ausblenden
Verfasst: Mi, 22.06.2011 11:33
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..
Re: Calc: Zellen ein-/ausblenden
Verfasst: Mi, 22.06.2011 11:39
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
Re: Calc: Zellen ein-/ausblenden
Verfasst: Mi, 22.06.2011 11:42
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?
Re: Calc: Zellen ein-/ausblenden
Verfasst: Mi, 22.06.2011 12:00
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
Re: Calc: Zellen ein-/ausblenden
Verfasst: Mi, 22.06.2011 12:11
von Tictac
Faszinierenderweise bei mir nicht....Welche OOo Version nutzt du?
Re: Calc: Zellen ein-/ausblenden
Verfasst: Mi, 22.06.2011 12:47
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
Re: Calc: Zellen ein-/ausblenden
Verfasst: Mi, 22.06.2011 13:27
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.
Re: Calc: Zellen ein-/ausblenden
Verfasst: Mi, 22.06.2011 14:37
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.
Re: Calc: Zellen ein-/ausblenden
Verfasst: Mi, 22.06.2011 18:24
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.
Re: Calc: Zellen ein-/ausblenden
Verfasst: Do, 23.06.2011 09:34
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..
Re: Calc: Zellen ein-/ausblenden
Verfasst: Do, 23.06.2011 12:29
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.