CALC:Zeilen 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:Zeilen ausblenden

Re: CALC:Zeilen ausblenden

von Karolus » Fr, 06.07.2012 16:42

Hallo

Du musst nichts "neu" machen - hol dir einfach das/die vorhandenen Blätter per →Einfügen→Tabelle→Aus Datei... in das Beispiel hinein ( achte darauf stets hinter dem Blatt 'Einstellungen' einzufügen )
Ergänze die Einstellungen und verknüpfe jede importierte Tabelle im Tabellenereignis 'Inhalt geändert' mit dem Script.

Karo

Re: CALC:Zeilen ausblenden

von hansolo » Fr, 06.07.2012 16:29

Hallo F3K,

danke für die Hilfe. Ich habe an dem Macro weiter rumgebastelt. Jetzt funktioniert es. Evtl. war noch irgendwo der Sheetbezug falsch und es hat wohl if sitem = "alle" then exit sub am Ende gefehlt. Jedenfalls läuft es jetzt so wie geplant und fehlerfrei.

Nochmals Danke an alle!

@ Karolus: ich habe den gesamte Tabelle um das Makro herum gebaut, meine Vermutung wäre, wenn ich jetzt das von Dir verwende, dann müsste ich alle neu machen. Aber: ich fange jetzt an mit Macros und Dein Vorschlag wird in der nächsten Tabelle verwendet. Versprochen :-)

Re: CALC:Zeilen ausblenden

von F3K Total » Do, 05.07.2012 19:20

Habe es korrigiert,
versuch mal zu erkennen woran es gelegen haben könnte.

Gruß R
Dateianhänge
Zellbereiche_ausblenden_zwei_Bereiche_hansolo.ods
(13.85 KiB) 108-mal heruntergeladen

Re: CALC:Zeilen ausblenden

von Karolus » Do, 05.07.2012 17:17

Hallo
hansolo hat geschrieben: @ Karolus: das sieht richtig clever aus und vor allem gut nutzbar aus.
Ja, dann benutze es...

Karo

Re: CALC:Zeilen ausblenden

von hansolo » Do, 05.07.2012 17:02

Der alte Obi Wan Kenobi sagt zu Luke: Du hast gerade den Schritt in eine größere Welt getan. So fühle ich mich. nach diesem holprigen Einstieg in die Welt der Macros erkenne ich dank Eurer Hilfe, was alles möglich ist...und das ist extrem viel.

@ Karolus: das sieht richtig clever aus und vor allem gut nutzbar aus.

@ F3K: ich habe die Tabelle mal angehängt, Reiter "Tabelle 3" setzt sich nicht mehr zurück auf den Ursprungszustand. In Tabelle zwei habe ich die Zeilenangaben für Tabelle 3 neben denen für Tabelle 1 positioniert.
Dateianhänge
Zellbereiche_ausblenden_zwei_Bereiche.ods
(15.03 KiB) 103-mal heruntergeladen

Re: CALC:Zeilen ausblenden

von Karolus » Do, 05.07.2012 11:10

Hallo
Im angehängten Beispiel können alle Argumente für jedes Tabellenblatt individuell eingestellt werden, die Einstellungen werden im ersten Tabellenblatt ("Einstellungen" ) eingetragen.
Zeilenausblenden_3.ods
(14.46 KiB) 230-mal heruntergeladen
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

Re: CALC:Zeilen ausblenden

von F3K Total » Do, 05.07.2012 05:22

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

von hansolo » Mi, 04.07.2012 16:58

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

von F3K Total » Di, 03.07.2012 18:23

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

von hansolo » Di, 03.07.2012 11:58

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

von F3K Total » Mo, 02.07.2012 20:30

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
Dateianhänge
Zellbereiche_ausblenden_zwei_Bereiche.ods
(12.34 KiB) 267-mal heruntergeladen

Re: CALC:Zeilen ausblenden

von Karolus » Mo, 02.07.2012 20:15

Hallo

Ich häng noch mal ein überarbeitetes Beispiel an, die Einstellungen werden aus Tabelle2.A2:B20 bezogen.
Zeilenausblenden2.ods
(12.13 KiB) 211-mal heruntergeladen
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

von hansolo » Mo, 02.07.2012 16:23

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

von Karolus » Fr, 29.06.2012 22:07

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

von F3K Total » Fr, 29.06.2012 20:44

OK,
auch wenn ich die Einstellungen im Quelltext hinterlege ist Python schneller.
Wie komme ich im Dokument an den Quelltext?
Gruß R

Nach oben