5.7k Aufrufe
Gefragt in Tabellenkalkulation von
Hallo
Habe mir folgendes Makro aus dem Internet Kopiert.

Option Explicit

Private Sub CommandButton1_Click()
Dim Zelle As Range
For Each Zelle In Selection
With ActiveSheet.CheckBoxes.Add(Zelle.Left + Zelle.Width / 2 - 8, _
Zelle.Top, Zelle.Width, Zelle.Height)
.Caption = ""
.LinkedCell = Zelle.Offset(, 1).Address
End With
Next
End Sub

Läuft einwandfrei, ich möchte erreichen das über einen Zweiten CommandButton

Alle Kontrollkästchen aktiviert und bei wiederholten anklicken
deaktiviert werden.

Besten dank an alle die sich um mein Problem kümmern!

Mit freundlichen Grüßen
Hans

24 Antworten

0 Punkte
Beantwortet von beverly Experte (3.5k Punkte)
Hi Erich,

weshalb On Error generell verwendet wird ist schon klar, meine Frage bezog sich eher darauf, wozu es in deinem Code verwendet wird. Das Abfangen von Fehlern mit On Error sollte man generell vermeiden, wenn es auch anders geht. Man kann in der überwiegenden Anzahl der Fälle problemlos eine "ordentliche" Fehlerbehandlung einbauen - das sind meist nicht mehr als 10 Zeilen und diese 10 Zeilen machen den Code nicht wesentlich länger oder gar langsamer. Die Prüfung, ob z.B. überhaupt CheckBoxen vohanden sind, macht bei deinem Code gerade mal 1 Zeile aus.

Bis später,
Karin
0 Punkte
Beantwortet von ericmarch Experte (4.6k Punkte)
Falls ich mit ›Erich‹ gemeint sein sollte…

…dann würde ich gern diesen Einzeiler sehen mit dem ich allein teste ob auf dem Blatt überhaupt Kontrollkästchen sind.
Theoretisch müsste For-In eine Leerschleife sein wenns keine Checkboxen gibt…
Sub AlleKontrollkaestchenAus()
Dim o As CheckBox
On Error GoTo FEHLER
Application.ScreenUpdating = False
For Each o In Me.CheckBoxes
o.Value = False
Next o
FEHLER:
Application.ScreenUpdating = True
End Sub

Hier würde schon mal grundsätzlich ein On Error Goto 0 fehlen, und dass das losrennt und dann u.a. ein Userform_Initialize auslöst, samt Click-Ereignisse der Checkboxen erschwert die Lage.

Und nirgendwo steht, dass wir es hier überhaupt mit einer UserForm zu tun haben, Das Me. geht schief wenns um Checkboxen auf dem Blatt geht…

Eric March

PS: wozu es in dem erwähnten Code dient hatte ich dargelegt: jede qualifizierte Fehlerabfangroutine ist mehr Aufmarsch als der Nutzcode.
0 Punkte
Beantwortet von beverly Experte (3.5k Punkte)
Hi Eric,

sorry, da ist ein fehlerhaftes "h" ans Ende deines Namens geraten.

Eine For...Next Schleife ist nicht erforderlich, denn mit dem folgenden Befehl kann man prüfen, wie viele Kontrollkästchen sich auf einem Tabellenblatt befinden:

ActiveSheet.CheckBoxes.Count


Das kannst du in eine If-Abfrage einbinden: sind es mehr als 0, wird der Code für An/Aus ausgführt. Es geht also absolut nichts schief, falls keine Kontrollkästchen vorhanden sind.

Bis später,
Karin
0 Punkte
Beantwortet von ericmarch Experte (4.6k Punkte)
…ich war da wiederum auf eine UserForm aus :)
0 Punkte
Beantwortet von beverly Experte (3.5k Punkte)
Hi Eric,

hast du deinen Code mal in einem UserForm getestet? Bei mir wird bereits beim Kompilieren ein Fehler ausgegeben: "Methode oder Datenobjekt nicht gefunden" und markiert wird dabei Me.CheckBoxes in der ersten Zeile deiner For-Next-Schleife.

Bis später,
Karin
0 Punkte
Beantwortet von ericmarch Experte (4.6k Punkte)
Das ist nicht mein Code, bitte das zu beachten.

Wenn der Code im Codefenster der UserForm ausgeführt wird müsste er (nichtsdestoweniger) reibungslos ablaufen.

(Ich wollte ihn testen, aber wie ich oben andeutete kommt mir ein Initialize dieser UserForm in die Quere.
Im Moment verhindern andere Prozesse, dass ich in einer Dummy-UserForm mich dessen versichere.)

Eric March
0 Punkte
Beantwortet von beverly Experte (3.5k Punkte)
Hi Eric,

stimmt, ist nicht dein Code, allerdings hast du zuerst von einem UserForm "gesprochen" und in einem UserForm läuft der Code definitiv nicht. Ein Steuerelement im UserForm lässt sich nicht als CheckBox deklarieren - das löst den o.g. Fehler aus. Im Tabellenblatt dagegen läuft der Code nicht auf einen Fehler, wenn er sich im Codemodul des Tabellenblattes befindet (und an einen CommandButton aus den ActiveX-Steuerelementen gebunden ist), denn das Tabellenblatt kann man in diesem Fall ebenfalls mit "Me" ansprechen.

Bis später,
Karin
0 Punkte
Beantwortet von
Das ist nicht mein Code, bitte das zu beachten.

steht aber nicht bei deinem code. wie kommts dass du nicht auf die quelle verweist?
0 Punkte
Beantwortet von ericmarch Experte (4.6k Punkte)
???
Ich habe speziell auf Antwort 7 reagiert, da stand das praktisch alles schon da. Wie kommt du auf die Idee, dass ich da dort durnterschreiben könnte, dass es nicht von mit ist? Und Antwort 12 ist offensichtlich ein Zitat von weiter oben.


@Beverly (Karin)
Vielleicht solltest du uns alle mal erleuchten in welchen Codefenstern welcher Organisationseinheiten welcher Code läuft.

Das Me.xxx für eine Blatt funktioniert nur im Code des Blattes, nicht aber in einem Modul. Im Code einer UserForm bezieht es sich auf eine UserForm. Diese Dinge müssen schon neben aufgelistetem Code erwähnt sein.

Ist übrigens lustig - auf meinem Blatt mit 2 CheckBoxen liefert mir
ActiveSheet.CheckBoxes.Count eine Null.

Eric March
0 Punkte
Beantwortet von
Hallo,
Alle zusammen!
Die Antwort 7 von Rudi4ad hat mein Problem gelöst.

Besten Dank, für die ausführliche Hilfe, an alle.

Mfg
Hans
...