Hallo Gast 79500
Du hast vermutlich "Das klappt sonst immer" überlesen. Ich arbeite seit 15 Jahren mit Klassenprogrammierung und bin da schon relativ fit. Ich hatte ein Makro geschrieben, das einen ActiveX Button ohne Frame in einen mit Frame umwandelt. Das funktioniert soweit prima. Du hast dennoch recht mit "Irgendwas machst du noch falsch": Das Problem war, dass der neue Button grafisch nicht klickbar ist. Dazu muss erst nochmals der Entwurfsmodus aktiviert und wieder beendet werden. Das wiederum führt aber dazu, dass das Projekt und sämtliche Variablen zurückgesetzt werden und die Public WithEvents Eigenschaft, somit ebenfalls ihren Wert verliert. Das war mir vorher noch nicht bewusst. Der Code "Umwandeln" allein funzt deshalb leier nicht. Mit einem zweiten Code klappt es aber nun perfekt, danke für den Denkanstoss.
Wen es interessiert hier der Weg: Legt einen oder mehrere ActiveX-Buttons an, führt das Makro Umwandeln aus, aktiviert und deaktiviert den Entwurfsmodus, Führt dann das Makro Zuweisen aus, ggf. über ein Workbook_Open Ereignis.
Code für Modul1:
Option Explicit
Dim coll As New Collection
Sub Umwandeln()
Dim shp As Shape, tooltip As String
Dim t As Single, l As Single, w As Single, h As Single, c As String, n As String
tooltip = "Test"
Dim cb1 As MSForms.CommandButton
Dim ax As axButton
For Each shp In ActiveSheet.Shapes
If shp.Type = msoOLEControlObject Then
If shp.OLEFormat.progID = "Forms.CommandButton.1" Then
With shp
t = .Top
l = .Left
w = .Width
h = .Height
c = .OLEFormat.Object.Object.Caption
n = .Name
.Delete
End With
With ActiveSheet.Shapes.AddOLEObject("Forms.Frame.1", Left:=l, Top:=t, Width:=w, Height:=h).OLEFormat.Object.Object
.Caption = ""
.BorderStyle = 1
.BorderStyle = 0
Set cb1 = .Controls.Add("Forms.CommandButton.1", n)
With cb1
.Width = w
.Height = h
.Caption = c
.ControlTipText = tooltip
End With
coll.Add New axButton
Set ax = coll(coll.Count)
Set ax.cb = cb1
End With
End If
End If
Next shp
End Sub
Sub Zuweisen()
Dim shp As Shape, btn As MSForms.CommandButton, ax As axButton
For Each shp In ActiveSheet.Shapes
If shp.Type = msoOLEControlObject Then
If shp.OLEFormat.progID = "Forms.Frame.1" Then
For Each btn In shp.OLEFormat.Object.Object.Controls
coll.Add New axButton
Set ax = coll(coll.Count)
Set ax.cb = btn
Next btn
End If
End If
Next shp
End Sub
Code für ein Klassenmodul names axButton
Public WithEvents cb As MSForms.CommandButton
Private Sub cb_Click()
MsgBox cb.Name & " wurde geklickt"
End Sub
Code im Modul "DieseArbeitsmappe"
Private Sub Workbook_Open()
Call Zuweisen
End Sub
Gruß Mr. K.
|