Seite 1 von 1

Spalten ausblenden/einblenden mit einem Button

Verfasst: Fr, 12.04.2013 15:49
von Rav
Hallo werte Community,

ich bin leider nicht besonders bewandert was programmiertechnische Sachen angeht und habe folgendes Problem:
Ich möchte in Open office Calc verschiedene Buttons erstellen, die je nachdem in welcher Stellung sie sich befinden, eine von mir gewünschte Spalte ein- oder ausblenden

Die Buttons sollen sich untereinander am linken Bildschirmrand befinden, z.B 5 Stück davon.
Der erste heißt "Sorte ein/aus" und blendet Spalte G ein/aus
Der zweite heißt "Zeitpunkt ein/aus" und blendet Spalte H ein/aus
Der dritte [...] blendet Spalte I ein/aus usw.


Ich habe bereits (Um-)Schaltflächen erstellt und es ist mir damit auch gelungen, Spalten auszublenden (über Makro aufzeichnen und der jeweiligen Fläche zuweisen), allerdings gelingt es mir nicht, diese mit demselben Button wieder einzublenden, weil ich nicht weiß wie man eine Wenn Funktion (?) einbaut und mit welchem Befehl man abfragen kann, in welcher Stellung sich der Button befindet. Ich habe mir seit Tagen einen Wolf gesucht und scheinbar ähnliche Themen gefunden, da ich von Visual Basic aber recht wenig verstehe und häufig den Wald vor lauter Bäumen nicht sehe, ist es einfach schwierig für mich sowas umzusetzen.

Kann jemand von euch einem absoluten Laien bei sowas weiterhelfen?
freundliche Grüße Rav.

Re: Spalten ausblenden/einblenden mit einem Button

Verfasst: Fr, 12.04.2013 16:53
von juetho
Hallo und willkommen im Forum,
Rav hat geschrieben:Ich habe bereits (Um-)Schaltflächen erstellt und es ist mir damit auch gelungen, Spalten auszublenden (über Makro aufzeichnen und der jeweiligen Fläche zuweisen),
Der Weg über "Makro aufzeichnen" ist leider oft nicht der beste Weg. Als erstes solltest du die Hilfsmittel durchlesen, die unter Informationen zur StarBasic-Programmierung (oberster Beitrag in diesem Unterforum) aufgeführt sind. Gerade für einfache Probleme führen Dannenhöfers FAQ oft am schnellsten zum Ziel wie bei Wie kann man Zeilen oder Spalten ausblenden.

Dazu gibt es einen winzigen programmiertechnischen Kniff, mit dem der aktuelle Zustand einfach "umgedreht" wird:

Code: Alles auswählen

currentColumn.isVisible = not currentColumn.isVisible
Rav hat geschrieben:da ich von Visual Basic aber recht wenig verstehe und häufig den Wald vor lauter Bäumen nicht sehe, ist es einfach schwierig für mich sowas umzusetzen.
Lösungen zu Visual Basic können auch nur in Grenzen helfen, da Visual Basic ein Microsoft-Produkt ist und die OO-Programme nichts mit MS zu tun haben, sondern mit einem anderen Basic-Dialekt (immer noch StarBasic genannt) arbeiten.

Viel Erfolg! Jürgen

Re: Spalten ausblenden/einblenden mit einem Button

Verfasst: Fr, 12.04.2013 18:40
von F3K Total
Hallo,
ein kleiner Tip dazu:
Rav hat geschrieben:weil ich nicht weiß wie man eine Wenn Funktion (?) einbaut und mit welchem Befehl man abfragen kann, in welcher Stellung sich der Button befindet.
Wenn du in den allgemeinen Eigenschaften der Schaltfäche Umschalten ... Ja einstellst, kannst Du mit diesem Makro weiterkommen. Hänge es an das Ereignis Status geändert.

Code: Alles auswählen

Sub S_Show_State(event)
    ocmd = event.source.model
    if ocmd.state = 1 then
       ocmd.label = "gedrückt"
    else
       ocmd.label = "nicht gedrückt"
    endif
End Sub
Dabei ist
  • Code: Alles auswählen

    event
    das Ereignis (Status der Schaltfläche geändert)
  • Code: Alles auswählen

    event.source.model
    das Model der Schaltfläche
  • Code: Alles auswählen

    ocmd.state
    der aktuelle Status der Schaltfläche, 0 für nicht gedrückt, 1 für gedrückt
  • Code: Alles auswählen

    ocmd.label
    die Beschriftung der Schaltfläche
Viel Erfolg
Gruß R

Re: Spalten ausblenden/einblenden mit einem Button

Verfasst: Fr, 12.04.2013 19:36
von Rav
Hallo und danke für eure Hilfe,
ich habe weiterhin versucht eine Lösung zu finden und eure Tipps umzusetzen, von einem funktionierenden Makro bin ich aber erwartungsgemäß noch sehr weit entfernt. Im Moment sieht es so aus:

Code: Alles auswählen

Sub Sorte_umschalten
oSheet = thisComponent.sheets(1)
oSpalte1 = oSheet.getColumns().getByName("G")  

    ocmd = event.source.model
    if ocmd.state = 1 then
       ocmd.label = "gedrückt"
       oSpalte1.isVisible = false 
    else
       ocmd.label = "nicht gedrückt"
       oSpalte1.isVisible = true
    endif
End Sub
Ich habe jetzt versucht, diese Wenn Funktion mit dem Befehl zum ausblenden der Spalten zu kombinieren, das habe ich einer Schaltfläche zugewiesen, Umschalten Ja eingestellt und wie beschrieben "Status geändert" zugewiesen.
Die Meldung, die ich bekomme lautet: "Objectvariable nicht belegt", wobei sich das wohl auf das "event.source.model" bezieht.
Was genau muss ich tun, um diese Variable zu belegen, bzw. muss ich einen zusätzlichen Begriff angeben, um ihm klar zu machen, dass es sich um eine Schaltfläche mit Umschaltfunktion handelt (das ist ja wahrscheinlich mit Modell gemeint)?

Entschuldigt bitte, wenn die Frage recht unbedarft daherkommt, aber ich bin wie gesagt ein Laie und habe noch nie irgendwas programmiert.

Re: Spalten ausblenden/einblenden mit einem Button

Verfasst: Fr, 12.04.2013 19:42
von F3K Total
Sieht doch schon gut aus,
ändere mal

Code: Alles auswählen

Sub Sorte_umschalten
oSheet = thisComponent.sheets(1)'Zeigt auf Tabelle2
in

Code: Alles auswählen

Sub Sorte_umschalten (event)
oSheet = thisComponent.sheets.getbyname("Tabelle1")
Gruß R

Re: Spalten ausblenden/einblenden mit einem Button

Verfasst: Sa, 13.04.2013 02:34
von Rav
Prima, jetzt funktioniert alles einwandfrei. :)
Danke euch beiden...

Re: Spalten ausblenden/einblenden mit einem Button

Verfasst: Sa, 11.05.2013 07:37
von Karolus
Hallo
Du kannst auch über das 'Columns'-objekt eines Zellbereichs arbeiten
(Der Zellbereich muss dann lediglich die gewünschten Spalten enthalten)

Code: Alles auswählen

Sub Sorte_umschalten ()
    oSheet = thisComponent.sheets.getbyname("Tabelle1")
    range = oSheet.getCellRangebyPosition(0,0,1,0)
    columns = range.getColumns()
    columns.isVisible = Not (columns.isVisible)
end sub
Reicht das Beispiel?

Karolus

Re: Spalten ausblenden/einblenden mit einem Button

Verfasst: Sa, 11.05.2013 07:50
von F3K Total
Hi,
ich habe alternativ eine Variante, in der der Index der Spalten (A=0, B=1 ...) in ein Array geschieben wird, dann kann man frei wählen:

Code: Alles auswählen

Sub Sorte_umschalten (event)
    dim arows
    arows() = array(0,1,3,5) 'entsprechen Spalte A,B,D,F
    oSheet = thisComponent.sheets.getbyname("Tabelle1")
    ocolumns = oSheet.Columns
    ocmd = event.source.model
    if ocmd.state = 1 then
        ocmd.label = "Side By Side"
        for i = 0 to ubound(arows)
            ocolumns(arows(i)).isVisible = false
        next i
    else
        ocmd.label = "Single Row"
        for i = 0 to ubound(arows)
            ocolumns(arows(i)).isVisible = true
        next i
    end if
End Sub
Gruß R

Re: Spalten ausblenden/einblenden mit einem Button

Verfasst: Sa, 11.05.2013 08:04
von Karolus
Hallo
@Rik
Dem Basic-interpreter ist das egal, aber den Leser könnte die Bezeichnung 'nRows' für ein Array von Spaltenindexen etwas verwirren.

Karolus

Re: Spalten ausblenden/einblenden mit einem Button

Verfasst: Sa, 11.05.2013 12:38
von F3K Total
Jo,
hier was Neues, geht auch, wenn der Button nicht auf Umschalten steht, und Fokussieren bei Klick ausgeschaltet ist.
Der Status wird alternierend in die Zusatzinformation (.tag) geschrieben.

Code: Alles auswählen

Sub Sorte_umschalten (event)
    dim arows1
    dim arows2
    arows1() = array(0,1,3,5) 'entsprechen Spalte A,B,D,F
    arows2() = array(2,4,6,7) 'entsprechen Spalte C,E,G,H
    oSheet = thisComponent.sheets.getbyname("Tabelle1")
    ocolumns = oSheet.Columns
    ocmd = event.source.model
    if ocmd.tag = 1 then
        ocmd.label = "zu A,B,D,F wechseln"
        ocmd.tag = 0
        for i = 0 to ubound(arows1)
            ocolumns(arows1(i)).isVisible = false
        next i
        for i = 0 to ubound(arows2)
            ocolumns(arows2(i)).isVisible = true
        next i
    else
        ocmd.label = " zu C,E,G,H wechseln"
        ocmd.tag = 1
        for i = 0 to ubound(arows1)
            ocolumns(arows1(i)).isVisible = true
        next i
        for i = 0 to ubound(arows2)
            ocolumns(arows2(i)).isVisible = false
        next i        
    end if
End Sub
Mit einem zweiten Button blendest Du alle Spalten ein:

Code: Alles auswählen

Sub S_alle_einblenden
    oSheet = thisComponent.sheets.getbyname("Tabelle1")
    ocolumns = oSheet.Columns
    ocolumns.IsVisible = true
End Sub
Gruß R
PS: Auf die Idee ein zweites Array zu verwenden hättest Du auch selbst kommen können, oder?