Button: Namen Topleftcell Blatt ermitteln
die Frage danach kommt öfter. Wie ist ja so ziemlich egal. 
Hast Du einen Beispielcode, wie Du in VBA mit dem Click auf
zwei verschiedene Button ein gemeinsames Ereignis auslösen
kannst? Darüber zermartere ich mir schon seit Wochen den Kopf
und finde nichts.
Hallo Rainer,
die Datei: http://www.badongo.com/file/1868224
hat den folgenden Code von Michal Schwimmer, auch die Bemerkungen stammen aus einer Inetantwort von ihm.
Solltest du mal ein Vba-Buch erwerben wollen, er ist der Tipp für Excel-Vba.
Getestet mit XL97.
Da ich Klassenmodule nicht „kann“ blicke ich da nicht durch. Er schreibt, das Makro „AllButtons_Click“ soll in Tabelle1 stehen.
Wenn ich das mache und dann einen Button anklicke, kommt eine Fehlermeldung „Fehler beim Kompilieren, Sub nicht definiert“.
Also habe ich sie auch in Modul1 reingeschrieben , dann klappt alles, aber siehe da, wenn ich in diese Sub im Modul1 einen Haltepunkt setze, sehe ich dass sie dort nie aufgerufen wird.
Kommentiere ich sie im Modul1 aus, kommt wieder der Fehler.
Vielleicht hast du ja dafür eine Erklärung.
Um die Bemerkungen besser zu verstehen habe ich ganz unten nochmals den ganzenBeitrag von Michael drangehängt.
in das Modul des Tabllenblattes wo die CommandButtons stehen:
Option Explicit
'In das Klassenmodul des Tabellenblattes (in dem normalerweise die
'Ereignisprozeduren hinkommen) folgenden Code:
Private mcolButtons As Collection
Public Sub AllButtons\_Click(objButton As CommandButton)
With objButton
MsgBox "Worksheet = " & .Parent.Name & vbCrLf & \_
"Name = " & .Name & vbCrLf & \_
"Zelle = " & .TopLeftCell.Address
End With
End Sub
Public Sub MakeEvents()
Dim EventClass As clsMyEvent
Dim objButton As OLEObject
'Collection, um die Objektklassen am Leben zu halten
Set mcolButtons = New Collection
' Alle Ole-Objekte durchlaufen
For Each objButton In Me.OLEObjects
If TypeOf objButton.Object Is MSForms.CommandButton Then
' CommandButton gefunden
' Eventklasse erzeugen
Set EventClass = New clsMyEvent
' Referenz auf Objekt übergeben
EventClass.myButton = objButton.Object
' und in Collection dauerhaft machen
mcolButtons.Add EventClass
End If
Next
End Sub
Private Sub Worksheet\_Activate()
' Eventuell auch in DieseArbeitsmappe
' im Ereignis Workbook\_Open
MakeEvents
End Sub
In Modul1:
'Lege dazu in der Entwicklungsumgebung unter Einfügen/Klassenmodul eine
'Klasse mit dem (hier verwendeten) Namen clsMyEvent an. In diese Klasse
'den folgenden Code einfügen:
Option Explicit
Public Sub AllButtons\_Click(objButton As CommandButton)
With objButton
MsgBox "Worksheet = " & .Parent.Name & vbCrLf & \_
"Name = " & .Name & vbCrLf & \_
"Zelle = " & .TopLeftCell.Address
End With
End Sub
'Die Prozedur MakeEvents muss einmal aufgerufen werden, hier durch das
'Ereignis Worksheet\_Activate.
'
'Bei jedem Klick auf einen Button wird die Prozedur AllButtons\_Click
'aufgerufen. Diese Prozedur kannst du aber auch in ein allgemeines Modul
'auslagern.
'die Eigenschaft
'objButton.Parent.Name liefert den Tabellennamen
'objButton.Name liefert den Buttonnamen
'objButton.TopLeftCell.Address liefert die Adresse der linken oberen
'Zelle.
in Klassenmodul clsMyEvent (Es muss exakt diesen Namen haben)
Option Explicit
Private WithEvents objCMD As CommandButton
Private Sub objCMD\_Click()
On Error Resume Next
Call objCMD.Parent.AllButtons\_Click(objCMD)
If Err.Number 0 Then
Call AllButtons\_Click(objCMD)
End If
End Sub
Public Property Let myButton(ByVal vNewValue As CommandButton)
Set objCMD = vNewValue
End Property
Gruß
Reinhard
********************************************************************
Newsgroupantwort von Michel Schwimmer:
Eike hat vollkommen recht, dass hunderte Ereignisprozeduren
zuviel des Guten sind. Es ist nicht nur unübersichtlich, auch
Änderungen sind sehr schwer vorzunehmen.
Ich würde das etwas anders machen, du benötigst dafür aber Klassen und
für einen Anfänger sieht das zu Beginn etwas kompliziert aus.
Erfordert aber nicht viel Code und wenn du das ein paar mal
durchgeackert hast (Einzelschrittmodus), wird dir auch das Konzept
klar.
Lege dazu in der Entwicklungsumgebung unter Einfügen/Klassenmodul eine
Klasse mit dem (hier verwendeten) Namen clsMyEvent an. In diese Klasse
den folgenden Code einfügen:
Option Explicit
Private WithEvents objCMD As CommandButton
Private Sub objCMD\_Click()
On Error Resume Next
Call objCMD.Parent.AllButtons\_Click(objCMD)
If Err.Number 0 Then
Call AllButtons\_Click(objCMD)
End If
End Sub
Public Property Let myButton(ByVal vNewValue As CommandButton)
Set objCMD = vNewValue
End Property
In das Klassenmodul des Tabellenblattes (in dem normalerweise die
Ereignisprozeduren hinkommen) folgenden Code:
Option Explicit
Private mcolButtons As Collection
Public Sub AllButtons\_Click(objButton As CommandButton)
With objButton
MsgBox "Worksheet = " & .Parent.Name & vbCrLf & \_
"Name = " & .Name & vbCrLf & \_
"Zelle = " & .TopLeftCell.Address
End With
End Sub
Public Sub MakeEvents()
Dim EventClass As clsMyEvent
Dim objButton As OLEObject
'Collection, um die Objektklassen am Leben zu halten
Set mcolButtons = New Collection
' Alle Ole-Objekte durchlaufen
For Each objButton In Me.OLEObjects
If TypeOf objButton.Object Is MSForms.CommandButton Then
' CommandButton gefunden
' Eventklasse erzeugen
Set EventClass = New clsMyEvent
' Referenz auf Objekt übergeben
EventClass.myButton = objButton.Object
' und in Collection dauerhaft machen
mcolButtons.Add EventClass
End If
Next
End Sub
Private Sub Worksheet\_Activate()
' Eventuell auch in DieseArbeitsmappe
' im Ereignis Workbook\_Open
MakeEvents
End Sub
Die Prozedur MakeEvents muss einmal aufgerufen werden, hier durch das
Ereignis Worksheet\_Activate.
Bei jedem Klick auf einen Button wird die Prozedur AllButtons\_Click
aufgerufen. Diese Prozedur kannst du aber auch in ein allgemeines
Modul auslagern.
Die Eigenschaft
objButton.Parent.Name liefert den Tabellennamen
objButton.Name liefert den Buttonnamen
objButton.TopLeftCell.Address liefert die Adresse der linken oberen
Zelle.
MfG
Michael
--
Michael Schwimmer http://michael-schwimmer.de
Excel VBA ISBN 3-8273-2183-2 [Buch anschauen](http://www.amazon.de/dp/3827321832/?tag=werweisswas-21)
Excel Programmierung - Das Handbuch ISBN 3-8606-3548-4 [Buch anschauen](http://www.amazon.de/dp/3860635484/?tag=werweisswas-21)