Button auf Excel Tabellenblatt via Code erzeugen
- VB.NET
Sie verwenden einen veralteten Browser (%browser%) mit Sicherheitsschwachstellen und können nicht alle Funktionen dieser Webseite nutzen.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Es gibt 33 Antworten in diesem Thema. Der letzte Beitrag () ist von Oisse.
-
-
Danke für Deine Antwort:
Hier der Code:
Quellcode
- Imports System.Globalization
- Imports Microsoft.Office.Interop.Excel
- Imports System.Drawing.Color
- Imports Microsoft.VisualBasic
- Public Class Tabelle2
- Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
- Dim tb As Excel.Worksheet = CType(Globals.ThisWorkbook.Application.Worksheets("Tabelle2"), Worksheet)
- Dim bt = tb.Buttons.Add(200, 100, 100, 20)
- bt.Caption = "Mein Button"
- bt.Font.Color = RGB(0, 0, 80)
- bt.Font.Bold = True
- AddHandler bt.Click, AddressOf Bt_Click
- End Sub
- Private Sub Bt_Click(sender As Object, e As EventArgs)
- Dim Button = CType(sender, Button)
- MsgBox(Button.Name)
- End Sub
- End Class
-
Das mit den
tb.Buttons
habe ich nur von dir übernommen.
Ich dachte, du hättest das getestet.
Ich hätte vermutlich eher einen ActiveX-Button verwendet.
Dim bt = tb.OLEObjects.Add(ClassType:="Forms.CommandButton.1", Link:=False, DisplayAsIcon:=False, Left:=489, Top:=87.75, Width:=50.25, Height:=32.25)
Nein, ich hätte den Button gar nicht dynamisch erzeugt, sondern nur die Sichtbarkeit eines Buttons ein- und ausgeschaltet.
Und da ich es vor Jahren schon aufgegeben habe, VSTOs zu programmieren, ist es vermutlich besser, wenn ich mich aus dem Thread zurück ziehe, bevor ich noch Unsinn erzähle.--
If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
-- -
Zunächst einmal: Entschuldige, dass ich mich erst so spät gemeldet hatte, obwohl Du bereits am Mittwoch geantwortet hattest. Ich hatte übersehen, dass mittlerweile eine zweite Seite aufgemacht wurde.
Ich hatte den Code, so wie ihn mir Karl-Heinz übermittelt hatte, getestet und der Button wurde erstellt. Der Code lief ohne Fehler durch.
Ich hatte in Karl-Heinz Code lediglich mit
Wie ich aber immer wieder betont hatte, wurde mir von der IntelliSense niemals ein "Buttons" angeboten, weshalb ich mich immer wieder frage, was denn bei mir nicht richtig eingestellt ist. Denn offensichtlich funktioniert es bei anderen, nur bei mir eben nicht. Denn, und auch das habe ich geschrieben, ich kann auch kein: Dim bt as New Button eingeben, weil mir eben Button gar nicht angeboten wird.
Wie also soll ich einem neu erstellten Button (bt) als Button deklarieren, wenn mir das gar nicht angeboten wird?
Wie soll ich denn dann einen Button an den "AddHandler" übergeben?
Darum drehte sich doch die ganze Fragerei.
Gleich zu Beginn und auch in meiner späteren Erläuterung hatte ich erklärt, um was es geht. Auch hatte ich geschrieben, dass es mir durchaus gelungen ist, ein Shape zu erzeugen, das mit einem "OnAction" Makrocode ausführen kann.
Meine Frage war und ist nach wie vor: Wie kann ich dieses Objekt, ob es nun ein Button ist oder ein Shape, so deklarieren und auch übergeben, dass es beim Klicken eine Prozedur ausführt, bzw ich es an "AddHandler" übergeben kann?
Gruß Oisse -
Oisse schrieb:
Wie also soll ich einem neu erstellten Button (bt) als Button deklarieren
Dim bt as Microsoft.Office.Interop.Excel.Button
Vielleicht gehst du mal diese Anleitung Schritt für Schritt durch und überträgst sie auf deine Anwendung:
Walkthrough: Add controls to a worksheet at run time in VSTO add-in project
Das ist doch ziemlich genau, was du machen willst.--
If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
-- -
Tja, was soll ich sagen:
Ich denke, entscheidend war der Hinweis auf den Verweis.
Dann habe ich mehrere Varianten ausprobiert.
Zunächst so, wie in dem Link beschrieben. Gut, ich hab's dann hinbekommen, dass ein Button erstellt wurde.
Dann die zweite Variante, sodass ich die Größe und Lage einstellen konnte (einen Text auf den Button, oder eine Hintergrundfarbe usw. festzulegen ist mir bis dato nicht gelungen)
Was aber nach wie vor fehlt ist, wie kann ich diesem neu erstellten Button ein Click Ereignis zuweisen.
Wir drehen uns irgendwie im Kreis habe ich das Gefühl.
Mein Code sieht momentan so aus:
Quellcode
- Imports Microsoft.Office.Tools.Ribbon
- Imports System.Drawing.Color
- Public Class Ribbon1
- Private Sub Button_Click(ByVal sender As System.Object,
- ByVal e As Microsoft.Office.Tools.Ribbon.RibbonControlEventArgs) Handles Button.Click
- Dim NativeWorksheet As Microsoft.Office.Interop.Excel.Worksheet =
- CType(Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets(1), Excel.Worksheet)
- Dim worksheet As Microsoft.Office.Tools.Excel.Worksheet =
- Globals.Factory.GetVstoObject(NativeWorksheet)
- Dim buttonName As String = "Bt"
- If CType(sender, RibbonCheckBox).Checked Then
- Dim selection As Excel.Range = CType(Globals.ThisAddIn.Application.Selection, Range)
- If Not (selection Is Nothing) Then
- Dim Bt As New Microsoft.Office.Tools.Excel.Controls.Button()
- worksheet.Controls.AddButton(100, 100, 100, 20, buttonName)
- Bt.Text = "OK"
- Bt.Interior.Color = AliceBlue
- Bt.ForeColor = Black
- End If
- Else
- worksheet.Controls.Remove(buttonName)
- End If
- AddHandler Bt, AddressOf Bt_Click
- End Sub
- Private Sub Bt_Click(sender As Object, e As EventArgs)
- Dim Button = CType(sender, Button)
- MsgBox(Button.Name)
- End Sub
- End Class
Danke für die Hilfe -
Oisse schrieb:
Dim Bt As New Microsoft.Office.Tools.Excel.Controls.Button()
worksheet.Controls.AddButton(100, 100, 100, 20, buttonName)Bt
wird nie ein Button zugewiesen.
--
If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
-- -
Danke für die Richtigstellung, und dass Du Dich noch nicht von mir "verabschiedet" hast. Bin echt froh drum.
Der Button wird korrekt erstellt, so wie gewollt.
Bleibt noch die alles entscheidende Frage: wie kann ich diesem neu erstellten Button ein Click-Ereignis zuweisen?
So wie oben in meinem Code funktionierts nicht. -
Naja, wenn dem bt tatsächlich der richtige Button zugewiesen wird (so wie ich es in Post #27 beschrieb), dann sollte das
AddHandler Bt, AddressOf Bt_Click
die Eventroutine zuweisen.
Hast du dich mal mit dem Debugger durchgestept und die Variablen angeschaut und versucht, zu verstehen, was der Code macht?
Und hast duOption Strict On
inzwischen aktiviert?--
If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
-- -
Option Strict On ist aktiviert.
Der Code läuft auch einwandfrei durch und der Button wird erstellt.
Aber wenn ich draufklicke passiert einfach nichts.
Auch im diesem Code
habe ich Haltepunkte gesetzt, die aber nicht erreicht werden. -
Tja, dann muss ich wohl aufgeben.
Wie gesagt, es ist viele Jahre her, dass ich das letzte Mal mit VSTO gearbeitet habe.
Und Buttons dynamisch erzeugen tu ich eh nie.
Ich erzeuge sie im Designer und schalte sie zur Laufzeit nur Visible.
Vielleicht kann ja sonst noch jemand weiterhelfen.--
If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
-- -
Naja, wenn´s nicht funktioniert, dann muss es irgendeine andere Lösung geben.
Vielleicht noch eine Frage:
Wenn Du sie im Designer erstellst, wandern die dann mitsamt dem Code mit, wenn Du das Tabellenblatt kopierst?
Auf jeden Fall vielen herzlichen Dank für Deine Hilfe(n). Zumindest habe ich viel gelernt und richtig eingestellt.
Gruß Oisse -
Oisse schrieb:
Wenn Du sie im Designer erstellst, wandern die dann mitsamt dem Code mit, wenn Du das Tabellenblatt kopierst?--
If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
-- -
Hm, leider nicht. Die Originalbutton funktionieren. Wenn ich das Tabellenblatt kopiere werden die "Buttons" auch erstellt. Aber ob das wirklich Buttons sind? Zumindest funktionieren sie nicht. Hättest Du vielleicht eine Lösung, wie ich das bewerkstelligen könnte?
Ich habe sozusagen ein Tabellenblatt als Vorlage. Dieses Tabellenblatt wird kopiert und dann gleich entsprechend per Code vorausgefüllt und später von weiteren Benutzern mit Daten ergänzt. Aber dazu brauche ich auf dem Tabellenblatt zwei Buttons, die Code ausführen können.
Irgendeine Idee?
Gruß Oisse
-
Ähnliche Themen
-
Wert aus Excel in Textbox übernehmen
AndyVB2010 - - Sonstige Problemstellungen -
Excel-Button in Visual Basic steuern
schnorklunder - - Sonstige Problemstellungen