Button auf Excel Tabellenblatt via Code erzeugen

  • VB.NET

Es gibt 33 Antworten in diesem Thema. Der letzte Beitrag () ist von Oisse.

    Danke für Deine Antwort:
    Hier der Code:

    Quellcode

    1. ​Imports System.Globalization
    2. Imports Microsoft.Office.Interop.Excel
    3. Imports System.Drawing.Color
    4. Imports Microsoft.VisualBasic
    5. Public Class Tabelle2
    6. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    7. Dim tb As Excel.Worksheet = CType(Globals.ThisWorkbook.Application.Worksheets("Tabelle2"), Worksheet)
    8. Dim bt = tb.Buttons.Add(200, 100, 100, 20)
    9. bt.Caption = "Mein Button"
    10. bt.Font.Color = RGB(0, 0, 80)
    11. bt.Font.Bold = True
    12. AddHandler bt.Click, AddressOf Bt_Click
    13. End Sub
    14. Private Sub Bt_Click(sender As Object, e As EventArgs)
    15. Dim Button = CType(sender, Button)
    16. MsgBox(Button.Name)
    17. End Sub
    18. 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

    Quellcode

    1. With Sheets("Tabelle1").Buttons.Add(200, 100, 50, 20)
    mit

    Quellcode

    1. Dim tb As Excel.Worksheet = Globals.ThisWorkbook.Application.Worksheets("Tabelle2")
    2. With tb.Buttons.Add(200, 100, 100, 20)
    ersetzt.
    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

    1. ​Imports Microsoft.Office.Tools.Ribbon
    2. Imports System.Drawing.Color
    3. Public Class Ribbon1
    4. Private Sub Button_Click(ByVal sender As System.Object,
    5. ByVal e As Microsoft.Office.Tools.Ribbon.RibbonControlEventArgs) Handles Button.Click
    6. Dim NativeWorksheet As Microsoft.Office.Interop.Excel.Worksheet =
    7. CType(Globals.ThisAddIn.Application.ActiveWorkbook.Worksheets(1), Excel.Worksheet)
    8. Dim worksheet As Microsoft.Office.Tools.Excel.Worksheet =
    9. Globals.Factory.GetVstoObject(NativeWorksheet)
    10. Dim buttonName As String = "Bt"
    11. If CType(sender, RibbonCheckBox).Checked Then
    12. Dim selection As Excel.Range = CType(Globals.ThisAddIn.Application.Selection, Range)
    13. If Not (selection Is Nothing) Then
    14. Dim Bt As New Microsoft.Office.Tools.Excel.Controls.Button()
    15. worksheet.Controls.AddButton(100, 100, 100, 20, buttonName)
    16. Bt.Text = "OK"
    17. Bt.Interior.Color = AliceBlue
    18. Bt.ForeColor = Black
    19. End If
    20. Else
    21. worksheet.Controls.Remove(buttonName)
    22. End If
    23. AddHandler Bt, AddressOf Bt_Click
    24. End Sub
    25. Private Sub Bt_Click(sender As Object, e As EventArgs)
    26. Dim Button = CType(sender, Button)
    27. MsgBox(Button.Name)
    28. End Sub
    29. 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.

    VB.NET-Quellcode

    1. Dim Bt As Microsoft.Office.Tools.Excel.Controls.Button()
    2. Bt = worksheet.Controls.AddButton(100, 100, 100, 20, buttonName)
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Neu

    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.

    Neu

    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 du Option Strict On inzwischen aktiviert?
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Neu

    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

    Quellcode

    1. ​Private Sub Bt_Click(sender As Object, e As EventArgs)
    2. Dim Button = CType(sender, Button)
    3. MsgBox(Button.Name)
    4. End Sub
    habe ich Haltepunkte gesetzt, die aber nicht erreicht werden.

    Neu

    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
    --

    Neu

    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

    Neu

    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