Anzeige
Archiv - Navigation
1964to1968
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

Klick auf OptionsButton's in Tabelle erkennen

Klick auf OptionsButton's in Tabelle erkennen
14.02.2024 11:33:51
Jürgen
Hallo Zusammen,

ich habe vor ein Prüfungsprotokoll für interne Prüfungen zu erstellen. (https://www.herber.de/bbs/user/167048.xlsm)

Im Wesentlichen funktioniert alles so wie ich mir das vorstelle, jedoch habe ich ein großes Problem!

Beim Klick auf einen OpotionButton sollte ein bestimmtes Makro ablaufen. Dieses Makro funktioniert und prüft alle vorhandenen Buttons ab und schreibt die Punktzahl in eine definierte Zelle neben den Buttons.

Ich finde aber keine Möglichkeit den Klick auf den Button abzufangen?
Private Sub Worksheet_Change(ByVal Target As Range)

'MsgBox "Worksheet_Change"
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
'MsgBox "Worksheet_SelectionChange"
End Sub
Private Sub Worksheet_TableUpdate(ByVal Target As TableObject)
'MsgBox "Table Update"
End Sub


Diese Ereignisse funktionieren nicht, bzw. erkennen nicht wenn irgendein Button gedrückt wurde. Im fertigen Protokoll werden es bestimmt 100+ Buttons sein (10 Prüfungsdetails zu je 10 Punkte).

Wie kann ich den Klick auf irgendeinen Button, ggf. auch irgendeinen Mausklick innerhalb der Tabelle abfangen und dann das Makro starten???

Vielen Dank vorab.

Viele Grüße
Jürgen

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

Betreff
Datum
Anwender
Anzeige
AW: Klick auf OptionsButton's in Tabelle erkennen
14.02.2024 11:53:44
Yal
Hallo Jürgen,

es gibt 2 Arten von Steuerungselement: die Formularsteuerungselement, den man eine Makro per Hand zuweisen muss, und die ActiveX-Steuerelement, die direkt ein Ereignis auslösen. Du hast glücklicherweise letzteres.

Im VBA-Codepane des Arbeitsblatt sind oben 2 Dropdown vorhanden. In den linke, wo "(Allgemein)" steht, findest Du das gesuchte Element. Beim Auswählen von "OptionButton1" kommt automatisch das Ereignis-Vorlage "OptionButton1_Click".

Bedenke, dass diese Verwaltung über zusätzliche Aktionselement extremst aufwändig ist. Vielleicht wäre es einfacher, die Doppelklick auf die Zellen abzufangen (nur ein Ereignis für das ganze Blatt):

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

'Die Reaktionsfähige Zellen liegen in benannte Bereiche, deren Namen "Frage1" bis "Frage.."
Dim N
Cancel = True 'damit wird die Excel-Doppelklick anschliessend nicht durchgeführt
For Each N In Application.Names
If Left(N.Name, 5) = "Frage" Then
If Not Intersect(Target, Range(N.Name)) Is Nothing Then
Range(N.Name).Value = ""
Target.Value = "x"
Exit Sub
End If
End If
Next
End Sub


VG
Yal
Anzeige
Code für Buttons automatisch generieren?
14.02.2024 13:22:09
Jürgen
Ich experimentiere gerade hierzu auch mit GPT.

Die Idee, wenn das Dokument fertig ist, dann sollte für jeden Optionsbutton das Click Ereignis automatisch erstellt werden.

Diesen Teil habe ich schon:
Sub Click_EreignisseFürOptionButtonErstellen()

Dim ws As Worksheet
Dim obj As OLEObject
Dim strButtonName As String

' Arbeitsblatt festlegen
Set ws = ActiveSheet

' Durch alle OLE-Objekte auf dem Arbeitsblatt iterieren
For Each obj In ws.OLEObjects
' Prüfen, ob das OLE-Objekt ein Optionsfeld ist

If TypeName(obj.Object) = "OptionButton" Then

strButtonName = obj.Name
AssignClickEventToOptionButton obj, strButtonName

End If
Next obj

End Sub


Der Teil funktioniert auch:
' Makrocode für das Click-Ereignis des Optionsbuttons erstellen

code = "Sub " & strButtonName & "_Click()" & vbCrLf
code = code & " MsgBox ""Optionsbutton wurde geklickt!""" & vbCrLf
code = code & "End Sub"


Aber wie bekomme ich jetzt diesen String (Code) in den Code-Editor für die Arbeitsmappe?

Das schlägt mir GPT vor, ist aber Fehlerhaft:
With ThisWorkbook.VBProject.VBComponents(ws.CodeName).CodeModule

.InsertLines .CountOfLines + 1, code
End With
Anzeige
AW: Klick auf OptionsButton's in Tabelle erkennen
14.02.2024 14:22:19
daniel
Hi

ich würde das komplett ohne Buttons über das BeforeDoubleClick-Event lösen.

noch nach dem Motto:
a) Doppelklick auf eine Zelle in der Spalte B-L, wenn in der Spalte A der selben Zeile "Punkte" steht: Punktzahl in Spalte M eintragen
b) Doppelklick auf eine Zelle in der Spalte A, wenn dort "Punkte" steht: Wert in Spalte M löschen

dann reicht dir dieser Code im Modul des Tabellenblatts, für beliebig viele Fragen:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

Cancel = False
If Target.Column = 1 Then
If Target.Value = "Punkte" Then Cells(Target.Row, 13).ClearContents
ElseIf Target.Column >= 2 And Target.Column = 11 Then
If Cells(Target.Row, 1).Value = "Punkte" Then Cells(Target.Row, 13).Value = 10 - Target.Column + 2
Else
Cancel = True
End If
End Sub


das hervorheben der ausgewählten Punktzahl kannst du ja über die Bedingte Formatierung regeln

Gruß Daniel
Anzeige
AW: Code für Buttons automatisch generieren? ==> erledigt
14.02.2024 13:36:15
Jürgen
Das Thema hat sich erledigt.

Wenn die Datei fertiggestellt wurde, dann lassen wir dieses Makro laufen und erhalten pro OptionsButton das gewünscht ClickEreignis.
Hier im Beispiel wird nur eine MsgBox angezeigt.

Sub Click_EreignisseFürOptionButtonErstellen()

Dim ws As Worksheet
Dim obj As OLEObject
Dim strButtonName As String

' Arbeitsblatt festlegen
Set ws = ActiveSheet

' Durch alle OLE-Objekte auf dem Arbeitsblatt iterieren
For Each obj In ws.OLEObjects
' Prüfen, ob das OLE-Objekt ein Optionsfeld ist

If TypeName(obj.Object) = "OptionButton" Then

strButtonName = obj.Name
AssignClickEventToOptionButton obj, strButtonName

End If
Next obj

End Sub
Sub AssignClickEventToOptionButton(obj As OLEObject, strButtonName As String)
Dim code As String
Dim ws As Worksheet

' Makrocode für das Click-Ereignis des Optionsbuttons erstellen
code = "Sub " & strButtonName & "_Click()" & vbCrLf
code = code & " MsgBox ""Optionsbutton wurde geklickt!""" & vbCrLf
code = code & "End Sub"

Set ws = obj.Parent

' Makro im Modul der Arbeitsmappe erstellen
With ThisWorkbook.VBProject.VBComponents(ws.CodeName).CodeModule
.InsertLines .CountOfLines + 1, code
End With
End Sub
Anzeige
AW: Code für Buttons automatisch generieren?
14.02.2024 13:41:30
Uduuh
Hallo,
hast du auch dem Zugriff auf das VBA-Projekt per Code vertraut?
Wie stellst du fest, welcher Button gedrückt wurde?

Diese Schleife
For Each obj In ws.OLEObjects
geht imho die Objekte in der Reihenfolge der Erstellung durch.

Anstatt solche Klimmzüge zu machen, solltest du dich besser mit Klassenprogrammierung auseinander setzen.

Gruß aus'm Pott
Udo
AW: Code für Buttons automatisch generieren?
14.02.2024 16:29:01
Yal
Im Prinzip reicht es, alle einzelne Ereignisprozedure an einer zu weiterleiten inkl. Nummer der ausrufenden OptionButton:

Private Sub OptionButton1_Click(): Option_global 1: End Sub

Private Sub OptionButton2_Click(): Option_global 2: End Sub
'...

Private Sub Option_global(BtnNr As Long)
'Hier findet die Behandlung statt anhand des BtnNr
End Sub


Wenn Du 100 OptionButton hast, dann musst Du bis
'...

Private Sub OptionButton99_Click(): Option_global 99: End Sub
Private Sub OptionButton100_Click(): Option_global 100: End Sub


Diese Liste ist leicht mit einer Excel Formel zu erzeugen:
=Wechseln("Private Sub OptionButton@_Click(): Option_global @: End Sub"; "@"; Zeile(A1))
dann 100 Zeilen nach unten ziehen.

VG
Yal
Anzeige
Kreativität
14.02.2024 12:03:01
Yal
Man könnte als erste Zelle des Bereiches "Frage1" (cells(1)) die Zelle, wo die Note reinkommt und dahinter Zellen, die Noten 1 bis 10 auflisten.

Der Code würde so aussehen:

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

'Die Reaktionsfähige Zellen liegen in benannte Bereiche, deren Namen "Frage1" bis "Frage.."
Dim N
Cancel = True 'damit wird die Excel-Doppelklick anschliessend nicht durchgeführt
For Each N In Application.Names
If Left(N.Name, 5) = "Frage" Then
If Not Intersect(Target, Range(N.Name)) Is Nothing Then
Range(N.Name).Cells(1).Value = Target.Value
Exit Sub
End If
End If
Next
End Sub


Die Summe alle vergebene Noten würde so aussehen:
Public Sub NotenSumme_rechnen()

Dim N
Dim Summe As Long
For Each N In Application.Names
If Left(N.Name, 5) = "Frage" Then Summe = Summe + Range(N.Name).Cells(1).Value
Next
Range("B3").Value = Summe
End Sub


VG
Yal
Anzeige
AW: Kreativität
14.02.2024 12:35:09
Jürgen
Hallo Yal und danke für deine Ansätze.

Wir möchten schon gerne bei dem Entwurf mit den verschiedenen OptionsButton bleiben.

Mir pers. fällt nur noch eine Lösung ein, und zwar noch einen Button pro Frage / Thema einzufügen, der dann die Buttons abfragt, die Punkte einträgt und das Ganze berechnet.

Schade an der Lösung ist nur, dass man dran denken muss diesen Button auch zu drücken.

Gibt es denn kein Ereignis, dass einen Mausklick innerhalb der Tabelle abfangen kann?
AW: Kreativität
14.02.2024 13:07:31
Uduuh
Hallo,
Gibt es denn kein Ereignis, dass einen Mausklick innerhalb der Tabelle abfangen kann?
Doch. Aber nur innerhalb der Tabelle (Zellen) und nicht auf Steuerelemente. Für Steuerelemente gibt es eigene Ereignisprozeduren. Du musst also für jeden Button eine eigene Click-Prozedur schreiben.

Eine andere mögliche Lösung ist, die Optionbuttons in eine eigene Klasse zu packen und dort zu verarbeiten. Dann brauchst du nur eine Click-Prozedur für alle. Allerdings musst du dann dafür sorgen, dass die Buttons eindeutig zu identifizieren sind. z.B. für Prüfungspunkt 1 Namen opt_01_00 bis opt_01_10 und weiter für Punkt2 opt_02_00 bis opt_02_10 etc. Da hast du einen Haufen Arbeit.

Gruß aus'm Pott
Udo
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige