Button auf Excel Tabellenblatt via Code erzeugen

  • VB.NET

Es gibt 24 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    Button auf Excel Tabellenblatt via Code erzeugen

    Hallo Zusammen,
    ich möchte gerne einen Button per Code auf einem Excel Tabellenblatt erzeugen. Da ich aber (noch) keine rechte Ahnung von vb.Net habe, funktioniert das nicht.
    Ein "Private WithEvents Button as Button" wird wahrscheinlich nicht stimmen, weil mir "as Button" von der IntelliSense gar nicht angeboten wird.
    Selbst ein "Dim Button as New Button" funktioniert nicht, weil da eine Fehlermeldung kommt.
    Codes rauf und runter probiert, aber ich habe keine Ahnung, was ich sonst noch machen könnte.
    Folgendes (und noch mehr, was google so alles hergibt) habe ich schon probiert:

    VB.NET-Quellcode

    1. Public Class Tabelle2
    2. Private WithEvents Button As Button
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. With Button
    5. .Height = 20
    6. .Width = 50
    7. .Top = 100
    8. .Left = 200
    9. .Backcolor = RGB(100, 200, 100)
    10. .Text = "Test"
    11. .Font.Color = DarkBlue
    12. End With
    13. End Sub
    14. End Class

    Wie gesagt, funktioniert nicht.
    Und wie muss dann der Prozeduraufruf aussehen und die Event-Zuweisung.
    Ich habe mir zwar einen Code zusammengebastelt, der ein Shape-Objekt erzeugt, aber leider stehe ich hier auch auf dem Schlauch, weil ich nicht weiß, wie ich da ein Ereignis auslösen kann.
    Das Objekt wird erzeugt und mit:

    VB.NET-Quellcode

    1. Bt.OnAction = "Test1"

    wird auch ein Makrocode ausgeführt, der in der Excelmappe hinterlegt ist, aber ich schaffe es einfach nicht, einen vb.net code zu starten.
    Könnt Ihr bitte helfen?
    Vielen Dank schon mal
    Gruß Oisse

    Thema verschoben, und CodeTags korrigiert ~VaporiZed

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    Hallo Oise,

    reicht Dir ein Formularsteuerelement? Dann hier ein Beispiel...

    Visual Basic-Quellcode

    1. ​Sub CreateButton()
    2. ' Erstellt einen CommandButton und weißt ein Makro zu
    3. With Sheets("Tabelle1").Buttons.Add(200, 100, 50, 20)
    4. .Caption = "Mein Button"
    5. .Font.Color = RGB(0, 0, 80)
    6. .Font.Bold = True
    7. .OnAction = "Modul1.MeinButtonCode"
    8. End With
    9. End Sub


    Oder mal hiernach googlen.
    ActiveSheet.OLEObjects.Add(ClassType:="Forms.CommandButton.1", Link:=False _
    , DisplayAsIcon:=False, Left:=375, Top:=28.8, Width:=99, Height:=37.2 _
    ).Select

    viele Grüße
    Karl-Heinz
    Hallo Karl-Heinz,
    danke, das Erstellen des Buttons funktioniert.
    Aber wie kann ich einen VB.Net Code aufrufen.
    Einen Makro-Code in Excel Sheet habe ich ja nicht, bzw will dort keinen haben. Ich möchte die Excelmappe Makrofrei haben.
    Deshalb meine Frage, wie ich mit dem Click auf den neu erstellten Button ein Klickereignis erstelle um eine Prozedur in VB.Net zu starten.
    Hättest Du hierfür eine Lösung?
    Gruß Oisse

    Oisse schrieb:

    Ich möchte die Excelmappe Makrofrei haben.

    Oisse schrieb:

    auf den neu erstellten Button ein Klickereignis erstelle um eine Prozedur in VB.Net zu starten.
    In deiner Aussage sind mehrere Ungereimtheiten.
    Oder die Beschreibung ist sehr unvollständig.
    Ein Button-Event benötigt zwingend eine Eventroutine.
    Also irgendeine Art von Code. VBA-Code. Da ist dann nichts mehr mit makrofrei.

    Du sprichst von VB.Net. Excel unterstützt nativ nur VBA und kein VB.Net.
    Oder willst du am Ende ein VSTO-Add-In entwickeln, dass sich in Excel einbinden lässt?

    Es wäre nett, wenn du erläuterst, was du tatsächlich möchtest.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Guten Morgen petaod und Danke für Deine Antwort.
    Also ich habe bereits eine Excelmappe mit Makros. Diese würde ich nun gerne "umbauen". Wie Du bereits erwähnt hast, möchte ich das mit VSTO realisieren, sodass, in der Excelmappe selbst, keine Makros mehr vorhanden sind. Da man mir gesagt hat, es gibt kein VSTO Excel (das hatte ich meinen Suchbegriffen immer vorangestellt) sondern entweder Excel oder vb.net habe ich also immer mit "vb.net ..." auf Google gesucht, um Antworten zu erhalten und bin u.a. hier gelandet.
    Wie ich oben bereits geschildert habe möchte ich also (über VSTO) auf einem Excel Tabellenblatt einen Button erzeugen. In der Originalmappe habe ich dazu ein Shape erzeugt und als Button genutzt, was auch sehr gut funktionierte. Damit konnte ich das entsprechende Makro aufrufen und ablaufen lassen. Der Umbau in VSTO ist mir auch gelungen und auch hier würde er mir den entsprechenden Code starten. Da es mir allerdings selbst nach stundenlangem suchen und selbst testen und probieren nicht gelungen ist, über diesen neu erstellten Button eine Prozedur in (tja, was ist das denn jetzt vb.net oder was soll ich jetzt schreiben? VSTO Excel?) aufzurufen, dachte ich mir, es liegt vielleicht daran, weil es ein Shape und kein Button ist. Also wieder gesucht unter: vb.net Button zur Laufzeit erzeugen (u.a). Hier kam eine Menge. Allerdings hat nichts funktioniert. Wie oben bereits beschrieben: Es war noch nicht einmal "Dim Button as Button" möglich, weil er "as Button" schon gar nicht akzeptiert.
    Was ich also deshalb gerne hätte ist eine Antwort auf die Frage:
    Wie lautet die Anweisung, um mit dem neu erstellten Button eine Prozedur in (vb.Net? VSTO Excel?) zu starten?
    Ich hoffe jetzt ist es etwas klarer. Wenn ich im falschen Forum bin, wäre ich dankbar, wenn mir nun jemand sagen könnte wo ich denn genau nachfragen kann.
    Ich dachte, ich wäre hier richtig. Oder ist das Forum an sich richtig, nur die falsche Abteilung für meine Frage? Ich kenn mich nicht mehr aus.
    Gruß Oisse

    Oisse schrieb:

    Wie lautet die Anweisung, um mit dem neu erstellten Button eine Prozedur in (vb.Net? VSTO Excel?) zu starten?

    AddHandler
    Die Eventroutine muss schon existieren, aber den Button kannst du als Parameter übergeben.
    Nimm am besten die Standard-Signatur für die Eventroutine (sender as Object, e as Eventargs).
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Hallo, vielen Dank für Deine Antwort, mit der ich immer noch überfordert bin, weil ich mit der ganzen Syntax nicht zurecht komme.
    Auch die Beschreibung des "AddHandler" ist für mich nicht hilfreich, weil da ein Klassenmodul auftaucht und ich keine Ahnung habe, was was ist und was wofür benötigt wird.
    Wenn ich das probiere kommt ein Fehler:

    VB.NET-Quellcode

    1. Public Class Tabelle2
    2. Private WithEvents Button As Button
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. Dim tb As Excel.Worksheet = Globals.ThisWorkbook.Application.Worksheets("Tabelle2")
    5. With tb.Buttons.Add(200, 100, 50, 20)
    6. .Caption = "Mein Button"
    7. .Font.Color = RGB(0, 0, 80)
    8. .Font.Bold = True
    9. '.OnAction = "Modul1.MeinButtonCode"
    10. End With
    11. AddHandler Bt_Click(tb), AddressOf Bt_Click 'bei Bt_Click(tb) kommt Fehler
    12. End Sub
    13. Private Sub Bt_Click(sender As Object, e As EventArgs)
    14. MsgBox("Geht")
    15. End Sub
    16. End Class


    Wenn ich es aber wie folgt mache, wird das Bt_Click Ereignis bereits ausgelöst, wenn ich Button1 drücke und nicht den gerade erstellten Button:

    VB.NET-Quellcode

    1. Public Class Tabelle2
    2. Private WithEvents Button As Button
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. Dim tb As Excel.Worksheet = Globals.ThisWorkbook.Application.Worksheets("Tabelle2")
    5. With tb.Buttons.Add(200, 100, 50, 20)
    6. .Caption = "Mein Button"
    7. .Font.Color = RGB(0, 0, 80)
    8. .Font.Bold = True
    9. '.OnAction = "Modul1.MeinButtonCode"
    10. End With
    11. Bt_Click(tb, EventArgs.Empty)
    12. End Sub
    13. Private Sub Bt_Click(sender As Object, e As EventArgs)
    14. MsgBox("Geht")
    15. End Sub
    16. End Class

    Kannst Du bitte nochmal helfen?
    Gruß Oisse

    CodeTags korrigiert ~VaporiZed

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    Neu

    Oisse schrieb:

    AddHandler Bt_Click(tb), AddressOf Bt_Click 'bei Bt_Click(tb) kommt Fehler

    Ich hasse diese With-Konstruktionen, aber das ist eher Nebensache.

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim tb As Excel.Worksheet = Globals.ThisWorkbook.Application.Worksheets("Tabelle2")
    3. Dim bt = tb.Buttons.Add(200, 100, 50, 20)
    4. bt.Caption = "Mein Button"
    5. bt.Font.Color = RGB(0, 0, 80)
    6. bt.Font.Bold = True
    7. AddHandler bt.Click(tb), AddressOf Bt_Click
    8. End Sub
    9. Private Sub Bt_Click(sender As Object, e As EventArgs)
    10. Dim Button = CType(sender,Button)
    11. MsgBox(Button.Name)
    12. End Sub
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Neu

    Vielen herzlichen Dank, dass Du Dich meines Problems annimmst.
    Leider kommt hier der Fehler:

    VB.NET-Quellcode

    1. ​AddHandler bt.Click(tb), AddressOf Bt_Click

    Ich habe es auch hiermit probiert, weil ich mir gedacht habe Du hast einen Buchstabendreher drin:

    VB.NET-Quellcode

    1. AddHandler bt.Click(bt), AddressOf Bt_Click

    Der Fehler kommt immer bei: bt.Click(bt).
    Das Click Ereignis wird von der IntelliSense auch gar nicht angeboten. Ist das nur bei mir so?
    Wenn ich im Netz so stöbere, wie Buttons zur Laufzeit erstellt werden passiert das mit:

    VB.NET-Quellcode

    1. ​Dim Btn as New Button

    Aber auch das funktioniert bei mir nicht, weil Button auch hier von der IntelliSense nicht angeboten wird.
    Muss ich denn hier was importieren?
    Oder warum geht das nicht?
    Gruß Oisse

    CodeTags korrigiert ~VaporiZed

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    Neu

    Es geht einfach nicht.

    VB.NET-Quellcode

    1. ​AddHandler bt.Click, AddressOf Bt_Click
    Es ist wieder "bt.Click", das er nicht will (Fehler: Click ist kein Ereignis von Object)
    Importiert ist:

    VB.NET-Quellcode

    1. ​Imports System.Globalization
    2. Imports Microsoft.Office.Interop.Excel
    3. Imports System.Drawing.Color

    Ist bei

    VB.NET-Quellcode

    1. ​Imports Microsoft.Office.Interop.Excel
    Windows.Forms incl.?

    CodeTags korrigiert ~VaporiZed

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    Neu

    Da fehlt der konkrete Typ. Eine Umwandlung (Casting) muss her.
    Bilder
    • MissingCast.png

      4,51 kB, 545×104, 6 mal angesehen
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    Neu

    Ich habe mir das nun alles durchgelesen und auch angeschaut, auch die entsprechenden Änderungen vorgenommen.
    Also die Vorlage für die Formulare erstellt und und in den Projekten Option Strikt On eingestellt.
    Dann kommen zwei Fehler.
    Der eine wie bei VaporiZed oben und noch ein weiterer nämlich bei: bt.Click
    Wie muss es denn jetzt korrekt heißen?
    Und wie wird denn ein Tabellenblatt richtig angesprochen? Denn soweit ich das Gelesene verstanden habe ist "CType" wohl eher eine Alternative als das Mittel der Wahl. (Hoffentlich habe ich´s richtig verstanden). Denn wenn man schon eine neue Sprache lernt, dann solls doch auch gleich von Grund auf richtig sein.
    Die Erklärungen und Videos sind übrigens klasse. Vielen Dank an die, die sich die Mühe gemacht haben.
    Gruß Oisse

    Neu

    Aber warum nimmt er nicht:

    Quellcode

    1. ​ Dim bt = tb.Buttons.Add(200, 100, 100, 20)

    Es wird bei "tb." kein Button angeboten. Auch nicht beim Dimensionieren. Hier erscheint u.a. ButtonBase.
    Wie also muss es richtig heißen?
    Allerdings ist jetzt beim Neustart der Fehler bei bt.Click weg.
    Und vielen Dank für Deine/Eure Mühe.
    Gruß Oisse