CALC:Zeilen ausblenden

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

Moderator: Moderatoren

hansolo
Beiträge: 7
Registriert: Do, 28.06.2012 17:26

CALC:Zeilen ausblenden

Beitrag 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
Karolus
********
Beiträge: 7535
Registriert: Mo, 02.01.2006 19:48

Re: Hilfe für Makro zum Zeilenausblenden gesucht

Beitrag 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
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
hansolo
Beiträge: 7
Registriert: Do, 28.06.2012 17:26

Re: Hilfe für Makro zum Zeilenausblenden gesucht

Beitrag 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.
F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: Hilfe für Makro zum Zeilenausblenden gesucht

Beitrag von F3K Total »

Hi,
anbei ein Beispiel mit Listenfeld und Makro.
Die Zeilen kannst Du auf Tabelle2 einstellen.
Viel Spaß, Gruß R
Dateianhänge
Zellbereiche_ausblenden.ods
(13.54 KiB) 486-mal heruntergeladen
Karolus
********
Beiträge: 7535
Registriert: Mo, 02.01.2006 19:48

Re: CALC:Zeilen ausblenden

Beitrag von Karolus »

Hallo

@F3K Total:
Mit Python gehts schneller - ok ich hab die Einstellungen im Quelltext hinterlegt. 8)

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
Zeilenausblenden.ods
(10.4 KiB) 244-mal heruntergeladen
Karo
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: CALC:Zeilen ausblenden

Beitrag 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
Karolus
********
Beiträge: 7535
Registriert: Mo, 02.01.2006 19:48

Re: CALC:Zeilen ausblenden

Beitrag 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
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
hansolo
Beiträge: 7
Registriert: Do, 28.06.2012 17:26

Re: CALC:Zeilen ausblenden

Beitrag 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 :-)
Karolus
********
Beiträge: 7535
Registriert: Mo, 02.01.2006 19:48

Re: CALC:Zeilen ausblenden

Beitrag von Karolus »

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

LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: CALC:Zeilen ausblenden

Beitrag 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
Dateianhänge
Zellbereiche_ausblenden_zwei_Bereiche.ods
(12.34 KiB) 267-mal heruntergeladen
hansolo
Beiträge: 7
Registriert: Do, 28.06.2012 17:26

Re: CALC:Zeilen ausblenden

Beitrag 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
F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: CALC:Zeilen ausblenden

Beitrag 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
hansolo
Beiträge: 7
Registriert: Do, 28.06.2012 17:26

Re: CALC:Zeilen ausblenden

Beitrag 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
F3K Total
********
Beiträge: 3724
Registriert: Mo, 28.02.2011 17:49

Re: CALC:Zeilen ausblenden

Beitrag 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
Karolus
********
Beiträge: 7535
Registriert: Mo, 02.01.2006 19:48

Re: CALC:Zeilen ausblenden

Beitrag 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.
Zeilenausblenden_3.ods
(14.46 KiB) 229-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
LO7.4.7.2 debian 12(bookworm) auf Raspberry5 8GB (ARM64)
LO25.2.3.2 flatpak debian 12(bookworm) auf Raspberry5 8GB (ARM64)
Antworten