Daten aus Combobox und Textbox per Button1.Click in ExcelDatenBlatt übergeben

  • VB.NET

Es gibt 23 Antworten in diesem Thema. Der letzte Beitrag () ist von tulla.

    Daten aus Combobox und Textbox per Button1.Click in ExcelDatenBlatt übergeben

    Hallo zusammen,

    ich habe von VB ehrlich gesagt nicht all zu viel Ahnung und brauche deshalb eure Hilfe. :S

    Hier mal mein Problem:

    Ich habe ein kleines Prog. erstellt, das zumindest mit Button.Click (Übertragen) eine vorhandene Exceldatei öffnet. Hier mal ein Screenshot.



    Mein Problem ist, dass ich den Formular-Eintrag nicht in die Exceldatei übertragen bekomme. In Excel selbst mit VBA geht das ohne Probleme.

    Mein Ziel ist es, dass dieses kleine Prog. Excel öffnet die nächste freie Zeile findet, die drei Einträge erledigt und anschließend Excel sofort wieder schließt.


    Hier mal mein Quelltext.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    3. Dim Projekt As New Object
    4. Projekt = CreateObject("excel.application")
    5. Projekt.Application.Workbooks.Open("c:\Exceldatei.xlsx")
    6. Projekt.Visible = True
    7. Dim ErsteFreieZeile As Integer
    8. ErsteFreieZeile = Sheets("Liste_Klass").Range("A65536").End(xlUp).Offset(1, 0).Row 'Nächste freie Zeile finden
    9. Sheets("Liste_Klass").Cells(ErsteFreieZeile, 1) = ComboBox1.Text
    10. Sheets("Liste_Klass").Cells(ErsteFreieZeile, 2) = ComboBox2.Text
    11. Sheets("Liste_Klass").Cells(ErsteFreieZeile, 3) = TextBox1.Text 'Einträge aus Form übergeben
    12. 'Und hier sollte noch die Anweisung das Excel geschlossen wird.
    13. End Sub
    14. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    15. If MsgBox("Programm wirklich beenden?", MsgBoxStyle.YesNo, Me.Text) = MsgBoxResult.No Then
    16. Exit Sub
    17. End If
    18. Me.Close()
    19. End Sub
    20. End Class




    Wäre euch dankbar,wenn Ihr mir hier weiterhelfen könntet. Danke im Voraus.

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

    Prüf doch mal mit dem DEbug was bei "ErsteFreieZeile" drin steht.

    VB.NET-Quellcode

    1. ErsteFreieZeile = Sheets("Liste_Klass").Range("A65536").End(xlUp).Offset(1, 0).Row 'Nächste freie Zeile finden
    2. Sheets("Liste_Klass").Cells(ErsteFreieZeile, 1) = ComboBox1.Text



    bekommst eine Fehlermeldung?

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

    Hi,

    ja - bekomm folgende Fehlermeldung.

    Warnung 1 Für folgende Komponenten, auf die verwiesen wird, sind aktualisierte benutzerdefinierte Wrapper verfügbar: Excel.

    Fehler 1 "Sheets" ist ein Typ und kann nicht als Ausdruck verwendet werden.

    Fehler 2 "xlUp" wurde nicht deklariert. Auf das Objekt kann aufgrund seiner Schutzstufe möglicherweise nicht zugegriffen werden.
    Du sollte's auch mal das importieren.

    VB.NET-Quellcode

    1. Imports Microsoft.Office.Interop
    2. Imports Microsoft.Office.Interop.excel
    3. Imports Microsoft.Office.Core

    Dies sollte vor der klasse eingetragen werden.

    Dann schreibst du Sheets....... Und willst was Abfragen.
    Aber vb weis garnicht wo.
    Vor deinem Sheets sollte dein Objekt, also sprich die application die du deklariert hast stehen, damit vb weiß wo er was eintragen soll.

    Bei dem reinen Befehl Sheets.... Sucht er in der form1 nach etwas was Sheets heißen soll.
    OK - das mit dem Imports (Verweis hinzufügen) habe ich gerafft.

    Leider hackt es noch mit dem Objekt.

    VB.NET-Quellcode

    1. ErsteFreieZeile = Projekt.Sheets("Liste_Klass").Range("A65536").End(xlUp).Offset(1, 0).Row


    Einfach nur ein "Projekt" vorsetzen reicht nicht aus, oder? Ich glaub jetzt wirds für mich peinlich. :S
    Hast Du eventuell ein Beispiel für mich?
    @ tulla: Naja - ist nicht wirklich das gleiche Thema.

    Habe aber einen Ansatz der jetzt die Excel Tabelle findet und Zellen befüllt.
    Mein Problem nun:

    Wie funktionert es, dass die nächste Zeile befüllt wird und nicht die Daten überschrieben werden? Habt Ihr eine Idee für mich?

    VB.NET-Quellcode

    1. Dim Excel As Object
    2. Dim Book As Object
    3. Dim sheet As Object
    4. Excel = CreateObject("excel.application")
    5. Excel.Application.Workbooks.Open("c:\Exceldatei.xlsx")
    6. Excel.Visible = True
    7. Book = Excel.Workbooks.Add
    8. sheet = Book.Worksheets(1)
    9. sheet.Range("A1").Value = ComboBox1.Text
    10. sheet.Range("B1").Value = ComboBox2.Text
    11. sheet.Range("C1").Value = TextBox1.Text
    Am schnellsten geht es immer noch, wenn man sich die Zeile bei der Eintragung merkt.
    Man definiert einfach eine Zelle (ev. verborgen) im Tabellenblatt, die 'letzteZeile' heist
    und gibt ihr einen Startwert der 1. Zeile und sie darf nicht im Eintragungsbereich liegen.
    Bei den Eintragungen dann immer folgenden Code verwenden:
    Worksheets("TABELLENNAME").Cells(Worksheets("TABELLENNAME").Range("letzteZeile").Value + 1, 1).Select
    ActiveCell.Value = DeinWert
    Worksheets("TABELLENNAME").Range("letzteZeile").Value = ActiveCell.Row

    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „VB1963“ ()

    Jo eine Art Blindtabelle die als Source dient.
    Stehe ich nicht so drauf, da da nur einer auf die Idee kommen braucht, mal ne Tabelle umzubenennen oder in der versteckten Tabelle rum zuspielen.
    Oder es werden Datensätzen(Zeilen) einfach gelöscht, da sie über sind!

    Möglich sind natürlich beide Versionen jede hat Vor- und Nachteile.
    Hallo tulla und VB1963,

    erstmal danke für Eure Mühe. Ich habs gleich mal ausprobiert - leider ohne Erfolg. Hier mal mein kompletter Code, damit Ihr euch mal ein Überblich verschaffen könnt. Die Fehler habe ich im Code kommentiert.


    VB.NET-Quellcode

    1. Imports Microsoft.Office.Interop
    2. Imports Microsoft.Office.Interop.Excel
    3. Imports Microsoft.Office.Core
    4. Public Class Form1
    5. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    6. Dim ExcelDateiName As String = "C:\Klassifizierung.xlsx"
    7. Dim ExcelTabelleName As String = "List_Klass"
    8. Dim xls_Appl As Excel.Application
    9. Dim xls_Mappe As Excel.Workbook
    10. Dim xls_Blatt As Excel.Worksheet
    11. xls_Appl = New Excel.Application
    12. xls_Appl.Visible = True
    13. xls_Mappe = xls_Appl.Workbooks.Open(ExcelDateiName)
    14. xls_Blatt = xls_Mappe.Worksheets(ExcelTabelleName)
    15. xls_Blatt.Activate()
    16. 'Letze Zeile finden
    17. For zeile = 0 To 2000
    18. If xls_Mappe.Worksheets("List_Klass").Cells(zeile, 1).Value = "" Then DasIstDieLeereZeile = zeile : Exit For 'DasIstDieLeereZeile wurde nicht deklariert
    19. 'Außerdem kommt folgende Fehlermeldung: COMException wurde nicht behandelt - "Ausnahme von HRESULT: 0x800A03EC"
    20. Next zeile
    21. xls_Blatt.Range("A1").Value = TextBox1.Text
    22. TextBox1.Text = ""
    23. xls_Mappe.Save()
    24. xls_Appl.Quit()
    25. End Sub
    26. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    27. If MsgBox("Programm wirklich beenden?", MsgBoxStyle.YesNo, Me.Text) = MsgBoxResult.No Then
    28. Exit Sub
    29. End If
    30. Me.Close()
    31. End Sub
    32. End Class

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „sterat“ ()

    Wo hast du DasIstDieLeereZeile deklariert :?:
    Du beginnst mit zeile = 0 und das mag Excel nicht siehe diesen Thread

    Dim DasIstDieLeereZeile As Integer
    For zeile = 1 To 2000
    If xls_Blatt.Cells(zeile, 1).Value = "" Then DasIstDieLeereZeile = zeile : Exit For
    Next zeile

    und was willst du dann mit DasIstDieLeereZeile machen :?:
    schau nochmals meinen obigen Vorschlag in Post#14 an (habe ihn nochmals verbessert)...

    VB1963 schrieb:

    Am schnellsten geht es immer noch, wenn man sich die Zeile bei der Eintragung merkt.
    Man definiert einfach eine Zelle (ev. verborgen) im Tabellenblatt, die 'letzteZeile' heist
    und gibt ihr einen Startwert der 1. Zeile und sie darf nicht im Eintragungsbereich liegen.
    Bei den Eintragungen dann immer folgenden Code verwenden:
    Worksheets("TABELLENNAME").Cells(Worksheets("TABELLENNAME").Range("letzteZeile").Value + 1, 1).Select
    ActiveCell.Value = DeinWert
    Worksheets("TABELLENNAME").Range("letzteZeile").Value = ActiveCell.Row


    Auch eine Lösung, aber an welcher stelle deklarierst du "letzteZeile" und wo schreibst denn das jetzt hin?
    Hi VB1963,

    ok - hier mal Dein Vorschlag, wie ich ihn verstanden habe.

    In Excel über Namenfeld die Zelle 1001 als letzteZeile definieren.

    Dann Deinen Vorschlag entsprechend angleichen:

    Worksheets("List_Klass").Cells(Worksheets("List_Klass").Range("letzteZeile").Value + 1, 1).Select
    ActiveCell.Value = 1001
    Worksheets("List_Klass").Range("letzteZeile").Value = ActiveCell.Row

    Wenn ich das mache, dann meldet Debug ActivCell ist nicht deklariert - ??
    Und, wie bringe ich den Wert aus TextBox1 in leere Zelle? xls_Blatt.Range.Value = TextBox1.Text --> So gehts jedenfalls nicht. :(


    @ tulla:

    Dim DasIstDieLeereZeile As Integer
    For zeile = 1 To 2000
    If xls_Blatt.Cells(zeile, 1).Value = "" Then DasIstDieLeereZeile = zeile : Exit For
    Next zeile

    Wie übergebe ich in diesem Fall die Daten aus Textbox1? DasIstDieLeereZeile = Textbox1 --> So gehts nicht

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