Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1352to1356
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

selbes Makro für meherer Checkboxen

selbes Makro für meherer Checkboxen
05.03.2014 08:15:48
Me
Hallo!
Ich bräuchte Hilfe bei der VBA für meherere Checkboxen die die jeweilige Zeile ausblenden sollen in der sie platziert sind sobald die Checkbox aktiviert wird.
Da es aber eine fortlaufende Tabelle werden soll ist es mühsam jeder einzelnen Checkbox einen Code zuzuweisen!
Da gibts doch sicher eine einfachere Lösung?!!
ich habe diesen Code angewandt:

Private Sub CheckBox1_Click()
ActiveSheet.Unprotect
If CheckBox1 = False Then
Rows("6:6").Select
Selection.EntireRow.Hidden = False
Else
Rows("6:6").Select
Selection.EntireRow.Hidden = True
End If
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
End Sub

MfG

15
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: selbes Makro für meherer Checkboxen
05.03.2014 09:52:56
Oberschlumpf
Hi ?
Deine Frage ist mit einem klaren JEIN beantwortbar.
Und zwar:
Zitat:
"...ist es mühsam jeder einzelnen Checkbox einen Code zuzuweisen..."
Stell dir vor, du hast eine Checkbox2. Da würde für das Click-Ereignis dieser code stehen:
Private Sub CheckBox2_Click()
End Sub

Was denkst du, wird passieren, wenn du für Checkbox2 den Haken setzt oder entfernst?
Es würde NIX passieren, da ja, wie du es gern hättest, gar kein Code vorhanden ist.
Bedeutet, du musst also tatsächlich für jede Checkbox für das Click-Ereignis einen Code schreiben.
Und trotzdem geht es einfacher - du musst 1x den Hauptcode schreiben, der Zeilen ein/ausblendet und für die Click-Ereignisse nur jeweils 1 Codezeile schreiben, die den Hauptcode mit Hilfe von Variablen aufruft.
Und zwar so...
schreib in ein allgemeines Modul diesen Code:
Sub sbChkBox(ByVal chkboxname As String, zeile As Integer)
ActiveSheet.Unprotect
With Sheets(1)
If .OLEObjects(chkboxname).Object.Value = False Then
.Rows(zeile).EntireRow.Hidden = False
Else
.Rows(zeile).EntireRow.Hidden = True
End If
End With
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
End Sub

Nun schreib für das Click-Ereignis von Checkbox1 diesen Code:
Private Sub CheckBox1_Click()
sbChkBox CheckBox1.Name, 6
End Sub

und für Checkbox2 diesen Code:
Private Sub CheckBox2_Click()
sbChkBox CheckBox2.Name, 7
End Sub

...und für alle weiteren Checkboxes den entsprechenden Code.
Der Hauptcode, den ich sbChkBox genannt habe, wird also in jedem Click-Ereignis der Checkboxen aufgerufen.
Damit der Hauptcode immer das Richtige macht, muss er "wissen", welche Checkbox du angeklickt hast, und welche Zeile ausgeblendet oder angezeigt werden soll.
Aus dem Grund steht hinter dem Aufruf von sbChkBox der jeweilige Name der Checkbox und die Zeile, die ausgeblendet oder angezeigt werden soll.
Wenn für Checkbox2 nicht Zeile 7 gemeint ist, musst du den Code natürlich anpassen.
Hilfts?
Wenn nicht, zeig uns bitte eine Bsp-Datei mit Bsp-Daten und allem VBA-Code, der wichtig ist, dein Problem zu verstehen.
Ciao
Thorsten
P.S.
Du hast leider nicht verraten, ob die Checkboxen in einer Tabelle stehen oder ob du ein Userform mit Checkboxen verwendest.
Ich gehe davon aus, dass die Checkboxen in einer Tabelle stehen.
Wenn das falsch ist, ist auf jeden Fall eine Bsp-Datei erforderlich - denn ich hab keine Lust, dein Userform neu zu erstellen...du hast es ja schon ;-)

Anzeige
AW: selbes Makro für meherer Checkboxen
05.03.2014 10:31:07
Me
Hallo Thorsten
suuuper... vielen lieben Dank! So ist es wesentlich weniger Aufwand als mit dem Code den ich genommen hab!
ja die Checkboxen sind in einer Tabelle!
Danke für die schnelle und hilfreiche Antwort,
LG Melanie

AW: selbes Makro für meherer Checkboxen
05.03.2014 11:21:38
UweD
Hallo
den "Hauptcode" kannst du noch vereinfachen...
Sub sbChkBox(ByVal zeile As Integer)
ActiveSheet.Unprotect
With Sheets(1).Rows(zeile).EntireRow
.Hidden = Not .Hidden
End With
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
End Sub
Dadurch fällt auch in die erste Übergabevariable weg.
Private Sub CheckBox1_Click()
sbChkBox 6
End Sub
Gruß UweD

Anzeige
AW: selbes Makro für meherer Checkboxen
05.03.2014 12:38:19
Oberschlumpf
Hi Uwe
ja, du hast recht. So ist es noch einfacher.
Ciao
Thorsten

AW: selbes Makro für meherer Checkboxen
05.03.2014 14:30:24
Me
Hallo Uwe,
danke für deine Rückmeldung
ich hab deinen "Hauptcode" und den Code für die Checkbox ausprobiert ...
wenn ich die Zeile dann manuell wieder einblende und das Kontrollkästchen deaktiviere blendet sich die Zeile auch wieder aus - ich möchte aber dass sie dann eingeblendet bleibt.
Wie muss ich dann vorgehen?
LG Melanie

kleiner Tipp von mir...
05.03.2014 14:34:03
mir...
Hi Melanie,
da du festgestellt hast, dass der Code von Uwe nur bedingt funktioniert, dann verwende doch wieder meinen Code, oder? ;-)
Ciao
Thorsten

Anzeige
AW: kleiner Tipp von mir...
05.03.2014 15:11:05
mir...
Hi Thorsten,
haha gute Idee :)
bin auch wieder bei deiner Version nur leider funktioniert dein Code bei der ersten Checkbox wunderbar aber bei der Checkbox2 und den darauf folgenden nicht mehr :(
ich muss den Hauptcode doch nur einmal eingeben oder?
und danach:
Private Sub CheckBox1_Click()
sbChkBox CheckBox1.Name, 6
End Sub

Private Sub CheckBox2_Click()
sbChkBox CheckBox1.Name, 7
End Sub

Private Sub CheckBox3_Click()
sbChkBox CheckBox1.Name, 8
End Sub

also so funkts bei mir leider nicht! :( was hab ich falsch gemacht?
LG
Melanie

Anzeige
AW: kleiner Tipp von mir...
05.03.2014 15:19:33
mir...
hab den Fehler schon gefunden
Private Sub CheckBox2_Click()
sbChkBox CheckBox1.Name, 7
End Sub
aber vielleicht kannst du mir noch dabei helfen...
warum aktiviert sich jedes mal der Blattschutz wenn ich ein Kontrollkästchen anklicke?
LG
Melanie

AW: kleiner Tipp von mir...
05.03.2014 15:34:18
mir...
Hi Melanie,
ob du den Fehler wirklich gefunden hast, ist aus deiner letzten Meldung nicht ersichtlich, da der Fehler in dem von dir gezeigten Code noch immer vorhanden ist.
Hier die "richtigen" Versionen für CheckBox1-3:
Private Sub CheckBox1_Click()
sbChkBox CheckBox1.Name, 6
End Sub
Private Sub CheckBox2_Click()
sbChkBox CheckBox2.Name, 7
End Sub
Private Sub CheckBox3_Click()
sbChkBox CheckBox3.Name, 8
End Sub
Im fehlerhaften Code hast du immer den Namen von CheckBox1 übergeben.
Aber natürlich musst du z Bsp bei Klick auf CheckBox2 auch den Namen von CheckBox2 übergeben.
Genau so bei allen anderen CheckBoxes.
Antwort wegen Blattschutz:
Der Code aus deinem ersten Beitrag sieht so aus:
Private Sub CheckBox1_Click()
ActiveSheet.Unprotect
'hier zwischen steht der Code, wenn Checkbox angeklickt wird
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
End Sub
Die Zeile ActiveSheet.Unprotect DEaktiviert den Blattschutz.
Die Zeile ActiveSheet.Protect DrawingObjects:...usw AKTiviert den Blattschutz wieder.
Ich habe also nur deinen Code übernommen + angepasst ;-)
Wenn du gar keinen Blattschutz willst, dann entferne die erste + letzte Zeile.
Hilfts?
Ciao
Thorsten

Anzeige
AW: kleiner Tipp von mir...
05.03.2014 15:39:57
mir...
Hi Thorsten,
JETZT hauts hin so wie ich es mir vorgestellt habe!
Riesen großes Dankeschön für deine Hilfe
LG
Melanie

etwas gekürzt ;-)
05.03.2014 11:17:46
Matthias
Hallo
Option Explicit
Sub sbChkBox(ByVal chkboxname As String, zeile As Integer)
ActiveSheet.Unprotect
With Tabelle1
.Rows(zeile).EntireRow.Hidden = IIf(.OLEObjects(chkboxname).Object.Value, 1, 0)
End With
ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
End Sub
wobei ich pers. Zeile als Long deklarieren würde.
Gruß Matthias

AW: etwas gekürzt ;-)
05.03.2014 12:37:00
Oberschlumpf
Hi Matthias
grundsätzlich hast du mit dem Datentyp für die Var Zeile nicht unrecht.
Denn es kann ja tatsächlich sein, dass in Excel irgdjemand mehr als 2.147.483.647 Datenzeilen verarbeiten muss - und seit Excel 2007 soll das ja auch möglich sein.
Wie ich auf 2.147.483.647 komme?
Ich entnahm dieser Quelle https://www.dpunkt.de/java/Die_Sprache_Java/Die_Sprachelemente_von_Java/27.html den Oberwert für Integervariablen.
Dies irritierte mich ein wenig, da ich immer dachte, für Integer ist die Obergrenze ungefähr 32.000.
Aber natürlich kann es auch hier vorkommen, dass Exceltabellen mit über 32.000 Datenzeilen verarbeitet werden müssen.....kennst du solche Tabellen? :-)
Ciao
Thorsten

Anzeige
Long/ Integer
05.03.2014 12:46:31
Rudi
Hallo,
Integer in VBA ist der Bereich von -32768 bis +32767.
Deine 2.147.483.647 sind Obergrenze des Long-Datentyps.
Kannst du auch in der VBA-Hilfe nachlesen.
Warum Long? Die Row-Eigenschaft des Range-Objekts gibt einen Long-Wert zurück. Dito die Column-Eigenschaft.
Der korrekte Datentyp spart letztlich Rechenzeit. Da kommen etliche Mikrosekunden zusammen ;-)
Gruß
Rudi

AW: Long/ Integer
05.03.2014 12:53:10
Oberschlumpf
ahhhhh!
Hi Rudi
Und danke für die Aufklärung! :-)
Wusste ich doch, dass die Obergrenze irgdwo bei 32.000 liegt.
Wenn der andere Wert für long gilt, dann sind die Erklärungen in meiner Quelle zumindest für mich leider missverständlich, da dort ja auch von Integer die Rede ist.
Und..ähh...die Excel-Hilfe hab ich nicht gefunden....muss die F1-Taste immer wieder aufs Neue suchen :-)
Nun denn, egal, wie man es dreht + wendet, es wäre bestimmt "sauberer" programmiert, hätte ich als Long deklariert.
In Zukunft werde ich mich bemühen.
Ciao
Thorsten

Anzeige
Makro für mehrere Checkboxen: Klasse
05.03.2014 13:06:26
Rudi
Hallo,
füge ein Klassenmodul ein und nenne es clsControls.
in ein Modul:
Option Explicit
Option Private Module
Private lobjControlCollection As Collection
Public Sub InitControlClass()
Dim objOLEObject As OLEObject
Dim objControlClass As clsControls
'Neue Instanz der Collection zum aufnehmen der Klassen initialisieren
Set lobjControlCollection = New Collection
'Schleife über alle OLE-Objekte der Tabelle1
For Each objOLEObject In Tabelle1.OLEObjects
'Wenn eine CheckBox gefunden wurde
If objOLEObject.progID = "Forms.CheckBox.1" Then
'Neue Instanz der Klasse erzeugen
Set objControlClass = New clsControls
'CheckBox an die Klasse übergeben
Set objControlClass.CheckBox = objOLEObject.Object
'Instanz der Klasse an die Collection übergeben
lobjControlCollection.Add Item:=objControlClass
End If
Next
'Objekte zurücksetzen
Set objOLEObject = Nothing
Set objControlClass = Nothing
End Sub

im Klassenmodul clsControls:
Option Explicit
Private WithEvents mobjCheckBox As MSForms.CheckBox
Friend Property Set CheckBox(ByRef probjCheckBox As MSForms.CheckBox)
Set mobjCheckBox = probjCheckBox
End Property
Private Sub mobjCheckBox_Click()
With mobjCheckBox.TopLeftCell.EntireRow
.Hidden = Not .Hidden
End With
End Sub

In DieseArbeitsmappe:
Private Sub Workbook_Open()
InitControlClass
End Sub

Gruß
Rudi
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige