4.8k Aufrufe
Gefragt in Tabellenkalkulation von
Hallo!

Ich habe ein Userform mit mehreren ToggleButtons. Mit diesen Buttons blende ich Spalten in einer Tabelle ein und aus. Ich möchte, dass die Buttons, wenn ich das Formular schließe beim nächsten Öffnen wieder in der gleichen Position angezeigt werden.

Momentan werden alle Togglebuttons beim schließen und wieder öffnen zurück gesetzt.

Ich bin sicher, dass ihr mir da weiter helfen könnt!

Danke!

18 Antworten

0 Punkte
Beantwortet von paul1 Experte (4.9k Punkte)
Hallo

Info:

der Button blendet die Spalten A bis C ein und aus.

Gruß

Paul1
0 Punkte
Beantwortet von ericmarch Experte (4.6k Punkte)
Ich stelle mal eine dumme Frage:
Es gibt die Ereignisse Userform.Initialize und Userform.Activate. Was steht denn in deren Codeblöcken?

Meiner Erinnerung nach sind diese UserForms nämlich eher nachtragend und merken sich alle das was sie nicht nicht merken sollen um einem beim Wiedertaufruf ein Bein zu stellen.

Greift der Ansatz oben nicht (und effektiv nehme ich das leider sogar an) bleibt auch aus meiner Sicht nur das Zwischenspeichern der Status {Plural!} irgendwo auf dem Blatt wo mans nicht sieht um es beim Aufruf einzuladen.

Eric March
0 Punkte
Beantwortet von
Guten Abend!

@Paul

Ich wollte die Schaltflächen nicht auf der Tabelle haben, deshalb das Formular. Ich hab schon so einige Varianten (incl. Menüband anpassen und Kontextmenü) durch und die Userform-Variante fand ich bisher am besten. Ich hab halt so ne riesige Tabelle und ich brauche die Schaltflächen auch noch bei Spalte AX... Die Tabelle wäre eigentlich ein Fall für eine Accessdatenbank. Wir haben aber kein Access bei der Arbeit.

@Eric
Die Tabelle muss einfach für alle Kollegen zu bedienen sein. Deshalb möchte ich ungern mit Zwischenspeichern und ausgeblendeten Daten oder zusätzlichen Tabellen arbeiten. Im Block UserForm.activate steht das, was ich in AW2 geschrieben habe.

Guts Nächtle!
0 Punkte
Beantwortet von paul1 Experte (4.9k Punkte)
Hallo Inka,

Der Button aus AW 10 außerhalb der UserForm würde den Anforderungen zur Gänze entsprechen, nur leider befindet er sich nicht in einer UserForm.

Hinter dem Button steht übrigens der gleiche Code wie bei dem in der UserForm.

Es geht eigentlich nur mehr darum das ganze so benutzerfreundlich zu gestalten, daß der Zugriff zu den einzelnen Button comfortabler wird.

Sollte mir diesbezüglich noch was einfallen, werde ich es übermitteln, da auch ich mich nur ungern damit abfinde, dass irgendwas nicht gehen sollte, gerade bei Excel.

Gruß

Paul1
0 Punkte
Beantwortet von ericmarch Experte (4.6k Punkte)
Lass mich raten…
Das direkte Setzen auf True löst den Code des Buttons selbst aus, stimmts? Setze in Activate/Initialize (am besten in beiden - und noch besser im Code zu dem Button selbst) mal einen Haltepunkt und dann die UserForm in Gang. Gehe mit F8 schrittweise vorwärts. Dann Schalte mal um und um und um…, schließe die UserForm, öffne sie wieder und beobachte.

Ich + UserForm = Hassliebe.
Mir ist selten eine Hiuntergrund-Unlogik beim Umgang mit Ereignissen begegnet wie da. Ein Initialisieren darf keine Schaltfunktion auslösen, ein Verlassen eines Eingabefeldes nicht auch noch das Ändern-Ereignis… Wozu gibt es Initialisieren und Explizit Verlassen und Ändern??

Zum Code:
Private Sub ToggleButton2008_Click()
Columns("R:U").EntireColumn.Hidden = Not Columns("R:U").EntireColumn.Hidden

Das taugt nicht - und ich ärgere mich auch selbst darüber.
Um das Wasserdicht zu machen musst du den Status des Buttons UND den der Columns pürfen - um Inkosistenzen abzufangen. Ob nun die Columns den Ausschlag geben oder der Button [man kann ja die Beschriftung frisieren hier…] - das ist bei dir.
If ToggleButton2008 = True Then
Columns("R:U").EntireColumn.Hidden = True 'oder andersrum?!
ToggleButton2008.Caption = "Anzeigen"
Else
Columns("R:U").EntireColumn.Hidden = Flasee
ToggleButton2008.Caption = "Verbergen"
End If

Als eine Idee dazu.

Private Sub UserForm_Activate()
If Columns("R:U").EntireColumn.Hidden = True Then
ToggleButton2008.Value = False
Else
ToggleButton2008.Value = True
end if

Man könnte auch…
ToggleButton2008.Value = Not(Columns("R:U").EntireColumn.Hidden)

…schreiben. Aber dann müsste man ja z.B. wieder per IF an der Beschriftung fummeln.

Die Verwendung der Zelle 1|255 (IV1) als Parkplatz für eine Status dürfte eine Zelle sein die keiner sieht und an der keiner rumbastelt. Pessimisten nehmen da weiße Schrift auf weißem Grund…

Eric March
0 Punkte
Beantwortet von
Hallo,


@Eric: Hast du deine Vorschläge selbst ausprobiert? Ich sehe bei mir keinerlei Unterschiede zu vorher.

jetzt habe ich so viel hin und her probiert, dass ich so durcheinander bin, dass ich nicht mal mehr die "einfache Variante" mit dem Zischenspeichern hinbekomme. Wie speichere ich den Status der ToggleButtons und lese ihn bei nächsten öffnen des Userforms wieder aus? Hat da jemand ein Beispiel? Ich habe schon so viel gegoogelt.

Ich bin in VBA leider handwerklich nur sehr wenig bewandert. Haltepunkte setzen, debuggen etc. sind leider böhmische Dörfer für mich. Ich sehe immer nur ob mein Code das Ergebnis bringt was er soll. ;)

Grüßle
0 Punkte
Beantwortet von ericmarch Experte (4.6k Punkte)
Ich weiß nicht was bei dir wie reagiert, aber natürlich sollten das z.T. nur Alternativen sein.
Der Toggle.Button hat eine .Caption; ändert sich denn wenigstens die Beschriftung?

Das Zwischenparken der Ergebnisse ist sehr einfach:
If ToggleButton2008 = True Then
Columns("R:U").EntireColumn.Hidden = True 'oder andersrum?!
ToggleButton2008.Caption = "Anzeigen"
Cells(1,255)=True
Else
Columns("R:U").EntireColumn.Hidden = Flasee
ToggleButton2008.Caption = "Verbergen"
End If
Cells(1,255)=Columns("R:U").EntireColumn.Hidden

und
Private Sub UserForm_Activate()
Columns("R:U").EntireColumn.Hidden = Cells(1,255)
Cells(255,1) = True Then
ToggleButton2008.Value = False
Else
ToggleButton2008.Value = True
End If

Das ist zwar nicht ganz nett, dass die Userform nun ggf. sie Spalten ausblendet, aber so funktioniert das Zwischenspeichern.
Natürlich kannst du auch mit .INTIALIZE und .ACTIVATE ›spielen‹ um zu erreichen, dass beim ersten Aufruf immer eingeblendet ist (Vorgabe durch die Userform) und beim Reaktivieren immer der Spaltenzustand maßgeblich ist (weil - man könnte ja per Hand ausgeblendet haben…)

Eric March
0 Punkte
Beantwortet von
Hallo Eric,

das Problem habe ich auch erkannt und konnte es auch noch nicht lösen
weil - man könnte ja per Hand ausgeblendet haben…


Im Moment stört mich etwas anderes aber viel mehr: Ich habe in der Tabelle einen ToggleButton zum öffnen und schließen des Formulars. Der Code lautet wie folgt:

Private Sub ToggleButton1_Click()

If ToggleButton1.Value = True Then

UserForm1.Show
ToggleButton1.Caption = "Menü schließen"

ElseIf ToggleButton1.Value = False Then
UserForm1.Hide
ToggleButton1.Caption = "Menü öffnen"

End If
End Sub


Wenn ich das Formular aber nicht über den Button schließe sondern über das X, bleibt die ToggleButton1.Capion= "Menü schließen", obwohl das Menü schon geschlossen ist.

Habe folgenden, nicht funktionierenden Versuch unternommen:

Private Sub UserForm1_queryclose()

ToggleButton1.Value = False
ToggleButton1.Caption = "Menü öffnen"


End Sub


Ich weiß nicht, ob ich überhaupt das richtige Eregnis gewählt habe und auch nicht, ob der Code unter dem Formular oder unter der Tabelle stehen muss.
...