Discussion:
[VBA] ActiveX-OptionButtons, Name ermitteln und Code zuweisen
(zu alt für eine Antwort)
Jörg Eisenträger
2005-10-28 19:28:59 UTC
Permalink
Hallo,

zur Laufzeit sollen neue ActiveX-OptionButtons erzeugt und neu gruppiert
werden und ihnen soll ein neuer Privat Code zugewiesen werden.

Das Erzeugen machen wir bisher so, dass wir einige "Vorlage-Buttons"
kopieren und diese danach neu gruppieren:
'VorlageButton kopieren
ActiveSheet.Shapes("VorlageOptionButton").Select
Selection.Copy
Range("ZielZelle").Select
ActiveSheet.Paste

'VorlageButtons neu gruppieren
ActiveSheet.OLEObjects("VorlageOptionButton").Object.GroupName =
Range("Gruppe").Value
Range("Gruppe").Value = Range("Gruppe").Value + 1

Das hat soweit funktioniert. Jetzt sollen die neu erzeugten Buttons aber
Code ausführen. Das Problem: Ich kann sie nicht ansprechen.

Wie kann ich den von Excel beim Kopieren zugewiesenen Namen eines
Shapes/ActiveX-Controls ermitteln?

Wie kann ich ihm eine Private Sub NeuerButtonName_Click() zuweisen?


Gruß
Jörg
--
LPs auf CD brennen - so geht's: http://www.joergei.de/
E-Mail-Adresse existiert, wird aber nicht gelesen.
Dr. Eckehard Pfeifer
2005-10-28 20:06:04 UTC
Permalink
Hallo, etwa so:

Sub Place()
Dim cmd As OLEObject
Set cmd = Tabelle1.OLEObjects.Add(ClassType:="Forms.CommandButton.1",
Link:=False _
, DisplayAsIcon:=False, Left:=501.75, Top:=140.25, Width:=110.25, _
Height:=24.75)
cmd.Name = "myButton"
End Sub


Private Sub myButton_Click()
MsgBox "so gehts"
End Sub

--

MfG EP

Entwicklung, Beratung und Training
(Microsoft Certified Application Developer)

www.dr-e-pfeifer.net, www.ppt-user.de
Melanie Breden
2005-10-28 20:24:40 UTC
Permalink
Hallo Jörg ,
Post by Jörg Eisenträger
zur Laufzeit sollen neue ActiveX-OptionButtons erzeugt und neu gruppiert
werden und ihnen soll ein neuer Privat Code zugewiesen werden.
Das Erzeugen machen wir bisher so, dass wir einige "Vorlage-Buttons"
'VorlageButton kopieren
ActiveSheet.Shapes("VorlageOptionButton").Select
Selection.Copy
Range("ZielZelle").Select
ActiveSheet.Paste
'VorlageButtons neu gruppieren
ActiveSheet.OLEObjects("VorlageOptionButton").Object.GroupName =
Range("Gruppe").Value
Range("Gruppe").Value = Range("Gruppe").Value + 1
Das hat soweit funktioniert. Jetzt sollen die neu erzeugten Buttons aber
Code ausführen. Das Problem: Ich kann sie nicht ansprechen.
Wie kann ich den von Excel beim Kopieren zugewiesenen Namen eines
Shapes/ActiveX-Controls ermitteln?
Wie kann ich ihm eine Private Sub NeuerButtonName_Click() zuweisen?
du kommst auch hier fast ohne zu selektieren aus:

Public Sub CopyOptionButton()
Dim lngStartLine As Long

With ActiveSheet
.Shapes("VorlageOptionButton").Copy
.Paste
End With

With Selection
.Top = Range("ZielZelle").Top
.Left = Range("ZielZelle").Left
.Name = "BtnTest"
End With

With ThisWorkbook.VBProject.VBComponents _
(Worksheets(1).CodeName).CodeModule
lngStartLine = .CreateEventProc("Click", "BtnTest") + 1

.InsertLines lngStartLine, _
" msgbox ""Du hast mich angeklickt"""
End With

ActiveCell.Select
End Sub


Mit freundlichen Grüssen
Melanie Breden
--
- Microsoft MVP für Excel -
Microsoft Excel - Die ExpertenTipps http://tinyurl.com/cmned
Das Excel-VBA Codebook http://excel.codebooks.de
Excel-Auftragsprogrammierung
Reiner Wolff
2005-10-28 20:35:47 UTC
Permalink
Moin Jörg,
Post by Jörg Eisenträger
zur Laufzeit sollen neue ActiveX-OptionButtons erzeugt und neu gruppiert
werden und ihnen soll ein neuer Privat Code zugewiesen werden.
Das Erzeugen machen wir bisher so, dass wir einige "Vorlage-Buttons"
'VorlageButton kopieren
ActiveSheet.Shapes("VorlageOptionButton").Select
Selection.Copy
Das 'Select' und die 'Selection' (sowie einen Punkt) solltest Du Dir sparen
können. Du brauchst fast nie erst etwas bei VBA auswählen, wenn Du damit
etwas machen willst.
ActiveSheet.Shapes("VorlageOptionButton").Copy
Post by Jörg Eisenträger
Range("ZielZelle").Select
ActiveSheet.Paste
Gilt auch hier.
Allerdings könntest Du (auch für die Namensgebung) auch mit
Dim NeuesTeil As Shape
Set NeuesTeil = ActiveSheet.Shapes.Add ()
Post by Jörg Eisenträger
'VorlageButtons neu gruppieren
ActiveSheet.OLEObjects("VorlageOptionButton").Object.GroupName =
Range("Gruppe").Value
Range("Gruppe").Value = Range("Gruppe").Value + 1
Das hat soweit funktioniert. Jetzt sollen die neu erzeugten Buttons aber
Code ausführen. Das Problem: Ich kann sie nicht ansprechen.
Wie kann ich den von Excel beim Kopieren zugewiesenen Namen eines
Shapes/ActiveX-Controls ermitteln?
Wenn Du die Eigenschaften wie oben einstellst, dann über
NeuesTeil.Name
Post by Jörg Eisenträger
Wie kann ich ihm eine Private Sub NeuerButtonName_Click() zuweisen?
Das kannst Du imho am besten erreichen, indem Du den Ereigniscode in ein
Klassenmodul auslagerst. Im Klassenmodul (bitte evtl. in der OH nachlesen)
könnte der Code so aussehen:
'>>>>
Option Explicit

Public WithEvents opt As MSForms.OptionButton

Private Sub opt_Click()
MsgBox "Hallo " & opt.Caption
End Sub

Private Sub Class_Terminate()
Set opt = Nothing
End Sub
'<<<<

Aufrufen könntest Du das dann ungefähr so:
'>>>>
Dim Hilfsvariable as /KlassenName/
Set Hilfsvariable = New /KlassenName/
Set Hilfsvariable.opt = NeuesTeil
'<<<<

Von Gedanken VBA-Code zur Laufzeit hinzuzufügen, würde ich absehen.

Bei Fragen zu dem ganzen Thema, bis demnächst in diesem Theater ;-)
Greetinx aus Kiel
Reiner
--
Wenn eine Idee nicht zuerst absurd erscheint, taugt sie nichts.
(Albert Einstein)
Dr. Eckehard Pfeifer
2005-10-28 22:14:06 UTC
Permalink
Hallo, das mit der Klasse habe ich auch gedacht. Aber irgendwie funktioniert
es nicht. Zuweisen und instanzieren ja, aber der Code wird nicht
ausgefuehrt. Kannst Du Deine Idee nochmal testen und ggf. den vollst. Code
posten?

--

MfG EP

Entwicklung, Beratung und Training
(Microsoft Certified Application Developer)

www.dr-e-pfeifer.net, www.ppt-user.de
Reiner Wolff
2005-10-29 08:12:33 UTC
Permalink
Moin Eckehard
Post by Dr. Eckehard Pfeifer
Hallo, das mit der Klasse habe ich auch gedacht. Aber irgendwie funktioniert
es nicht. Zuweisen und instanzieren ja, aber der Code wird nicht
ausgefuehrt. Kannst Du Deine Idee nochmal testen und ggf. den vollst. Code
posten?
Aber klar.
Der nun getestete und funktionierende Code sieht jetzt so aus (und dem
ursprünglichen unglaublich ähnlich):
'in einem Klassenmodul mit dem Namen 'clsVieleOptionen'
'>>>>
Option Explicit
Public WithEvents opt As MSForms.OptionButton
Private Sub opt_Click()
MsgBox "Hallo " & opt.Caption
End Sub
Private Sub Class_Terminate()
Set opt = Nothing
End Sub
'<<<<

'Code in einem Formular mit 2 Option-Buttons
'>>>>
Option Explicit
Dim colOptionen As Collection
Private Sub UserForm_Initialize()
Dim Hilfsvariable As clsVieleOptionen
'Collection initialisieren
Set colOptionen = New Collection

'erstes Optionsfeld zur Collection hinzufügen
Set Hilfsvariable = New clsVieleOptionen
Set Hilfsvariable.opt = Me.OptionButton1
colOptionen.Add Hilfsvariable, "1"

'zweites Optionsfeld auch hinzufügen
Set Hilfsvariable = New clsVieleOptionen
Set Hilfsvariable.opt = Me.OptionButton2
colOptionen.Add Hilfsvariable, "2"
End Sub
'<<<<

Dafür habe ich direkt den Code aus meinem letzten Posting genommen.
Hierbei gab es allerdings ein kleines Problem, was evtl. erklärt, warum das
Ereignis bei Dir nicht eintritt:
Wenn Du mit dem Cursor in die Prozedur 'opt_Click' gehst, was steht dann
oben in Deinen beiden Kombinationsfeldern? Bei meinem ersten Versuch stand
dort links nämlich 'Allgemein' und rechts 'opt_click'. Daraufhin habe ich
im Linken einmal 'opt' ausgewählt und dann stand rechts auch nur noch
'Click' (so, wie es sein sollte).

Hoffentlich hilft Dir das ja weiter ...

Greetinx aus Kiel
Reiner
--
Die Arbeit am Computer ist eine Erfahrung extremer Isolation.
Dr. Eckehard Pfeifer
2005-10-29 10:35:12 UTC
Permalink
Ja, auf einem Formular, das habe ich gewusst und es geht...
Wie gehts aber auf einem Tabellenblatt - dort habe ich ein Problem. Und nur
den weiter oben beschriebenen Trick mit der Name-Zuweisung parat.

--

MfG EP

Entwicklung, Beratung und Training
(Microsoft Certified Application Developer)

www.dr-e-pfeifer.net, www.ppt-user.de
Reiner Wolff
2005-10-30 01:16:33 UTC
Permalink
Moin Eckehard,
Post by Dr. Eckehard Pfeifer
Ja, auf einem Formular, das habe ich gewusst und es geht...
Wie gehts aber auf einem Tabellenblatt - dort habe ich ein Problem.
Ups, da hab' ich gar nicht drauf geachtet. Im allgemeinen halte ich nicht
viel davon Steuerelemente direkt auf dem Tabellenblatt zu plazieren.
Post by Dr. Eckehard Pfeifer
Und nur den weiter oben beschriebenen Trick mit der Name-Zuweisung parat.
Ich hab's grad nun einmal mit meinem Code für OptionButtons auf einem
Tabellenblatt probiert. Dabei lediglich 'UserForm_Initialize' durch
'Worksheet_Activate' ersetzt und das ganze in das Klassenmodul des
Tabellenblattes gepackt. Wie soll ich sagen: Es funktioniert.

Greetinx aus Kiel
Reiner
--
Irren ist menschlich.
Aber wer richtigen Mist bauen will, braucht einen Computer!
Melanie Breden
2005-10-30 08:23:07 UTC
Permalink
Hallo Reiner,
Post by Reiner Wolff
Ich hab's grad nun einmal mit meinem Code für OptionButtons auf einem
Tabellenblatt probiert. Dabei lediglich 'UserForm_Initialize' durch
'Worksheet_Activate' ersetzt und das ganze in das Klassenmodul des
Tabellenblattes gepackt. Wie soll ich sagen: Es funktioniert.
Dein Beispiel funktioniert leider nur, wenn du die Controls explizit benennst.

Ich habe mich schon des öfteren vergebens darangemacht OLEObjekte
per Schleife in einer Klasse zu initialisieren.

Das Problem liegt IMO daran, dass die Variable "opt" vom Typ
"MSForms.OptionButton" deklariert ist.
Eine andere Deklarierung (OptionButton, Control ...) habe ich
leider nicht hinbekommen.

Folgende Prozedur versuche ich zum laufen zu bekommen;

Private Sub Worksheet_Activate()
Dim Hilfsvariable As clsVieleOptionen
Dim objCtrl 'As OptionButton

' Set objCtrl = Me.OptionButton1 >=Typ OptionButton
Set colOptionen = New Collection

For Each objCtrl In Me.OLEObjects ' welche Auflistung?
If objCtrl.progID = "Forms.OptionButton.1" Then
Set Hilfsvariable = New clsVieleOptionen
Set Hilfsvariable.opt = objCtrl ' Fehler
' Set Hilfsvariable.opt = Me.OptionButton1 ' OK
colOptionen.Add Hilfsvariable
End If
Next objCtrl
End Sub

Auch wenn ich die OptionButton als Shapes definiere bekomme
ich keine Zuweisung in die Klasse.

Kennt jemand eine Möglichkeit alle Elemente auf einem Tabellenblatt
einem Automatisierungsereignis zuzuweisen?


Mit freundlichen Grüssen
Melanie Breden
--
- Microsoft MVP für Excel -
Microsoft Excel - Die ExpertenTipps http://tinyurl.com/cmned
Das Excel-VBA Codebook http://excel.codebooks.de
Excel-Auftragsprogrammierung
Dr. Eckehard Pfeifer
2005-10-30 09:23:07 UTC
Permalink
Hallo, Melanie, das geht wohl so:

Dim Hilfsvariable As Klasse1

Private Sub Worksheet_Activate()
Dim objCtrl As Object

Set colOptionen = New Collection

For Each objCtrl In Me.OLEObjects
If objCtrl.progID = "Forms.OptionButton.1" Then
Set Hilfsvariable = New Klasse1
Set Hilfsvariable.opt = objCtrl.Object ' kein Fehler
colOptionen.Add Hilfsvariable
End If
Next objCtrl
End Sub

(ueber die Obejct-Eigenschaft).

--

MfG EP

Entwicklung, Beratung und Training
(Microsoft Certified Application Developer)

www.dr-e-pfeifer.net, www.ppt-user.de
Melanie Breden
2005-10-30 09:44:07 UTC
Permalink
Hallo Eckehard ,
[Code gesnippt}
Post by Dr. Eckehard Pfeifer
(ueber die Obejct-Eigenschaft).
ja, habe ich aus deinem anderen Code schon herausgelesen.

Aber leider funktioniert die Zuweisung immer noch nicht
im Zusammenhang mit einem neuen OLEObject:

Dim colOptionen As Collection

Public Sub CopyOptionButton2()
Dim Hilfsvariable As clsVieleOptionen
Dim objCtrl As OLEObject

Set colOptionen = New Collection

With ActiveSheet
.Shapes("VorlageOptionButton").Copy
.Paste
With Selection
.Top = Range("ZielZelle").Top
.Left = Range("ZielZelle").Left
.Name = "BtnTest"
End With
ActiveCell.Select

For Each objCtrl In .OLEObjects
If objCtrl.progID = "Forms.OptionButton.1" Then
Set Hilfsvariable = New clsVieleOptionen
Set Hilfsvariable.opt = objCtrl.Object
colOptionen.Add Hilfsvariable
End If
Next objCtrl
End With
End Sub

Da man den Code nicht debuggen kann, finde ich die Ursache leider nicht :-(


Mit freundlichen Grüssen
Melanie Breden
--
- Microsoft MVP für Excel -
Microsoft Excel - Die ExpertenTipps http://tinyurl.com/cmned
Das Excel-VBA Codebook http://excel.codebooks.de
Excel-Auftragsprogrammierung
Dr. Eckehard Pfeifer
2005-10-30 09:51:55 UTC
Permalink
ja, genau das ist das Problem: neue Objekte. Einzelzugriff ueber den Namen,
kein Zugriff ueber die Schleife.

--

MfG EP

Entwicklung, Beratung und Training
(Microsoft Certified Application Developer)

www.dr-e-pfeifer.net, www.ppt-user.de
Reiner Wolff
2005-10-30 11:20:14 UTC
Permalink
Moin Melanie, moin Eckehard,

ich habe mich jetzt mal an diesen Beitrag gehängt, weil mein entwickelter
Code von meiner Vorrednerin abgeleitet ist.
Post by Melanie Breden
Aber leider funktioniert die Zuweisung immer noch nicht
[Code gesnippt]
Post by Melanie Breden
Da man den Code nicht debuggen kann, finde ich die Ursache leider nicht :-(
Ich habe mich jetzt einmal bemüht, den Code zu debuggen. Denn debuggen kann
man ihn schon, nur leider nicht im Haltemodus.
Meine Erkenntnisse aus den Versuchen sind:
- Das Hinzufügen von OLEObjekten auf ein Tabellenblatt sperrt gewisse
andere Funktionalitäten
- Führt man das Hinzufügen und das Zuweisen der Ereignissteuerung getrennt
voneinander aus, gibt es kein Problem
- letztlich funktioniert das Zuweisen der Ereignissteuerung (auch über die
Klasse) solange nicht, wie auf der Haltemodus gesperrt ist

Ergo: Ich brauche zwei Ereignisse. Das erste fügt das Steuerelement auf dem
Tabellenblatt ein und das zweite weist ihm den Ereigniscode zu.

Da man dafür normaler Weise keine zweite Aktion des Benutzers will, muss
man das zweite Ereignis selber auslösen, um den Bug, den wir hier
aufgezeigt haben, zu umgehen.

Ich habe mich im folgenden Beispiel dafür entschieden, dies zeitgesteuert
auszulösen:
'>>>>
Option Explicit
Dim colOptionen As Collection

Sub Aufruf()
Hinzufügen
'Timer hinzufügen, um die Makrozuweisung unabhängig vom Hinzufügen
'zu machen (Lösungen: nicht schön aber selten)
Application.OnTime Now + CDate("00:00:01"), "Tabelle1.Zuweisung"
End Sub

Sub Hinzufügen()
Set colOptionen = New Collection

With ActiveSheet
.Shapes("VorlageOptionButton").Copy
.Paste
With Selection
.Top = Range("ZielZelle").Top
.Left = Range("ZielZelle").Left
.Name = "BtnTest"
End With
ActiveCell.Select
End With
End Sub

Public Sub Zuweisung()
Dim Hilfsvariable As clsVieleOptionen
Dim objCtrl As OLEObject
Dim objOptionButton As MSForms.OptionButton

Set colOptionen = New Collection

With ActiveSheet
For Each objCtrl In .OLEObjects
If objCtrl.ProgId = "Forms.OptionButton.1" Then
Set objOptionButton = objCtrl.Object
Set Hilfsvariable = New clsVieleOptionen
Set Hilfsvariable.opt = objCtrl.Object
colOptionen.Add Hilfsvariable
End If
Next objCtrl
End With
End Sub
'<<<<

Mit dem zeitlichen Versatz von einer Sekunde müsste ich dann leben ...

Greetinx aus Kiel
Reiner, der gespannt darauf ist, was ihr von dieser Variante haltet ;-)
--
Es gibt nichts schöneres als in trauter Zweisamkeit mit seinem inneren
Schweinehund auf der faulen Haut zu liegen
Melanie Breden
2005-10-30 12:01:35 UTC
Permalink
Hallo Reiner,
Post by Reiner Wolff
Ergo: Ich brauche zwei Ereignisse. Das erste fügt das Steuerelement auf dem
Tabellenblatt ein und das zweite weist ihm den Ereigniscode zu.
Da man dafür normaler Weise keine zweite Aktion des Benutzers will, muss
man das zweite Ereignis selber auslösen, um den Bug, den wir hier
aufgezeigt haben, zu umgehen.
Greetinx aus Kiel
Reiner, der gespannt darauf ist, was ihr von dieser Variante haltet ;-)
dein Code funktioniert wunderbar :-))

an diese Art Lösung habe ich übrigens auch gedacht...
da aber meine Muffins auf ihre Zubereitung gewartet haben,
musste ich meinen Test zunächst aufschieben ;-)

Dieser thread zeigt mal wieder, wie effizient doch das Erarbeiten
einer gemeinsamen Lösung ist :-)


Mit freundlichen Grüssen
Melanie Breden
--
- Microsoft MVP für Excel -
Microsoft Excel - Die ExpertenTipps http://tinyurl.com/cmned
Das Excel-VBA Codebook http://excel.codebooks.de
Excel-Auftragsprogrammierung
Reiner Wolff
2005-10-30 14:32:17 UTC
Permalink
Moin Melanie,
Post by Melanie Breden
dein Code funktioniert wunderbar :-))
Das freut mich.
Post by Melanie Breden
an diese Art Lösung habe ich übrigens auch gedacht...
da aber meine Muffins auf ihre Zubereitung gewartet haben,
musste ich meinen Test zunächst aufschieben ;-)
Dieser thread zeigt mal wieder, wie effizient doch das Erarbeiten
einer gemeinsamen Lösung ist :-)
Allerdings.
Schade ist allerdings, dass ich trotzdem keine Muffins abbekomme ;-)
Ich arbeite bei sowas auch lieber im Team, das ist einfach kreativer...

Greetinx aus Kiel
Reiner
--
Manche Computer kosten ein Vermögen - andere nur den Verstand.
Jörg Eisenträger
2005-10-30 18:03:36 UTC
Permalink
Hallo Melanie,
halle alle anderen, die hier so fleißig mitdiskutieren,
Post by Melanie Breden
Dieser thread zeigt mal wieder, wie effizient doch das Erarbeiten
einer gemeinsamen Lösung ist :-)
ich hatte natürlich nicht damit gerechnet, dass meine Frage eine solche
Diskussion auslösen würde und ich hoffe, ich habe Euch nicht all zu
lange von dem herrlichen Herbstwetter abgehalten, welches - zumindest
hier im Südwesten - gerade herrscht.

Dummerweise konnte ich Eurer Diskussion bald nicht mehr folgen, da
Klassenmodule und alles, was damit zu tun hat, weit hinter meinem
persönlichen VBA-Horizont liegen. Ich wusste gar nicht, wie weit ...

Jedenfalls habe _ich_ die Lösung noch nicht, weil ich Euer Ergebnis
umzusetzen nicht im Stande bin. :-(


Ich habe ausprobiert:

A) den von Melanie geposteten Code vom Fri, 28 Oct 2005 22:24:40 +0200:
Das ist der einzige, bei dem ich noch jede Zeile einigermaßen verstanden
habe, und er funktioniert bei mir. Allerdings wird immer der VBA-Editor
in den Vordergrund geholt, auch wenn ich vorher
Application.ScreenUpdating = False einschalte.
Wenn Ihr mir das noch wegzaubern könnt, hätte ich die Lösung.

B) den von Reiner geposteten Code vom Sun, 30 Oct 2005 12:20:14 +0100:
Hier erhalte ich schon beim Kompilieren die Meldung:
"Benutzerdefinierter Typ nicht definiert" in der Zeile
Dim Hilfsvariable As clsVieleOptionen
(Fehlt wohl irgendwas 'ne Klasse höher?)
Selbst, wenn ich den zum Laufen kriege: Ich muss per Schaltfläche
gleichzeitig 3 Buttons kopieren; und 3 s Wartezeit kann ich meinen Usern
nicht zumuten, zumal die Aktion bei Bedarf mehrfach hintereinander
ausgeführt werden muss (per Schaltfläche eine neue Zeile mit 3
OptionButtons einfügen).
Ich hätte gern ausprobiert, wie weit sich der Zeitabstand verkürzen
lässt z.B. so: ... Now + CDate("00:00:01") / 10

Habt Ihr für die beiden Varianten noch den letzten Kick für mich? (Aber
bitte: Es muss/soll nicht mehr heute - am Sonntag - sein.)


Gruß
Jörg
--
LPs auf CD brennen - so geht's: http://www.joergei.de/
E-Mail-Adresse existiert, wird aber nicht gelesen.
unknown
2005-10-30 20:28:36 UTC
Permalink
Hallo Jörg,
Post by Jörg Eisenträger
"Benutzerdefinierter Typ nicht definiert" in der Zeile
Dim Hilfsvariable As clsVieleOptionen
(Fehlt wohl irgendwas 'ne Klasse höher?)
Diesen Fehler hatte ich auch. Hier fehlt unter Extras/Verweise der
Verweis auf die Microsoft Forms 2.0 Object Library.
Post by Jörg Eisenträger
Selbst, wenn ich den zum Laufen kriege: Ich muss per Schaltfläche
gleichzeitig 3 Buttons kopieren; und 3 s Wartezeit kann ich meinen Usern
nicht zumuten,
Kopiere erst deine 3 Buttons und abschließend erstellst du nach einer
Sekunde die Ereignisklassen.

MfG Frank
_________________________________________________
Frank Arendt-Theilen, Microsoft MVP für Excel, Hameln
Microsoft Excel - Die ExpertenTipps http://tinyurl.com/cmned
Website: http://www.xl-faq.de
# Auftragsprojekte##
Jörg Eisenträger
2005-10-30 22:50:47 UTC
Permalink
Hallo Frank,
Post by unknown
Post by Reiner Wolff
Dim Hilfsvariable As clsVieleOptionen
--> "Benutzerdefinierter Typ nicht definiert"
Diesen Fehler hatte ich auch. Hier fehlt unter Extras/Verweise der
Verweis auf die Microsoft Forms 2.0 Object Library.
Hm, die ist bei mir eingebunden. Fehler kommt trotzdem.
Post by unknown
Post by Reiner Wolff
3 s Wartezeit kann ich meinen Usern nicht zumuten,
Kopiere erst deine 3 Buttons und abschließend erstellst du nach einer
Sekunde die Ereignisklassen.
Gute Idee, danke.


Gruß
Jörg
--
LPs auf CD brennen - so geht's: http://www.joergei.de/
E-Mail-Adresse existiert, wird aber nicht gelesen.
Reiner Wolff
2005-10-31 05:56:48 UTC
Permalink
Moin Jörg,
Post by Jörg Eisenträger
Post by Melanie Breden
Dieser thread zeigt mal wieder, wie effizient doch das Erarbeiten
einer gemeinsamen Lösung ist :-)
ich hatte natürlich nicht damit gerechnet, dass meine Frage eine solche
Diskussion auslösen würde und ich hoffe, ich habe Euch nicht all zu
lange von dem herrlichen Herbstwetter abgehalten, welches - zumindest
hier im Südwesten - gerade herrscht.
Keine Sorge, Dich trifft keine Schuld ;-)
Post by Jörg Eisenträger
"Benutzerdefinierter Typ nicht definiert" in der Zeile
Dim Hilfsvariable As clsVieleOptionen
(Fehlt wohl irgendwas 'ne Klasse höher?)
Das liegt vermutlich daran, dass Du dem Klassenmodul nicht den Namen
'clsVieleOptionen' gegeben hast. Gehe einmal in das Klassenmodul und stelle
in den Eigenschaften den Namen darauf ein, dann sollte es eigentlich gehen.
Post by Jörg Eisenträger
Selbst, wenn ich den zum Laufen kriege: Ich muss per Schaltfläche
gleichzeitig 3 Buttons kopieren; und 3 s Wartezeit kann ich meinen Usern
nicht zumuten, zumal die Aktion bei Bedarf mehrfach hintereinander
ausgeführt werden muss (per Schaltfläche eine neue Zeile mit 3
OptionButtons einfügen).
Ich hätte gern ausprobiert, wie weit sich der Zeitabstand verkürzen
lässt z.B. so: ... Now + CDate("00:00:01") / 10
Mit der gewählten Methode kannst Du den Timer leider nicht verkürzen,
soweit ich weiß, kann der nur sekundengenau. Es ist allerdings nur eine
Sekunde, da Du die 3 Buttons ja auf einmal erstellen kannst und hinterher
für alle 3 auch die Ereignisse zuteilen kannst. Zudem ist es keine
Wartezeit, die der Benutzer tatsächlich bemerken dürfte. Es ist lediglich
eine Zeit, in der die Click-Ereignisprozedur der Objekte noch nicht
funktioniert, d.h. der Benutzer müsste innerhalb der ersten Sekunde nach
dem Erstellen sie bereits benutzen wollen.

Und um die "Wartezeit" kürzer zu halten, müsstest Du Code benutzen, den Du
bestimmt nicht benutzen willst.

Noch eine Anmerkung:
Auch mir vielen - wie vermutlich jedem - Klassen zu Beginn recht schwer.
Auch wenn ich es als deutlich bessere Lösung empfinde als Code durch Code
erzeugen zu lassen oder im Voraus wissen zu müssen, wie meine
Steuerelemente heißen werden, solltest Du zumindest im Ansatz eine Idee
haben, wie es funktionieren soll. Denn Code, den Du gar nicht verstanden
hast, solltest Du nicht einsetzen. Solltest Du also mit Klassen nachher
arbeiten wollen, so freue ich mich schon auf Deine Verständnisfragen zu
diesem Code :)

Greetinx aus Kiel
Reiner
--
if (2.0 = = 1.999999963) printf("Pentium inside!\n")
Jörg Eisenträger
2005-10-31 15:57:46 UTC
Permalink
Hallo Reiner,
Post by Reiner Wolff
Das liegt vermutlich daran, dass Du dem Klassenmodul nicht den Namen
'clsVieleOptionen' gegeben hast. Gehe einmal in das Klassenmodul und stelle
in den Eigenschaften den Namen darauf ein, dann sollte es eigentlich gehen.
Post by Jörg Eisenträger
(Fehlt wohl irgendwas 'ne Klasse höher?)
Bei mir gab es noch kein Klassenmodul.
Post by Reiner Wolff
Denn Code, den Du gar nicht verstanden
hast, solltest Du nicht einsetzen. Solltest Du also mit Klassen nachher
arbeiten wollen, so freue ich mich schon auf Deine Verständnisfragen zu
diesem Code :)
Wie auch immer, bis jetzt tut's halt net und ich bin keinen Schritt
weiter. Ich arbeite auch gern ohne Klassenmodule und hab auch keinen
Stress, Code zur Laufzeit zu erzeugen oder zu importieren, solange es
funktioniert. Ich würde am liebsten Melanies ersten Code nehmen (denn
den verstehe ich), wenn denn der VBA-Editor nicht aufklappen würde.

Ihr habt in dem Thread so viele einzelne Code-Schnipsel gepostet, so
dass ich nicht weiß, wo die alle hinsollen.

Nachdem ich ein Klassenmodul 'clsVieleOptionen' mit dem Code ...

Option Explicit
Dim colOptionen As Collection
Public WithEvents opt As MSForms.OptionButton
Private Sub opt_Click()
MsgBox "Hallo " & opt.Caption
End Sub
Private Sub Class_Terminate()
Set opt = Nothing
End Sub

... angelegt hatte, konnte ich zumindest kompilieren und es wurde auch
ein neuer OptionButton erzeugt. Beim ersten Klick darauf kam auch die
MessageBox, bei weiteren Klicks jedoch nicht mehr. Warum???

Ich bin kurz davor aufzugeben. Dann wird der Wunsch eines Users, per
Klick auf einen der kopierten Buttons einem ZellRange eine bestimmte
Formatierung zuzuweisen, eben unerfüllt bleiben.

Ich danke Euch trotzdem.


Gruß
Jörg
--
LPs auf CD brennen - so geht's: http://www.joergei.de/
E-Mail-Adresse existiert, wird aber nicht gelesen.
Reiner Wolff
2005-10-31 17:00:30 UTC
Permalink
Moin Jörg,
Post by Jörg Eisenträger
Post by Reiner Wolff
Das liegt vermutlich daran, dass Du dem Klassenmodul nicht den Namen
'clsVieleOptionen' gegeben hast. Gehe einmal in das Klassenmodul und stelle
in den Eigenschaften den Namen darauf ein, dann sollte es eigentlich gehen.
Post by Jörg Eisenträger
(Fehlt wohl irgendwas 'ne Klasse höher?)
Bei mir gab es noch kein Klassenmodul.
Daran hast Du nun ja etwas geändert. ;-)
Post by Jörg Eisenträger
Post by Reiner Wolff
Denn Code, den Du gar nicht verstanden
hast, solltest Du nicht einsetzen. Solltest Du also mit Klassen nachher
arbeiten wollen, so freue ich mich schon auf Deine Verständnisfragen zu
diesem Code :)
Wie auch immer, bis jetzt tut's halt net und ich bin keinen Schritt
weiter. Ich arbeite auch gern ohne Klassenmodule und hab auch keinen
Stress, Code zur Laufzeit zu erzeugen oder zu importieren, solange es
funktioniert. Ich würde am liebsten Melanies ersten Code nehmen (denn
den verstehe ich), wenn denn der VBA-Editor nicht aufklappen würde.
Tja, bei der Lösung kann ich Dir nicht wirklich gut weiterhelfen, da ich
mit sowas selbst noch nicht viel gearbeitet habe.
Post by Jörg Eisenträger
Ihr habt in dem Thread so viele einzelne Code-Schnipsel gepostet, so
dass ich nicht weiß, wo die alle hinsollen.
Gut, Ok. Ich habe ganz unten die Code-Fragmente noch einmal zusammengefügt,
damit Du es etwas leichter hast.
Post by Jörg Eisenträger
Nachdem ich ein Klassenmodul 'clsVieleOptionen' mit dem Code ...
[schnippel]
Post by Jörg Eisenträger
... angelegt hatte, konnte ich zumindest kompilieren und es wurde auch
ein neuer OptionButton erzeugt. Beim ersten Klick darauf kam auch die
MessageBox, ...
Wunderbar, es tut doch. *Einen* Schritt hätten wir damit doch geschafft ;-)
Post by Jörg Eisenträger
...bei weiteren Klicks jedoch nicht mehr. Warum???
Das liegt in der Natur eines OptionButtons. Bei diesem Steuerelement wird
das Click-Ereignis nicht ausgelöst, wenn er bereits angewählt ist (finde
ich zwar nicht sonderlich sinnvoll, aber ist so).
D.h. wenn Du mehrere OptionButtons hättest und immer zwischen diesen hin-
und herschaltest, dann sollte auch jedesmal die MessageBox angezeigt
werden.

Wenn Du jedesmal auf einen Mausklick reagieren willst, ist für Dich das
MouseDown-Ereignis vielleicht besser geeignet, um auf einen Mausklick zu
reagieren. Ich habe dafür das Ereignis - allerdings ohne auszuführenden
Code - schonmal in das Klassenmodul unten mit gepostet.
Post by Jörg Eisenträger
Ich bin kurz davor aufzugeben. Dann wird der Wunsch eines Users, per
Klick auf einen der kopierten Buttons einem ZellRange eine bestimmte
Formatierung zuzuweisen, eben unerfüllt bleiben.
Da kann ich Dich zwar gut verstehen.
Aber nur Mut, Dein Code funktioniert doch schon fast.
Post by Jörg Eisenträger
Ich danke Euch trotzdem.
Bitte, gern geschehen. Mir hat der Thread eh auch so Spass gemacht. Ob Du
daraus nun Code umsetzt oder nicht, bleibt ja Dir überlassen :-)

Greetinx aus Kiel
Reiner

P.S.: Hier nun der Code
'in ein Klassenmodul mit dem Namen 'clsVieleOptionen' schreibst
'Du folgenden Code:
'>>>>
Option Explicit
Public WithEvents opt As MSForms.OptionButton

Private Sub opt_Click()
MsgBox "Hallo " & opt.Caption
End Sub
Private Sub Class_Terminate()
Set opt = Nothing
End Sub

Private Sub opt_MouseDown(ByVal Button As Integer, ByVal Shift As Integer,
ByVal X As Single, ByVal Y As Single)
'Vielleicht passt Dein Code besser in dieses Ereignis?
End Sub
'<<<<

'Der Aufruf kann dann im Codemodul des Tabellenblattes zB so aussehen:
'>>>>
Option Explicit

Dim colOptionen As Collection

Sub Aufruf()
Hinzufügen
'Timer hinzufügen, um die Makrozuweisung unabhängig vom Hinzufügen
'zu machen (Lösungen: nicht schön aber selten)
Application.OnTime Now + CDate("00:00:01"), "Tabelle1.Zuweisung"
End Sub

Sub Hinzufügen()
Set colOptionen = New Collection

With ActiveSheet
.Shapes("VorlageOptionButton").Copy
.Paste
With Selection
.Top = Range("ZielZelle").Top
.Left = Range("ZielZelle").Left
.Name = "BtnTest"
End With
ActiveCell.Select
End With
End Sub

Public Sub Zuweisung()
Dim Hilfsvariable As clsVieleOptionen
Dim objCtrl As OLEObject
Dim objOptionButton As MSForms.OptionButton

Set colOptionen = New Collection

With ActiveSheet
For Each objCtrl In .OLEObjects
If objCtrl.ProgId = "Forms.OptionButton.1" Then
Set objOptionButton = objCtrl.Object
Set Hilfsvariable = New clsVieleOptionen
Set Hilfsvariable.opt = objCtrl.Object
colOptionen.Add Hilfsvariable
End If
Next objCtrl
End With
End Sub
'<<<<
--
Wenn irgendwas mit deinem Computer nicht stimmt, sag deiner Sekretärin,
dass sie die EDV-Abteilung anrufen soll. Wir lieben das Spielchen,
mit einer dritten Person ein Problem zu klären,
von dem Sie absolut überhaupt nichts weiss.
Jörg Eisenträger
2005-10-31 18:09:13 UTC
Permalink
Hallo Reiner,

erst mal Danke für deine Geduld.
Post by Reiner Wolff
Post by Jörg Eisenträger
Nachdem ich ein Klassenmodul 'clsVieleOptionen' mit dem Code ...
... angelegt hatte, konnte ich zumindest kompilieren und es wurde auch
ein neuer OptionButton erzeugt. Beim ersten Klick darauf kam auch die
MessageBox, ...
...bei weiteren Klicks jedoch nicht mehr. Warum???
Das liegt in der Natur eines OptionButtons. Bei diesem Steuerelement wird
das Click-Ereignis nicht ausgelöst, wenn er bereits angewählt ist
Nein, nein. Das ist mir schon klar. Der Ausgangs- und der kopierte
Button sind ja noch in einer Gruppe und ich kann hin und her schalten.

Dein Code verhält sich bei mir so:
Wenn ich gleich nach dem Aufruf auf den neuen Button klicke, kommt die
Meldung "Hallo OptionButton1". Das ist beabsichtigt. Sie kommt aber auch
bei jedem Klick auf jeden beliebigen anderen OptionButton des Sheets,
was nicht beabsichtigt ist.

Nach dem Schließen und Öffnen der Datei kommt die Meldung gar nicht
mehr, was auch nicht beabsichtigt ist. (Vermutlich weil Zuweisung() noch
nicht ausgeführt wurde.)

Ich werde wohl folgende Krücke verwenden müssen: Code für den kopierten
Button in eine Textdatei schreiben, dann diese ins Modul des Sheets
importieren. Nicht schön, elegant schon gar nicht, aber sie hat schon
einmal geholfen.


Gruß
Jörg
--
LPs auf CD brennen - so geht's: http://www.joergei.de/
E-Mail-Adresse existiert, wird aber nicht gelesen.
Reiner Wolff
2005-10-31 20:51:09 UTC
Permalink
Moin Jörg,
Post by Jörg Eisenträger
erst mal Danke für deine Geduld.
Null Problemo.
Post by Jörg Eisenträger
Post by Reiner Wolff
Das liegt in der Natur eines OptionButtons. Bei diesem Steuerelement wird
das Click-Ereignis nicht ausgelöst, wenn er bereits angewählt ist
Nein, nein. Das ist mir schon klar. Der Ausgangs- und der kopierte
Button sind ja noch in einer Gruppe und ich kann hin und her schalten.
Wenn ich gleich nach dem Aufruf auf den neuen Button klicke, kommt die
Meldung "Hallo OptionButton1". Das ist beabsichtigt. Sie kommt aber auch
bei jedem Klick auf jeden beliebigen anderen OptionButton des Sheets,
was nicht beabsichtigt ist.
Das liegt daran, dass der Code in Zuweisung() in einer Schleife alle
Steuerelemente durchgeht und für alle OptionButtons dafür sorgt, dass
(auch) die Klasse sich um die Ereignisse kümmern soll.
For Each objCtrl In .OLEObjects
If objCtrl.ProgId = "Forms.OptionButton.1" Then


Wenn Du also das ganze nur für einige (oder bestimmte) OptionButtons haben
möchtest, könntest Du zB eine weitere Bedingung einfügen, damit nicht alle
OptionButtons "erwischt" werden. Dazu würde ich Dir empfehlen den Buttons,
die durch Deinen Code hinzugefügt wurden, Namen zu geben, die sich deutlich
von denen unterscheiden, die schon immer da waren.
Nehmen wir mal an, die "festen" OptionButtons heißen 'optJa' und 'optNein',
dann könnte ein zur Laufzeit erstellter Button zB 'optLZVielleicht' heißen.

So Du dafür sorgen würdest, dass alle zur Laufzeit hinzugefügten Optionen,
einen Namen tragen, der mit 'optLZ' anfängt, könntest Du wie folgt die
Zuweisung beschränken:
For Each objCtrl In .OLEObjects
If objCtrl.ProgId = "Forms.OptionButton.1" _
And Left(objCtrl.Name, Len("optLZ")) = "optLZ" Then
Post by Jörg Eisenträger
Nach dem Schließen und Öffnen der Datei kommt die Meldung gar nicht
mehr, was auch nicht beabsichtigt ist. (Vermutlich weil Zuweisung() noch
nicht ausgeführt wurde.)
Stimmt.
Das ist ein Punkt, über den ich noch gar nicht nachgedacht hatte. Die
Zuweisung muss dann natürlich bei jedem Start der Datei gemacht werden,
weil sie eben nicht festgeschrieben sondern zur Laufzeit gesetzt wurde.
Der Aufruf von 'Zuweisung()' würde sich dann also im Workbook_Open-Ereignis
ganz gut machen.
Post by Jörg Eisenträger
Ich werde wohl folgende Krücke verwenden müssen: Code für den kopierten
Button in eine Textdatei schreiben, dann diese ins Modul des Sheets
importieren. Nicht schön, elegant schon gar nicht, aber sie hat schon
einmal geholfen.
Letztlich ist doch nur wichtig, dass der Code funktioniert und zum
gewünschten Ergebnis führt!

Greetinx aus Kiel
Reiner
--
In der Welt der EDV enden Pannen nicht, sondern gehen ineinander über.
Jörg Eisenträger
2005-11-01 19:08:27 UTC
Permalink
Hallo Reiner,

fast den ganzen Feiertag verprogrammiert (Wetter war sowieso nix), aber
jetzt hab ich es - mit der Methode von Dir.

(Es waren immer drei Buttons zu kopieren, für die ich dann auch
verschiedene Prozeduren in der höheren Klasse definieren musste.)

Vielen Dank noch einmal.
Post by Reiner Wolff
Post by Jörg Eisenträger
Nach dem Schließen und Öffnen der Datei kommt die Meldung gar nicht
mehr, was auch nicht beabsichtigt ist. (Vermutlich weil Zuweisung() noch
nicht ausgeführt wurde.)
Stimmt.
dann also im Workbook_Open-Ereignis
Ich hab sie sicherheitshalber ins Worksheet_Activate gepackt.


Gruß
Jörg
--
LPs auf CD brennen - so geht's: http://www.joergei.de/
E-Mail-Adresse existiert, wird aber nicht gelesen.
Reiner Wolff
2005-11-02 07:45:25 UTC
Permalink
Moin Jörg,
Post by Jörg Eisenträger
fast den ganzen Feiertag verprogrammiert (Wetter war sowieso nix), aber
jetzt hab ich es - mit der Methode von Dir.
Das klingt, als wärst Du zufrieden. Freut mich.
Post by Jörg Eisenträger
(Es waren immer drei Buttons zu kopieren, für die ich dann auch
verschiedene Prozeduren in der höheren Klasse definieren musste.)
Hm, wie haste das gemacht?
Im Klassenmodul beim Ereignis noch eine Abfrage nach dem Namen
durchgeführt, um die Buttons dann doch wieder voneinander zu unterscheiden?
Post by Jörg Eisenträger
Vielen Dank noch einmal.
Gern geschehen.

Greetinx aus Kiel
Reiner
--
"Wir haben hier keine Zeit zu lesen, was auf dem Bildschirm steht!."

(Ausrede eines Anwenders,
der Probleme mit der Bedienung eines Programmes hatte.)
Jörg Eisenträger
2005-11-02 18:27:42 UTC
Permalink
Hallo Reiner,
Post by Reiner Wolff
Post by Jörg Eisenträger
(Es waren immer drei Buttons zu kopieren, für die ich dann auch
verschiedene Prozeduren in der höheren Klasse definieren musste.)
Hm, wie haste das gemacht?
Im Klassenmodul beim Ereignis noch eine Abfrage nach dem Namen
durchgeführt, um die Buttons dann doch wieder voneinander zu unterscheiden?
Genau. In der Zuweisung() z. B. so:

If InStr(objCtrl.name, "Text1") > 1 Then
Set Hilfsvariable.opt1 = objCtrl.Object
Else
Set Hilfsvariable.opt2 = objCtrl.Object
End If

Im Klassenmodul gibt es dann die Private Subs opt1_Click() und
opt2_Click().



Gruß
Jörg
--
LPs auf CD brennen - so geht's: http://www.joergei.de/
E-Mail-Adresse existiert, wird aber nicht gelesen.
Dr. Eckehard Pfeifer
2005-10-30 09:16:36 UTC
Permalink
Hallo, Reiner, schoen, dass Du Dir so viel Muehe mit mir gibst. Aber auch
das letzte habe ich gewusst :-). Wenn die Dinger schon aufgezogen sind, gibt
eigentlich keinen Grund, nun noch was mit den Klassen zu erledigen.
Deshalb: Im Code aufziehen und die Ereignisprozedur zuweisen, das ist das
Problem.

Sub Place()
Dim opt As OLEObject
Dim Hilfsvariable As Klasse1
Set Hilfsvariable = New Klasse1
Set opt= Tabelle1.OLEObjects.Add(ClassType:="Forms.OptionButton.1",
Link:=False _
, DisplayAsIcon:=False, Left:=501.75, Top:=140.25, Width:=110.25, _
Height:=24.75)
Set Hilfsvariable.opt= opt.Object
End Sub

und im Klassenmodul Klasse1

Public WithEvents opt As MSForms.OptionButton

Private Sub opt_Click()
MsgBox "Hallo " & opt.Caption
End Sub

Und da habe ich nur den mehrfach erwaehnten Trick mit dem Namen.

--

MfG EP

Entwicklung, Beratung und Training
(Microsoft Certified Application Developer)

www.dr-e-pfeifer.net, www.ppt-user.de

!
Melanie Breden
2005-10-30 09:33:15 UTC
Permalink
Hallo Eckehard,
Post by Dr. Eckehard Pfeifer
Hallo, Reiner, schoen, dass Du Dir so viel Muehe mit mir gibst. Aber auch
das letzte habe ich gewusst :-). Wenn die Dinger schon aufgezogen sind, gibt
eigentlich keinen Grund, nun noch was mit den Klassen zu erledigen.
Deshalb: Im Code aufziehen und die Ereignisprozedur zuweisen, das ist das
Problem.
Set Hilfsvariable.opt= opt.Object
^^^^^^

yep, hiermit ist auch mein vorheriges Problem gelöst :-)
Post by Dr. Eckehard Pfeifer
Und da habe ich nur den mehrfach erwaehnten Trick mit dem Namen.
Kannst du den bitte nochmal nennen :-)


Mit freundlichen Grüssen
Melanie Breden
--
- Microsoft MVP für Excel -
Microsoft Excel - Die ExpertenTipps http://tinyurl.com/cmned
Das Excel-VBA Codebook http://excel.codebooks.de
Excel-Auftragsprogrammierung
Dr. Eckehard Pfeifer
2005-10-30 09:39:10 UTC
Permalink
Sub Place()
Dim cmd As OLEObject
Set cmd = Tabelle1.OLEObjects.Add(ClassType:="Forms.CommandButton.1",
Link:=False _
, DisplayAsIcon:=False, Left:=501.75, Top:=140.25, Width:=110.25, _
Height:=24.75)
cmd.Name = "myButton" 'hier ist er
End Sub


Private Sub myButton_Click()
MsgBox "so gehts"
End Sub


--

MfG EP

Entwicklung, Beratung und Training
(Microsoft Certified Application Developer)

www.dr-e-pfeifer.net, www.ppt-user.de
Melanie Breden
2005-10-30 09:50:38 UTC
Permalink
Hallo Eckehard,
Post by Dr. Eckehard Pfeifer
Sub Place()
Dim cmd As OLEObject
Set cmd = Tabelle1.OLEObjects.Add(ClassType:="Forms.CommandButton.1",
Link:=False _
, DisplayAsIcon:=False, Left:=501.75, Top:=140.25, Width:=110.25, _
Height:=24.75)
cmd.Name = "myButton" 'hier ist er
End Sub
Private Sub myButton_Click()
MsgBox "so gehts"
End Sub
aahhh, jetzt ist der Groschen auch bei mir gefallen ;-)

Du weist dem neuen Button einfach den gleichen Namen zu und da die Prozedur bereits besteht,
wird das Click-Ereignis auch beim neuen Button ausgeführt :-)


Mit freundlichen Grüssen
Melanie Breden
--
- Microsoft MVP für Excel -
Microsoft Excel - Die ExpertenTipps http://tinyurl.com/cmned
Das Excel-VBA Codebook http://excel.codebooks.de
Excel-Auftragsprogrammierung
unknown
2005-10-30 14:35:51 UTC
Permalink
Hallo ihr lieben "Codebastler",
vielen Dank für den interessanten Thread und die gefundenen Lösungen.
Das XL ein per Hand eingefügtes Steuerelement und ein per VBA-Code
eingefügtes Steuerelement, aus welchem Grund auch immer
unterschiedlich behandelt, hat mich schon lange gestört, und lässt
sich aus dem unterschiedlichen Kontextmenü des jeweiligen
Steuerelements im Tabellenblatt herauslesen. Dem Steuerelement, das
per VBA-Code in das Tabellenblatt eingefügt wurde, fehlen die
Menüpunkte "Eigenschaften" und "Code anzeigen" (aber das wusstet ihr
bestimmt schon).

MfG Frank
_________________________________________________
Frank Arendt-Theilen, Microsoft MVP für Excel, Hameln
Microsoft Excel - Die ExpertenTipps http://tinyurl.com/cmned
Website: http://www.xl-faq.de
# Auftragsprojekte#
Melanie Breden
2005-10-30 15:29:17 UTC
Permalink
Hallo Frank,
Post by unknown
Hallo ihr lieben "Codebastler",
:-)
Post by unknown
Dem Steuerelement, das
per VBA-Code in das Tabellenblatt eingefügt wurde, fehlen die
Menüpunkte "Eigenschaften" und "Code anzeigen" (aber das wusstet ihr
bestimmt schon).
hmmm, so genau habe ich mir die Unterschiede bisher nicht angesehen...
aber jetzt wo Du es sagst...

Dem per VBA eingefügten Objekt fehlt auch noch der Menüpunkt "Makro zuweisen".

Entscheidend ist wohl, dass das manuell eingefügte Objekt ein "Steuerelement" ist
und das per VBA ein "Objekt".
Vergleiche mal den letzten Menüpunkt in beiden Kontextmenüs.

Bei einem Objekt-Vergleich im Lokalfenster mit folgendem Code habe ich im
Moment keine Unterschiede ausmachen können:

Public Sub ActiveX_Vergleich()
Dim CmdManual 'As CommandButton
Dim CmdVBA 'As CommandButton

With ActiveSheet
Set CmdManual = .CommandManual
Set CmdVBA = .CommandVBA
End With
End Sub


Mit freundlichen Grüssen
Melanie Breden
--
- Microsoft MVP für Excel -
Microsoft Excel - Die ExpertenTipps http://tinyurl.com/cmned
Das Excel-VBA Codebook http://excel.codebooks.de
Excel-Auftragsprogrammierung
Melanie Breden
2005-10-30 15:55:27 UTC
Permalink
Hallo Frank,
Post by Melanie Breden
Entscheidend ist wohl, dass das manuell eingefügte Objekt ein "Steuerelement" ist
und das per VBA ein "Objekt".
Vergleiche mal den letzten Menüpunkt in beiden Kontextmenüs.
ich denke dass die ClassType-Angabe "Forms.CommandButton.1"
verantwortlich ist, weil das Objekt ja aus der Forms-Bibliothek stammt.

Schau dir mal in der OH zu Add/OLEObject die Bescheibung der
ClassType- und FileName-Argumente an.
Evtl. muss man das Steuerelement aus einer anderen Bibliothek nehmen?


Mit freundlichen Grüssen
Melanie Breden
--
- Microsoft MVP für Excel -
Microsoft Excel - Die ExpertenTipps http://tinyurl.com/cmned
Das Excel-VBA Codebook http://excel.codebooks.de
Excel-Auftragsprogrammierung
Dr. Eckehard Pfeifer
2005-10-30 16:27:10 UTC
Permalink
Hallo, das glaube ich eher nicht, da es ja auf UserForms funktioniert.
Uebrigens: Experimente mit
Tabelle1.Shapes.AddOLEObject
schlagen genau so fehl.

:-) Eins muessten wir noch klaeren: Braucht man es tatsaechlich oder ist es
was wie Pfahlsitzen?

--

MfG EP

Entwicklung, Beratung und Training
(Microsoft Certified Application Developer)

www.dr-e-pfeifer.net, www.ppt-user.de
unknown
2005-10-30 17:43:55 UTC
Permalink
Hallo Eckehard,
es ist wie Pfahlsitzen und der Gewissheit, das es besser ist eine
Lösung zu haben und man braucht sie nicht, als keine Lösung zu haben
und man braucht. ;-)

MfG Frank
_________________________________________________
Frank Arendt-Theilen, Microsoft MVP für Excel, Hameln
Microsoft Excel - Die ExpertenTipps http://tinyurl.com/cmned
Website: http://www.xl-faq.de
# Auftragsprojekte#
unknown
2005-10-30 20:28:37 UTC
Permalink
... sie! ;-)
Post by unknown
MfG Frank
_________________________________________________
Frank Arendt-Theilen, Microsoft MVP für Excel, Hameln
Microsoft Excel - Die ExpertenTipps http://tinyurl.com/cmned
Website: http://www.xl-faq.de
# Auftragsprojekte#
MfG Frank
_________________________________________________
Frank Arendt-Theilen, Microsoft MVP für Excel, Hameln
Microsoft Excel - Die ExpertenTipps http://tinyurl.com/cmned
Website: http://www.xl-faq.de
# Auftragsprojekte#
Loading...