Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Name der Checkbox in variable Zelle ausgeben

Forumthread: Name der Checkbox in variable Zelle ausgeben

Name der Checkbox in variable Zelle ausgeben
03.05.2006 11:43:47
edeltraud
Hallo Excel-Kollegen,
ich steck schon wieder fest und brauche Eure Hilfe.
Per Makro werden in ein Excelsheet mehrere Checkboxen in ganz bestimmte Zeilen gesetzt.
Jeder dieser Checkbox ist ein Wert zugeordnet.
Wenn jetzt der User eine Checkbox aktiviert, soll der Wert in das Sheet eingetragen werden und andersrum wieder entfernt werden, wenn die jeweilige Checkbox deaktiviert wird.
Da es bei jedem Makrostart unterschiedlich viele Checkboxen sein können (max. 50), kann ich mich nicht direkt auf den Namen beziehen.
Ich glaube, wenn ich es schaffen könnte, den Namen der grade eben erstellten Checkbox in mein Sheet mit den hinterlegten Werte in die entpsrechende Zeile zu packen, dann könnte ich mich später beim Anklicken der Boxen wieder drauf beziehen.
Aber ich kriegs einfach nicht hin, diesen Namen in diese variable Zelle zu setzen.
Habt Ihr einen Tipp für mich?
Hier ein Auszug aus meinem Makro, der das Erstellen der Boxen regelt:
'Checkbox erstellen
If systeme.Cells(zeileSysL, 7) = "x" Then
Dim WS As Worksheet
Dim rngZ As Range
Set WS = Application.Workbooks("Kalkulation.xls").Sheets("Blatt2") 'ActiveSheet
Set rngZ = WS.Cells(zeileblatt2, 3)
With WS.OLEObjects.Add(ClassType:="Forms.CheckBox.1")
.Object.Caption = ""
.Height = rngZ.Height - 5
.Width = rngZ.Width / 5
.Top = rngZ.Top + (rngZ.Height - .Height) / 2
.Left = rngZ.Left + (rngZ.Width - .Width) / 2
End With
systeme.Cells(zeileSysL, 8) = Preise.Cells(zeilePreise, 5) 'Preis aus Preisliste
blatt2.Cells(zeileblatt2, 4) = 0
End If
'***
Ich würde gerne neben den Wert (systeme.cells(zeileSysL,8) den Namen der Checkbox setzen, das wäre dann z.B. systeme.cells(zeileSysL,9).
Wenn es natürlich eine einfachere Methode gibt, dann bin ich für alle Anregungen offen.
Schon mal im Voraus vielen Dank für's Lesen.
Grüsse edeltraud
Anzeige

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Name der Checkbox in variable Zelle ausgeben
03.05.2006 15:17:16
Yal
Hi,
die Lösung ist nicht einfach, da für jede einzelne Checkbox ein eigene Ereignis-Prozedure haben soll.
Du muss im Voraus alle mögliche Ereignis-Prozedure definieren. Ein Ereig-Proz "Checkbox100_Click" darf existieren, auch wenn keine Checkbox mit dem Name Checkbox100 existiert.
Im Kombination mit der Eigenschaft LinkedCell jenem Checkbox kann man dann gezielt steuern.
Einige Vorschlag, mit jeweils verschiedene Variation:

Private Sub CheckBox1_Click()
Me.Range(CheckBox1.LinkedCell).Value = Me.OLEObjects("CheckBox1").Name & " ist gerade " & IIf(CheckBox1, "an.", "aus.")
End Sub


Private Sub CheckBox2_Click()
Me.Range(CheckBox2.LinkedCell).Value = Me.OLEObjects(CheckBox2.Index).Name & " ist gerade " & IIf(CheckBox2, "an.", "aus.")
End Sub


Private Sub CheckBox3_Click()
Schreibe_zurück CheckBox3
End Sub

Sub Schreibe_zurück(cb)
Me.Range(cb.LinkedCell).Value = cb.Name & " ist gerade " & IIf(cb, "an.", "aus.")
End Sub
...
Viel Spass
Yal
Anzeige
AW: Name der Checkbox in variable Zelle ausgeben
04.05.2006 08:46:40
edeltraud
Hallo Yal,
ich hab gestern wie verrückt rumprobiert mit Deiner Lösung und es würde schon so funktionieren.
Aber so ganz glücklich bin ich nicht damit.
Glaubst Du nicht, daß ich die 50 Ereignis-Prozeduren nicht doch in eine zusammenfassen kann?
Ich hab mal was gelesen über "For each Checkboxes", das hatte aber nicht funktioniert.
Rein theoretisch können alle Checkboxen gleichzeitig abgearbeitet werden.
Vielen Dank auf jeden Fall für die Lösung.
Grüsse edeltraud
Anzeige
AW: Name der Checkbox in variable Zelle ausgeben
04.05.2006 13:49:45
Yal
... schön wär's.
Leider ist das Ereignis nur auf der Objekt-Ebene zu verwalten,
nicht auf der Collection.
Yal
AW: Name der Checkbox in variable Zelle ausgeben
04.05.2006 13:53:16
Peter
Servus,
schreib dir deine eigene Klasse wo du jedes Object schon beim erstellen erfasst.
MfG Peter
AW: Name der Checkbox in variable Zelle ausgeben
04.05.2006 13:55:54
edeltraud
Hallo Peter,
da komm ich jetzt nicht ganz mit. Gib mir nochmal einen Denkanstoss.
mfg edeltraud
Anzeige
Denkanstoss
04.05.2006 14:09:09
Peter
Servus,
du erstellst die Boxen wie bisher, anschließend lässt du Sie alle in die Klasse einlesen und verfügst bei jeder eingelesenen Checkbox Global über Ihre Ereignisse.


'#  Ort:    Klassenmodul des Tabellenblattes
Option Explicit
Private objOleBox() As clsOleBox
Private Sub Worksheet_Activate()
    Dim objControl As OLEObject
    Dim intCounter As Integer, intZ As Integer
    For Each objControl In Me.OLEObjects
        If objControl.progID = "Forms.CheckBox.1" Then
            ReDim Preserve objOleBox(intCounter)
            Set objOleBox(intCounter) = New clsOleBox
            Set objOleBox(intCounter).boxOleCtrl = objControl.Object
            intCounter = intCounter + 1
        End If
    Next
End Sub
'#  Ort:    Klassenmodul
'#  Name:   clsOleBox
Option Explicit
Public WithEvents boxOleCtrl As MSForms.CheckBox
Private Sub boxOleCtrl_Change()
    Call boxOleMacro(boxOleCtrl.Name, boxOleCtrl.Value)
End Sub
'#  Ort:        Modul
Option Explicit
Public Sub boxOleMacro(strNam As String, bolWert As Boolean)
MsgBox Sheets("Tabelle1").OLEObjects(strNam).Name & " / " & bolWert
End Sub


MfG Peter
Anzeige
AW: Denkanstoss
04.05.2006 14:22:52
edeltraud
Hi auch,
ich werds gleich mal ausprobieren.
gruss edeltraud
Checkboxen
09.05.2006 16:48:52
edeltraud
Hallo Peter,
ich hab mein Problem jetzt doch anders gelöst und diese 5 Zeilen für jede Checkbox kopiert.

Private Sub CheckBox1_Change()
nameChkBx = "CheckBox1"
If CheckBox1.Value = True Then Call CheckBoxT
If CheckBox1.Value = False Then Call CheckBoxF
End Sub

Anzeige
AW: Name der Checkbox in variable Zelle ausgeben
04.05.2006 13:53:20
edeltraud
Tja, dann hilfts eben nix. Ich bin eh schon froh, dass ich überhaupt eine Lösung hab.
Schönen Tag noch.
Grüsse Edeltraud
;
Anzeige
Anzeige

Infobox / Tutorial

Name der Checkbox in variable Zelle ausgeben


Schritt-für-Schritt-Anleitung

  1. Checkboxen erstellen: Verwende ein Makro, um die Checkboxen in deinem Excel-Arbeitsblatt zu erstellen. Achte darauf, dass du jede Checkbox mit der gewünschten Größe und Position hinzufügst.

    Beispielcode:

    If systeme.Cells(zeileSysL, 7) = "x" Then
       Dim WS As Worksheet
       Dim rngZ As Range
       Set WS = Application.Workbooks("Kalkulation.xls").Sheets("Blatt2")
       Set rngZ = WS.Cells(zeileblatt2, 3)
       With WS.OLEObjects.Add(ClassType:="Forms.CheckBox.1")
           .Object.Caption = ""
           .Height = rngZ.Height - 5
           .Width = rngZ.Width / 5
           .Top = rngZ.Top + (rngZ.Height - .Height) / 2
           .Left = rngZ.Left + (rngZ.Width - .Width) / 2
       End With
       systeme.Cells(zeileSysL, 8) = Preise.Cells(zeilePreise, 5) ' Preis aus Preisliste
    End If
  2. Ereignis-Prozeduren definieren: Du musst für jede Checkbox eine eigene Ereignis-Prozedur erstellen. Dies ermöglicht es dir, den Status der Checkbox zu überwachen und entsprechende Aktionen durchzuführen.

  3. LinkedCell verwenden: Setze die LinkedCell-Eigenschaft der Checkbox, damit der Status (aktiv/inaktiv) in eine bestimmte Zelle geschrieben wird.

    Beispielcode für das Ereignis einer Checkbox:

    Private Sub CheckBox1_Click()
       Me.Range(CheckBox1.LinkedCell).Value = Me.OLEObjects("CheckBox1").Name & " ist gerade " & IIf(CheckBox1.Value, "an.", "aus.")
    End Sub

Häufige Fehler und Lösungen

  • Fehler: Checkbox wird nicht erkannt: Stelle sicher, dass die Checkboxen korrekt benannt sind und dass du die richtige Syntax verwendest. Achte besonders auf die Verwendung von Me.OLEObjects und dem richtigen Index.

  • Lösung: Verwendung von For Each: Wenn du viele Checkboxen hast, kannst du eine Schleife verwenden, um alle Checkboxen zu durchlaufen. Dies reduziert die Anzahl der benötigten Prozeduren erheblich.


Alternative Methoden

Eine weitere Möglichkeit, den Namen der Checkbox in eine Zelle zu schreiben, besteht darin, eine Klasse zu erstellen, die alle Checkboxen verwaltet. Dies ermöglicht eine zentralisierte Handhabung aller Checkbox-Ereignisse.

Beispiel:

Private Sub Worksheet_Activate()
    Dim objControl As OLEObject
    For Each objControl In Me.OLEObjects
        If objControl.progID = "Forms.CheckBox.1" Then
            ' Hier kannst du die Checkboxen verwalten
        End If
    Next
End Sub

Praktische Beispiele

Hier ist ein vollständiges Beispiel für eine Checkbox und deren Ereignisbehandlung:

Private Sub CheckBox1_Change()
    If CheckBox1.Value = True Then
        MsgBox "Checkbox1 ist aktiviert"
    Else
        MsgBox "Checkbox1 ist deaktiviert"
    End If
End Sub

Du kannst den MsgBox-Befehl durch deinen spezifischen Code ersetzen, um den Namen der Checkbox und den Status in die entsprechende Zelle zu schreiben.


Tipps für Profis

  • Nutzung von WithEvents: Wenn du eine Klasse für deine Checkboxen erstellst, kannst du die WithEvents-Eigenschaft verwenden, um Änderungen an der Checkbox in Echtzeit zu verfolgen.

  • Optimierung von Makros: Teste und optimiere deine Makros regelmäßig, um sicherzustellen, dass sie effizient arbeiten, insbesondere wenn du eine große Anzahl von Checkboxen hast.


FAQ: Häufige Fragen

1. Wie kann ich den Namen der Checkbox in eine Zelle schreiben? Verwende die LinkedCell-Eigenschaft der Checkbox und schreibe den Namen in die gewünschte Zelle innerhalb der Ereignis-Prozedur.

2. Ist es möglich, alle Checkboxen gleichzeitig zu verwalten? Ja, du kannst eine Schleife verwenden, um alle Checkboxen zu durchlaufen und eine gemeinsame Ereignis-Prozedur zu erstellen, die für alle Checkboxen gilt.

3. Welche Excel-Version wird benötigt? Die beschriebenen Methoden sind in Excel 2007 und späteren Versionen anwendbar.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige