Vba: Zugriff auf Button mittels 'Me'?

Möchte innerhalb des Button-Cllick-EReignisses auf den Button zugreifen. Da ich denselben Code für mehrere hundert Buttons einsetzen muss, möchte ich nicht den Button-Namen benutzen, sondern ein Schlüsselwort, dass es mir erlaubt die Code-Zeilen, die innerhalb der Ereignisprozedur stehen für alle zu kopieren.

So funktioniert es leider nicht.

Private Sub CommandButton1_Click()
MsgBox (Me.BottomRightCell.Address)

End Sub

Kann ich ihrgendwie den Button-Namen mitübergeben? Wird wohl auch nciht gehen.

Beiträge der letzten Zeit anzeigen: Alle Beiträge1 Tag7 Tage2 Wochen1 Monat3 Monate6 Monate1 Jahr Die ältesten zuerstDie neusten zuerst

Hallo,

Private Sub CommandButton1_Click()
MsgBox (Me.BottomRightCell.Address)

End Sub

Kann ich ihrgendwie den Button-Namen mitübergeben? Wird wohl
auch nciht gehen.

Doch. :smile:

Probier mal das:

Private Sub CommandButton2\_Click()
 etwas CommandButton2
End Sub

Private Sub etwas(Btn As Control)
 Btn.ControlTipText = "Test"
End Sub

Gruß, Rainer

Hallo!

Du kannst entweder die caption übergeben oder noch einfacher ist es, indem Du die Button indizierst und mittels Select case den gejklickten Button ermittelst.

also:

Public Sub ereignis(idx)
select case idx

case 0:

case 1:

.....

end select
End Sub
'
Private Sub Command1\_Click(Index As Integer)
Call ereignis(Index)
End Sub

Ich hoffe, Deine Frage richtig verstanden zu haben.

Grüße

Gollum

Hallo,

Private Sub Command1_Click(Index As Integer)

das wäre schön. Das ist aber VBA. In meinem VBA (Excel97) haben die Steuerelemente keine Index-Eigenschaft. Die habe ich leider nur in VB6, in VBA nicht.

Gruß, Rainer

D.h. über das Wörtchen ‚me‘ kann ich den Button, der momentan aktiv ist nicht ansprechen?

Ich möchte den Code halt nur einmal schreiben und dann für jeden Button verwenden, ohne umständlich jedes Mal den Button-Namen anpassen zu müssen.

Habt ihr keine Idee dazu?

was bedeutet die Caption übergeben? Sagt mir persönlich nichts.

Hallo,

D.h. über das Wörtchen ‚me‘ kann ich den Button, der momentan
aktiv ist nicht ansprechen?

Nein, Me ist die Form, nicht das Steuerelement. Schreib doch einfach mal ‚Me.Caption = Test‘, dann siehst Du, wo es ankommt.

Ich möchte den Code halt nur einmal schreiben und dann für
jeden Button verwenden, ohne umständlich jedes Mal den
Button-Namen anpassen zu müssen.

Habt ihr keine Idee dazu?

Für VBA habe ich da keine Idee. Die Eigenschaft ‚Index‘ fehlt den Steuerelementen in VBA leider. Wie das geht, würde mich auch interessieren, weil die Frage danach öfter kommt.

Gruß, Rainer

Hallo,

was bedeutet die Caption übergeben? Sagt mir persönlich
nichts.

Die Beschriftung. Auf dem Commandbutton steht ja etwas, was da steht ist in der Eigenschaft …

CommandButton1.Caption

… festgelegt.

Gruß, Rainer

Hallo!

Die caption ist der Text, der auf dem Button steht. Das mit dem Index stimmt (leider). Rainer hat recht, es ginge nur über einen „Lumpenzug“, das heißt, man müßte den TabIndex mißbrauchen.

Gollum

Nachtrag
Man könnte auch die Tag-Eigenschaft verwenden, denn dazu ist sie ja da :wink:

Gollum

Hi Gollum,

die Frage danach kommt öfter. Wie ist ja so ziemlich egal. :smile: 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.

Gruß, Rainer

Hi Gollum,

das hilft doch nicht, dann hat immer noch jeder Button sein eigenes Klickereignis. Wie bringe ich die zusammen in ein Ereignis, egal wie kompliziert das auch ist? (Vergiß Subclassing, die Button haben in VBA auch kein Handle. :smile:)

Gruß, Rainer

die Frage danach kommt öfter. Wie ist ja so ziemlich egal. :smile:
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,
tja, hättse mich gefragt, ich weiß wie’s geht :smile:
Das Stichwort ist Klassenmodule. Ich hatte auch Code für 56 Buttons (nachbau der farbauswahl in Excel), leider ist der Code im Festplattenhimmel:frowning:
Da ich ungefähr weiß nach was ich suchen muß finde ich evtl was bei Google, melde mich wieder wenn ich was finde.
Gruß
Reinhard

Hallo Reinhard,

tja, hättse mich gefragt, ich weiß wie’s geht :smile:
Das Stichwort ist Klassenmodule. Ich hatte auch Code für 56
Buttons (nachbau der farbauswahl in Excel), leider ist der
Code im Festplattenhimmel:frowning:

Ich weiß, das hast Du schon mal erzählt. Ich habe aber immer noch keine vernünftige Vorstellung, wie es gehen soll.

Da ich ungefähr weiß nach was ich suchen muß finde ich evtl
was bei Google, melde mich wieder wenn ich was finde.

Das wäre nett. :smile:

Gruß, Rainer

Button: Namen Topleftcell Blatt ermitteln

die Frage danach kommt öfter. Wie ist ja so ziemlich egal. :smile:
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) 

Hallo Reinhard,

Danke!!! Ich hab’s bis jetzt nur mal überflogen, alles verstanden habe ich noch nicht. Das muß ich mir am WE mal ganz genau ansehen. Ist ja toll!

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.

Nein, mit VBA beschäftige ich mich doch nur hier. Sonst brauche ich kein VBA, was ich brauche, mache ich alles mit VB6.

Da ich Klassenmodule nicht „kann“ blicke ich da nicht durch.

Ist nicht viel anders als andere Module auch, nur daß sie ‚angemeldet‘ werden müssen und Events feuern können. Wenn eine Klasse mehrfach eingebunden ist, können die Variablen sogar gleichzeitig verschiedene Werte enthalten, das war’s schon.

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.

Noch nicht, ich seh’s mir erst mal ‚laufend‘ an, das geht nur in der Firma, ich habe doch privat gar kein Excel.

Um die Bemerkungen besser zu verstehen habe ich ganz unten
nochmals den ganzenBeitrag von Michael drangehängt.

Ja, hab’ ich schon gesehen. Danke! Ich bastel mal damit 'rum, mal sehen, was ich daraus machen kann, am Besten wäre es ja, wenn ich das in ein OCX bekomme, dann kann Jeder mehrere Buttons verwenden und muß sich nicht mit dem Code herumschlagen, ein OCX kann ja auch Events feuern. :smile:

Gruß, Rainer