Seite 1 von 2
CALC:Zeilen ausblenden
Verfasst: Do, 28.06.2012 17:32
von hansolo
Hallo,
ich möchte einige Zeilen (z.B. 10-15) ausblenden, wenn im Feld B3 ein bestimmtes Wort steht, z.B. "Hund".
Steht dort das Wort "Katze", dann sollen andere Zeilen ausgeblendet werden (z.B. 16-20).
Ich habe den allwissenden google befragt und auch hier im Forum gesucht, jedoch konnte ich mit den Treffern nichts anfangen. Verstehe Basic nicht mehr.
Über Hilfe wäre ich also sehr glücklich.
Besten Dank.
Moderation,4: verschoben in BASIC-Unterbereich, wo alle Makro-Fragen hin gehören; Betreff angepasst
Re: Hilfe für Makro zum Zeilenausblenden gesucht
Verfasst: Do, 28.06.2012 18:03
von Karolus
Hallo
Nimm in einer Hilfspalte in den Zeilen 10-15 die Formel =$B$3="Hund" in Zeile 16-20 das selbe in "Katze" und füll den Rest mit 0 soweit wie nötig.
Das Aus-/Einblenden regelst du dann per →Daten→Filter→Standardfilter : $Hilfspalte ungleich 1
Karo
Re: Hilfe für Makro zum Zeilenausblenden gesucht
Verfasst: Fr, 29.06.2012 14:51
von hansolo
Hallo Karolus,
das war eine gute Idee, habe einige Zeit damit experimentiert. leider aktualisiert sich der Autofilter jedoch nicht permanent. Wenn ich im Auswahlfeld B3 statt "Hund" jetzt "Katze" oder "Maus" eingebe, dann passiert nichts in der Autofilterspalte. Ich möchte erreichen, dass bestimmte Zeilen verschwinden, wenn man in B3 einen von 4 verschiedenen Begriffen auswählt.
Re: Hilfe für Makro zum Zeilenausblenden gesucht
Verfasst: Fr, 29.06.2012 19:11
von F3K Total
Hi,
anbei ein Beispiel mit Listenfeld und Makro.
Die Zeilen kannst Du auf Tabelle2 einstellen.
Viel Spaß, Gruß R
Re: CALC:Zeilen ausblenden
Verfasst: Fr, 29.06.2012 20:22
von Karolus
Hallo
@F3K Total:
Mit Python gehts schneller - ok ich hab die Einstellungen im Quelltext hinterlegt.
Sourcecode:
Code: Alles auswählen
fstring = "A%s:A%s"
hideranges = {
"Hans": fstring % (5, 10), # Zeilen 5 bis 10
"Heiner": fstring % (10, 14), #Zeilen 11 bis 15
"August": fstring % (15, 20) #usw.
}
def hide_rows_depend_on_B4( event ):
"""
blendet die zu dem Namen gehörenden Zeilen
aus dem Dictionary oben aus -
es muss mit dem Tabellenereignis "Inhalt geändert"
verknüpft werden
"""
sheet = event.getSpreadsheet()
if event.AbsoluteName == '$%s.$%s' %( sheet.Name, "B$4" ):
sname = event.getString()
namerange = sheet.getCellRangeByName
for key , nrange in hideranges.items():
rows = namerange( nrange ).Rows
rows.IsVisible = key != sname
Karo
Re: CALC:Zeilen ausblenden
Verfasst: Fr, 29.06.2012 20:44
von F3K Total
OK,
auch wenn ich die Einstellungen im Quelltext hinterlege ist Python schneller.
Wie komme ich im Dokument an den Quelltext?
Gruß R
Re: CALC:Zeilen ausblenden
Verfasst: Fr, 29.06.2012 22:07
von Karolus
Hallo
Wie komme ich im Dokument an den Quelltext?
Entpacke die Datei in einen neuen Ordner ( mit 7 zip oder ähnlichem ) und wechsle in den Unterordner ~Scripts/python/
Ps. Mit Hilfe der Extensions
"Editorkicker" und "ModifiedScriptProvider" von Hanya ( dem Entwickler von MRI ! ) ist das Einbetten von Pythonscripts mit ein paar Mausklicks erledigt. Lediglich das direkte Laden und Bearbeiten eines eingebetten Scripts funktioniert nicht, man braucht halt eine Arbeitskopie vorzugsweise unter
~/user/Scripts/python/...
Karo
Re: CALC:Zeilen ausblenden
Verfasst: Mo, 02.07.2012 16:23
von hansolo
Hallo F3K total,
danke für die Datei. Das ist schon ein großer Schritt nach vorne. Leider verstehe ich die Programmiersprache einfach nicht. Ich erkenne nicht, wo ich die Zeilenposition eingebe, in der sich mein Auswahlfeld befindet. Daher bin ich leider nicht in der Lage, die Vorlage zu individualisieren.
Eingabe und Ausgabe befinden sich im selben Reiter. Das Dropdownfeld befindet sich in der Zelle C16.
Wenn dort steht: Hund, dann sollen die Zeilen 18 bis 22 ausgeblendet werden
wenn dort steht: Katze, dann sollen die Zeilen 18 bis 22 und 40 bis 46 ausgeblendet werden
wenn dort steht: Maus, dann sollen die Zeilen 40 bis 46 ausgeblendet werden
Über eine erneute Hilfe wäre ich ergebends dankbar

Re: CALC:Zeilen ausblenden
Verfasst: Mo, 02.07.2012 20:15
von Karolus
Hallo
Ich häng noch mal ein überarbeitetes Beispiel an, die Einstellungen werden aus Tabelle2.A2:B20 bezogen.
und der Quellcode:
Code: Alles auswählen
context = XSCRIPTCONTEXT
def einstellungen():
"""
Bezieht die Einstellungen aus Tabelle2.A2:A20
Spalte A Spalte B
von-bis Name,Name2,etc.
usw....
"""
doc = context.getDocument()
esheet = doc.Sheets.getByIndex(1) #Tabelle2
drange = esheet.getCellRangeByName("A2:B20")
rawdata = drange.getDataArray()
ddict = {}
for row in rawdata:
if row[0]:
first, last = row[0].split('-')
key = 'A%s:A%s' % (first, last)
ddict[ key ] = row[1].split(',')
return ddict
def hide_rows_depend_on_B4( event ):
"""
blendet die zu dem Namen gehörenden Zeilen
aus den Einstellungen aus -
es muss mit dem Tabellenereignis "Inhalt geändert"
verknüpft werden
"""
hideranges = einstellungen()
sheet = event.getSpreadsheet()
if event.AbsoluteName == '$%s.$%s' %( sheet.Name, "B$4" ):
sname = event.getString()
namerange = sheet.getCellRangeByName
for key , animals in hideranges.items():
rows = namerange( key ).Rows
rows.IsVisible = sname not in animals
Re: CALC:Zeilen ausblenden
Verfasst: Mo, 02.07.2012 20:30
von F3K Total
Hallo hansolo,
von
hansolo hat geschrieben:dann sollen die Zeilen 18 bis 22 und 40 bis 46 ausgeblendet werden
war bislang keine Rede. Es handelt sich um zwei Bereiche. Da muss das Makro anders aufgebaut werden.
Gerade habe ich gesehen, dass Karolus mit seiner Lösung schneller war,ich möchte Dir aber meine Basic-Lösung nicht vorenthalten.
Auch hier werden die Einstellungen in Tabelle2 vorgenommen.
Gruß R
Re: CALC:Zeilen ausblenden
Verfasst: Di, 03.07.2012 11:58
von hansolo
Hallo F3K total,
danke, genau das ist es. Anfangs ist das Auswahlfeld schrittweise nach oben gerutscht, wenn man mehrmals damit ausgewählt hat, ich konnte es jedoch dann fest positionieren.
Hätte nicht gedacht, dass es so kompliziert ist (jedenfalls für mich). Nochmals vielen Dank.
Ein Problem besteht allerdings jetzt: wenn ich irgendwo auf der Seite eine Eingabe mache, z. B. in den Zeilen darüber oder in den Zeilen, die durch das Makro gezeigt werden, dann erscheint durch das Makro eine Fehlermeldung: "Eigenschaften oder Methode nicht gefunden: Source".
Wie kann ich das verhindern oder unterdrücken?
Grüße
Re: CALC:Zeilen ausblenden
Verfasst: Di, 03.07.2012 18:23
von F3K Total
ups, mein Fehler, es ist unter den Tabellenereignissen fälschlicherweise noch das Makro eingetragen.
Du gehst mit der rechten Maustaste auf den Tabellenreiter "Tabelle1"->"Tabellenereignisse..." und wählst die Zeile "Inhalt geändert", klickst auf "entfernen" und "OK", speichern fertig.
Gruß R
Re: CALC:Zeilen ausblenden
Verfasst: Mi, 04.07.2012 16:58
von hansolo
Ihr seit die Größten. Es funktioniert. ich bin begeistert. Weil ich diese Funktion so großartig finde, habe ich mir gleich gedacht, dann kann ich in einem weiteren Reiter ebenfalls mit der Eingabe einige Zeilen ausblenden. Ich habe den Code entsprechend erweitert und auch weitestgehend angepasst.
Jedoch blendet er in dem zusätzlichen Reiter nicht alle Zeilen ein, wenn ich nichts ausgewählt habe (Auswahlfeld "alle").
Hier mal der Code, was habe ich falsch gemacht?
Code: Alles auswählen
REM ***** BASIC *****
Sub ein_ausblenden (event)
sitem = event.source.selectedItem
osheet2 = thisComponent.sheets.getbyname("Tabelle2")
for i = 1 to 5
ocell = osheet2.getcellbyposition(0,i)
oStartcell1 = osheet2.getcellbyposition(1,i)
oEndcell1 = osheet2.getcellbyposition(2,i)
oStartcell2 = osheet2.getcellbyposition(3,i)
oEndcell2 = osheet2.getcellbyposition(4,i)
sText = ocell.string
if sText = sitem then
nstartrow1 = oStartcell1.value
nEndrow1 = oEndcell1.value
nstartrow2 = oStartcell2.value
nEndrow2 = oEndcell2.value
endif
next i
osheet1 = thisComponent.sheets.getbyname("Tabelle1")
ocursor = osheet1.createcursor
ocursor.gotoendofusedarea(false)
nEndusedrows = ocursor.rangeaddress.EndRow
for i = 0 to nEndusedrows
orow = osheet1.Rows(i)
orow.IsVisible = true
next i
if sitem = "alle" then exit sub
for i = nstartrow1-1 to nEndrow1-1
orow = osheet1.Rows(i)
orow.IsVisible = false
next i
if not isnull(nstartrow2) then
for i = nstartrow2-1 to nEndrow2-1
orow = osheet1.Rows(i)
orow.IsVisible = false
next i
endif
sitem = event.source.selectedItem
osheet2 = thisComponent.sheets.getbyname("Datenblatt")
for i = 1 to 5
ocell = osheet2.getcellbyposition(5,i)
oStartcell1 = osheet2.getcellbyposition(6,i)
oEndcell1 = osheet2.getcellbyposition(7,i)
oStartcell2 = osheet2.getcellbyposition(8,i)
oEndcell2 = osheet2.getcellbyposition(9,i)
sText = ocell.string
if sText = sitem then
nstartrow1 = oStartcell1.value
nEndrow1 = oEndcell1.value
nstartrow2 = oStartcell2.value
nEndrow2 = oEndcell2.value
endif
next i
osheet1 = thisComponent.sheets.getbyname("Tabelle3")
ocursor = osheet1.createcursor
ocursor.gotoendofusedarea(false)
nEndusedrows = ocursor.rangeaddress.EndRow
for i = 0 to nEndusedrows
orow = osheet1.Rows(i)
orow.IsVisible = true
next i
if sitem = "alle" then exit sub
for i = nstartrow1-1 to nEndrow1-1
orow = osheet1.Rows(i)
orow.IsVisible = false
next i
if not isnull(nstartrow2) then
for i = nstartrow2-1 to nEndrow2-1
orow = osheet1.Rows(i)
orow.IsVisible = false
next i
endif
End Sub
Re: CALC:Zeilen ausblenden
Verfasst: Do, 05.07.2012 05:22
von F3K Total
Das hängt von einigen Dingen ab:
1.) Sollen auf dem weiteren Blatt genau die gleichen Zeilen ausgeblendet werden oder sollen es andere sein?
2.) Wenn es andere sein sollen, wo werden sie definiert?
Am besten lädst Du ein ggf. verfremdetes Beispieldokument hoch.
Gruß R
Re: CALC:Zeilen ausblenden
Verfasst: Do, 05.07.2012 11:10
von Karolus
Hallo
Im angehängten Beispiel können alle Argumente für jedes Tabellenblatt individuell eingestellt werden, die Einstellungen werden im ersten Tabellenblatt ("Einstellungen" ) eingetragen.
Ps. Quellcode:
Code: Alles auswählen
import re
from itertools.chain import from_iterable as flat
context = XSCRIPTCONTEXT
absrex = re.compile( r'([A-Z]+)(\d+)' )
def ausblenden_wenn( event ):
"""
Muss mit dem Tabellenereignis: 'Inhalt geändert'
verknüpft werden.
Bezieht die Einstellungen aus der ersten Tabelle
erste Zeile: Tabellennamen
zweite Zeile: die zu überwachenden Zelladressen
Spalte A: Die Namen ...
B3 bis ??: ... für die Zeilen 'n;m'
"""
targetsheet = event.getSpreadsheet()
doc = context.getDocument()
esheet = doc.Sheets.getByIndex(0) #Einstellungen
sheetsrange = esheet.getCellRangeByName("A1:Z1")
sheetnames = list( flat(sheetsrange.getDataArray()) )
col_i = sheetnames.index( targetsheet.Name )
which = esheet.getCellByPosition( col_i, 1).getString()
which = absrex.sub( r'$\1$\2', which )
if event.AbsoluteName == '$%s.%s' %( targetsheet.Name, which ):
targetsheet.Rows.IsVisible = True
patternrange = esheet.getCellRangeByName("A3:A300")
patterns = flat( patternrange.getDataArray())
hideranges = esheet.getCellRangeByPosition( col_i, 2, col_i, 299 )
hides = flat( hideranges.getDataArray())
to_hide = [ data.split(";") for data, fname in zip(hides, patterns)
if fname == event.getString() and data ]
for elem in to_hide:
a, b = elem
nrange = 'A%s:A%s' % (a, b)
rows = targetsheet.getCellRangeByName( nrange ).Rows
rows.IsVisible = False
Karo