5.3k 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 Hans,

vielleicht eine Möglichkeit:
Option Explicit
Dim blnAnAus As Boolean

Sub KontrollkaestchenAn()
Dim oobElement As OLEObject
For Each oobElement In ActiveSheet.OLEObjects
If oobElement.progID = "Forms.CheckBox.1" Then
If blnAnAus Then
oobElement.Object = False
Else
oobElement.Object = True
End If
End If
Next oobElement
blnAnAus = Not blnAnAus
End Sub

Bis später,
Karin
0 Punkte
Beantwortet von rudi4ad Mitglied (167 Punkte)
Hallo Hans,
alle Kontrollkästchen 'abhaken' kannst du mit diesem Makro:

Sub AlleKontrollkaestchenAus()
Dim o As CheckBox
For Each o In Me.CheckBoxes
o.Value = False
Next o
End Sub


Den Rest bekommst du alleine hin!?


@Karin
Hast du da was verwechselt?

Gruß
Rudi
0 Punkte
Beantwortet von beverly Experte (3.5k Punkte)
@All,

da der Code des Klick-Ereignisses eines ActvieX-Steuerelementes gepostet wurde, bin ich davon ausgegangen, dass auch die Kontrollkästchen ActiveX-Steuerelemente sind und keine Formular-Steuerelemente. Für diese würde der Code für das wechselweise An/Aus so aussehen:
Option Explicit
Dim blnAnAus As Boolean

Sub KontrollkaestchenAn()
Dim chkElement As CheckBox
For Each chkElement In ActiveSheet.CheckBoxes
If blnAnAus Then
chkElement.Value = False
Else
chkElement.Value = True
End If
Next chkElement
blnAnAus = Not blnAnAus
End Sub



Bis später,
Karin
0 Punkte
Beantwortet von
Hallo besten Dank an euch für die schnelle Hilfe.
Hatte folgendes Problem die Kontrollkästchen waren Gruppiert, nach dem aufheben läuft es.
Am Ende erscheint
Eine Meldung,
Microsoft Visual Basic
Dann ein weißes Kreuz im rotem Kreis und eine 400.

Mein Makro sieht im Moment so aus.

Option Explicit

Private Sub CheckBox1_Click()
Dim Wiederholungen As Integer
If CheckBox1 = True Then
For Wiederholungen = 1 To ActiveSheet.Shapes.Count
On Error Resume Next
ActiveSheet.CheckBoxes("Kontrollkästchen " & Wiederholungen) = True
Next
Else
For Wiederholungen = 1 To ActiveSheet.Shapes.Count
On Error Resume Next
ActiveSheet.CheckBoxes("Kontrollkästchen " & Wiederholungen) = False
Next
End If
End Sub

Sub AlleKontrollkaestchenAus()
Dim o As CheckBox
For Each o In Me.CheckBoxes
o.Value = False
Next o
End Sub

Sub AlleKontrollkaestchenAn()
Dim o As CheckBox
For Each o In Me.CheckBoxes
o.Value = True
Next o
End Sub

Liegt es an meiner Laienhaften Zusammenstellung ?
Muss man die Gruppierung aufheben, und warum diese Meldung?


Mit freundlichen Grüßen
Hans
0 Punkte
Beantwortet von rudi4ad Mitglied (167 Punkte)
Hallo Hans,
"undurchsichtig das Ganze ist." (Zitat: Obi-wan Kenobi)

Welche von den 3 Makros führt zum Fehler?
In deinem ursprünglich geposteten Makro, welches zur Laufzeit Kontrollkästchen erstellt, wurde aber keine gruppiert.
Wo kommt also die Gruppierung her?
Fehler 400 bezieht sich auf eine UserForm, sagt meine Hilfe.
Hat dein Makro etwas mit einer UserForm zu tun?
Private Sub CheckBox1_Click() ist eine Ereignisprozedur.
Verwendest du eine solche?
Du verwendest einmal aktiveSheet, einmal me, einmal keinen Bezeichner.
Daraus kann man nicht auf den Zusammenhang schließen.
Wo sind die Makros gespeichet? In einem Allgemeinen Modul oder im Modul der Tabelle?
Welche Excel-Version?

Ich glaube wir kommen hier nur weiter, wenn du eine Musterdatei anfertigst und uns zur Verfügung stellst.
Unabhängig davon wirst du dich auch weiterhin intensiv mit der Verwendung von Steuerelementen beschäftigen müssen um fehlerfreie Makros zu erhalten. Es muss nicht sein, aber vielleicht kann ich dich überzeugen, entweder Formurar- oder ActiveX-Steuerelemente zu verwenden. Das empfinde ich als übersichtlicher.

bis dahin
Gruß
Rudi
0 Punkte
Beantwortet von
Hallo
"undurchsichtig das Ganze ist. "Da hast du recht"

Habe mich total verzettelt mit dem Makro, bin blutiger Anfänger.
Habe es Geändert läuft bis auf die Fehlermeldung.
Habe eine Test Datei hoch-geladen.

www.file-upload.net/download-4148713/Test-Kopie-Upload.xls.html

Hoffe die Textfelder erklären was ich erreichen möchte.
Ich nutze Excel 2003 & W 7
Vorschlag zum besseren Aufbau von Tabelle und Makro nehme ich gerne an.

Mit freundlichen Grüßen
Hans
0 Punkte
Beantwortet von rudi4ad Mitglied (167 Punkte)
Hallo Hans,
das ist doch übersichtlich.
Allerdings habe ich Excel 2007 und keine Fehlermeldung.

Ich hoffe, dass jemand mit Excel 2003 mitliest und hilft.


Was ich noch empfehlen kann:
Verwende Schaltflächen für die beiden Makros und schalte die Bildschirmaktualisierung während der Laufzeit ab.
Dann geht's wesentlich schneller.
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

Sub AlleKontrollkaestchenAn()
Dim o As CheckBox
On Error GoTo FEHLER
Application.ScreenUpdating = False
For Each o In Me.CheckBoxes
o.Value = True
Next o
FEHLER:
Application.ScreenUpdating = True
End Sub


Gruß
Rudi
0 Punkte
Beantwortet von ericmarch Experte (4.6k Punkte)
Ich will dir mal eine blöde Frage stellen :)
Alle Kontrollkästchen aktiviert und bei wiederholten anklicken
deaktiviert werden.

Woher soll ein Makro wissen können ob es nun ein- oder ausschalten muss? Hellsehen kann es nämlich nicht. (Oh ja, solch unwichtigen Dinge schaffen es einem ein ordentliches Bein zu stellen!)

Denken wir und nur das dumme Szenario, dass manuell alle Chkeboxen (Kontrollkästchen…) auf Falsch gesetzt (›ausgeschaltet‹) wurden. Unser Makro hat eine Markierung gesetzt, dass nun ein Ausschalten fällig ist. Das gäbe einen Klick ins Leere der scheinbar nichts bewirkt.
Wie also soll der Button wissen was er tun muss? Ein Fall wie oben könnte noch abgefangen werden; und um das wasserdicht hinzukriegen ist einiger Aufwand möglich. Das sage ich dir weil ich meine Pappenheimer kenne die immer gut drin sind in einfachen Dingen die Schlaglöcher zu finden!

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

mal eine Frage zu deinem Code: wozu wird On Error benötigt?

Bis später,
Karin
0 Punkte
Beantwortet von ericmarch Experte (4.6k Punkte)
On Error sorgt dafür, dass ein Makro nicht stehen bleibt (mit einer Fehlermeldung) sondern dass es kontrolliert weiterläuft (so weit möglich) oder sich sauber beendet.

Theoretisch kommt ein gutes Programm ganz ohne aus, für einfachste Sachen ist es aber nützlich weil jede Prüf- und Kontrollroutine mehr Aufwand ist als der ganze eigentliche Code. (So auch hier.)
Hier z.B. wird der Fall abgefangen, dass das Makro auf einem Blatt ohne Kontrollkästchen oder gar gar keinem Blatt ins Straucheln kommt.

Eric March
...