PDA

Vollständige Version anzeigen : OLEObject Code zuweisen


Pentagonius
22.08.2017, 14:09
Hallo zusammen,

Ich möchte gerne in einem Userform beim Drücken eines CommandButtons einen SpinButton in einer gewünschten Zelle auf dem Worksheet erzeugen. Dies funktioniert soweit.

Private Sub CommandButton1_Click()
Dim ziel As Range
Dim zielLeft, zielTop, zielHeight, zielWidth As Integer

Set ziel = Cells(3, 4) 'Auswählen der Zelle D3
zielLeft =Ziel.Left
zielTop = Ziel.Top
zielHeight = Ziel.Height
zielWidth = Ziel.Width

With ActiveSheet
.OLEObjects.Add ClassType:="Forms.SpinButton.1", _
Link:=False, DisplayAsIcon:=False, Left:=zielLeft + zielWidth - 10, _
Top:=zielTop + 2.5, Width:=10, Height:=zielHeight - 5
End Sub

Nun möchte ich jedoch gerne, dass beim Drücken des SpinButtons direkt der Wert in der angeordneten Zelle ("ziel") um 1 erhöht bzw. reduziert wird.
Das nachträgliche Hinzufügen funktioniert gut:

Private Sub SpinButton1_SpinDown()
Dim Zie As Range
Set Ziel = Cells(3,4)
Ziel.Value = Ziel.Value -1
End Sub

Private Sub SpinButton1_SpinUp()
Ziel.Value = Ziel.Value +1
End Sub

Jedoch möchte ich es gerne direkt in den Code schreiben anstatt es jedes mal manuellen nachträglichen Hinzuzufügen. Hat jemand eine Idee wie dies funktionieren könnte?
Vielen Dank im Voraus!

Beverly
22.08.2017, 14:12
Hi,

was meinst du mit "...anstatt es jedes mal manuellen nachträglichen Hinzuzufügen"?

<hr width="20%" align="left"><img src="http://excel-inn.de/images/grusz.gif" height=35" align="left" alt="Grußformel"><a href="http://excel-inn.de/"><img border="0" src="http://excel-inn.de/images/logo1.gif" height=35" align="middle" alt="Beverly's Excel - Inn"></a>

Pentagonius
22.08.2017, 14:22
Ich möchte gerne direkt nach dem Erstellen des SpinButtons
(.OLEObjects.Add ClassType:="Forms.SpinButton.1", _) diesem die Funktion zuweisen, dass beim drücken des SpinDown bzw. SpinUp sich der Wert der Zelle auf dem Arbeitsblatt um +/-1 verändert.

So wie der Code jetzt ist wird ein SpinButton ohne jegliche Funktion erstellt, welchem man nachträglich diese Funktion hinzufügen könnte.

Beverly
22.08.2017, 14:29
Wenn du den erstellten SpinButton SpinButton1 benennst und der Code dafür bereits im Codemodul des Tabellenblatt steht, dann sollte es damit doch da kein Problem geben.

<hr width="20%" align="left"><img src="http://excel-inn.de/images/grusz.gif" height=35" align="left" alt="Grußformel"><a href="http://excel-inn.de/"><img border="0" src="http://excel-inn.de/images/logo1.gif" height=35" align="middle" alt="Beverly's Excel - Inn"></a>

Pentagonius
22.08.2017, 14:48
Vielen Dank für deine Mühe.


Vielleicht hilft die folgende Beschreibung um mein Problem zu verstehen:

Klicken auf Command-Button ruft ein UserForm hervor. Hier werden Eingaben gemacht, welche in eine Zeile "Ziel_Zeile" des Blatts eingetragen werden. Jedes mal wenn ein Eintrag hinzugefügt wird, wird auch ein SpinButton erzeugt, der mit der "Ziel_Zelle" in der "Ziel_Zeile" verbunden ist.

Wenn nun x Einträge hinzugefügt werden, so entstehen x-Spinbutton
[SpinButton (1), SpinButton(2), ..., SpinButton(x)]. Die Zuweisung +/- 1 funktioniert dann nur für SpinButton (1). Für SpinButton(2),...,SpinButton(x) existiert keine Anweisung.

Beverly
22.08.2017, 15:05
Du erstellst also nicht nur 1 SpinButton sondern für jede Zeile einen? Das hatte ich so nicht verstanden, denn in deinem Code für das Erstellen des SpinButtons ist nur eine konkrete Zelle angegeben.

In diesem Fall müsste man es über Klassenprogrammierung versuchen, damit jeder SpinButton auf den Code zugreifen kann. Dazu wäre aber eine hochgeladene Beispielmappe erforderlich.

<hr width="20%" align="left"><img src="http://excel-inn.de/images/grusz.gif" height=35" align="left" alt="Grußformel"><a href="http://excel-inn.de/"><img border="0" src="http://excel-inn.de/images/logo1.gif" height=35" align="middle" alt="Beverly's Excel - Inn"></a>

Pentagonius
22.08.2017, 15:34
Ok, ich habe mal versucht eine Beispieldatei mit allen relevanten Infos zu erstellen.

Entschuldigt bitte, dass die gezielte Beschreibung des Problems noch nicht so sitzt... Vielen Dank!

Beverly
22.08.2017, 16:00
Im Anhang mein Lösungsvorschlag.
Beachte, dass ich im Code des CommandButtons eine neue Zeile ergänzt habe habe.

<hr width="20%" align="left"><img src="http://excel-inn.de/images/grusz.gif" height=35" align="left" alt="Grußformel"><a href="http://excel-inn.de/"><img border="0" src="http://excel-inn.de/images/logo1.gif" height=35" align="middle" alt="Beverly's Excel - Inn"></a>

Pentagonius
22.08.2017, 19:44
Vielen Dank!

Ganz nachvollziehen konnte ich deine Lösung noch nicht, aber es tut schonmal genau das was es soll. Danke :)

Beverly
23.08.2017, 08:13
Was genau ist denn unklar?

<hr width="20%" align="left"><img src="http://excel-inn.de/images/grusz.gif" height=35" align="left" alt="Grußformel"><a href="http://excel-inn.de/"><img border="0" src="http://excel-inn.de/images/logo1.gif" height=35" align="middle" alt="Beverly's Excel - Inn"></a>

Nepumuk
23.08.2017, 18:24
Hallo Karin,

du solltest beim Öffnen der Mappe die schon vorhandenen Spinbuttons der Klasse zuweisen. Es ist ja nicht zwingend dass der Benutzer jedes mal einen neuen hinzufügt.

Beverly
23.08.2017, 19:33
Hi Nepumuk,

da hast du natürlich vollkommen recht, hatte ich nicht bedacht.

Einfach ins Codemodul DieseArbeitsmappe den folgenden Code:

Option Explicit

Private Sub Workbook_Open()
InitElemente
End Sub


<hr width="20%" align="left"><img src="http://excel-inn.de/images/grusz.gif" height=35" align="left" alt="Grußformel"><a href="http://excel-inn.de/"><img border="0" src="http://excel-inn.de/images/logo1.gif" height=35" align="middle" alt="Beverly's Excel - Inn"></a>

R J
23.08.2017, 19:44
Ich bin ja gegen das ständige zumüllen mit unnötigen Objekten. Auch muss man nicht immer mit Kanonen auf Spatzen schießen. Hier ist eine Klassenprogrammierung völlig überzogen. Zumal hier nicht einmal das Chance Ereignis mit einbezogen wurde.

Anbei mal eine ganz einfache Lösung. Ein Spinbutton Objekt, dass sich immer auf der zu bearbeitenden Zeile in Spalte D befindet. Reicht vollkommen aus und bleibt für den ungeübten Programmierer auch überschaubar....

Beverly
23.08.2017, 23:56
Wozu so kompliziert, wenn man schon auf Spatzen schießen will? Am einfachsten ist der Doppelklick - siehe Anhang: bei Doppelklick in die Spalte mit Überschrift "Minus" wird jeweils 1 subtrahiert, bei Doppelklick in Spalte "Plus" wird 1 addiert.

<hr width="20%" align="left"><img src="http://excel-inn.de/images/grusz.gif" height=35" align="left" alt="Grußformel"><a href="http://excel-inn.de/"><img border="0" src="http://excel-inn.de/images/logo1.gif" height=35" align="middle" alt="Beverly's Excel - Inn"></a>

Beverly
23.08.2017, 23:57
@Fragesteller,

du solltest die Anzahl nicht als Text in die Zelle schreiben - verwende besser CLng(TextBox2)

<hr width="20%" align="left"><img src="http://excel-inn.de/images/grusz.gif" height=35" align="left" alt="Grußformel"><a href="http://excel-inn.de/"><img border="0" src="http://excel-inn.de/images/logo1.gif" height=35" align="middle" alt="Beverly's Excel - Inn"></a>