Wert aus Excel in Textbox übernehmen

  • VB.NET

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

    Du deklarierst Excel als Objekt. Dem kannst du alles mögliche zuweisen, was eher schlecht ist. Schau dir mal den Post#2 von Flofuchs an. Hier wird mit Dim Bimbam as New Excel.Application eine ordentliche Instanz erzeugt.Des gleichen mit der Datei und dem Tabellenblatt. Schmeiß CreateObject bei dir raus.

    Fiel Fergnügen

    Vatter
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:
    Das ist mein Code bisher, an dem werd ich jetzt weiter herumdoktern bis ich mein Ziel erreicht habe :) Für weitere Verbesserungsvorschläge bin ich offen und lernwilig :)

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports Microsoft.Office.Interop
    3. Imports Microsoft.Office.Interop.Excel
    4. Imports System.Reflection.Assembly
    5. Public Class Form1
    6. Private Sub btn_Einlesen_Click(sender As Object, e As EventArgs) Handles btn_Einlesen.Click
    7. Dim ExcelPfad As String = "C:\VBProgpool\"
    8. Dim ExcelDateiName As String = Path.Combine(ExcelPfad, "Datenquelle.xlsx")
    9. Dim ExcelTabelleName As String = "Tabelle1"
    10. Dim xlsAppl As Excel.Application
    11. Dim xlsMappe As Excel.Workbook
    12. Dim xlsBlatt As Excel.Worksheet
    13. xlsAppl = New Excel.Application
    14. xlsAppl.Visible = False
    15. xlsMappe = xlsAppl.Workbooks.Open(ExcelDateiName)
    16. xlsBlatt = CType(xlsMappe.Worksheets(ExcelTabelleName), Worksheet)
    17. lbl_Ziel.Text = CStr(xlsBlatt.Range("A1").Value)
    18. xlsAppl.Quit()
    19. End Sub
    20. End Class
    Eine Pizza auf einer Pizza sind 2 Pizzen

    Eine Lasagne auf einer Lasagne ergibt 1 große Lasagne
    Mahlzeit zusammen,

    ich sitze nun an einem anderen Problem. Und zwar bin ich vom Label zur Textbox umgestiegen. Ich würde gerne den Inhalt von A1 in der ersten Zeile der Textbox, Inhalt von A2 in die 2. Zeile und A3 in Zeile 3 ausgeben.
    Durch viel Googlen stieß ich irgendwann auf den Befehl "vbcrlf" und mein Code sieht inzwischen so aus:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Imports System.IO
    2. Imports Microsoft.Office.Interop
    3. Imports Microsoft.Office.Interop.Excel
    4. Imports System.Reflection.Assembly
    5. Public Class XL_Rdr
    6. Private Sub btn_Einlesen_Click(sender As Object, e As EventArgs) Handles btn_Einlesen.Click
    7. 'Variablendeklaration
    8. Dim ExcelPfad As String = "C:\VBProgpool\" 'Dateipfad
    9. Dim ExcelDateiName As String = Path.Combine(ExcelPfad, "Datenquelle.xlsx") 'Dateiname
    10. Dim ExcelTabelleName As String = "Tabelle1" 'Tabellenname
    11. Dim xlsAppl As Excel.Application 'xlsAppl als Anwendung behandeln
    12. Dim xlsMappe As Excel.Workbook 'Workbook
    13. Dim xlsBlatt As Excel.Worksheet 'Worksheet
    14. xlsAppl = New Excel.Application 'xlsAppl als Excel Anwendung starten
    15. xlsAppl.Visible = False 'Excel unsichtbar öffnen
    16. xlsMappe = xlsAppl.Workbooks.Open(ExcelDateiName) 'Öffnen der Excel Tabelle
    17. xlsBlatt = CType(xlsMappe.Worksheets(ExcelTabelleName), Worksheet) 'Name des Arbeitsblattes
    18. tb_column_A.Text = CStr(xlsBlatt.Range("A1").Value) & vbCrLf 'Ausgabe in Textbox Zeile 1
    19. tb_column_A.Text = CStr(xlsBlatt.Range("A2").Value) & vbCrLf 'Ausgabe in Textbox Zeile 2
    20. tb_column_A.Text = CStr(xlsBlatt.Range("A3").Value) & vbCrLf 'Ausgabe in Textbox Zeile 3
    21. xlsAppl.Quit() 'Gestartete Excel Anwendung wieder schließen
    22. End Sub
    23. End Class


    Wenn ich das so starte gibt er mir, vermute ich jedenfalls, alle 3 Werte nacheinander in der 1. Zeile aus, wobei der aktuellste zuletzt stehen bleibt. Also steht am Ende "Zelle.A3" in der Textbox. Wie gesagt, Google wurde bereits konsultiert, aber der Erfolg blieb aus...
    Kann mir jemand von euch sagen, wieso die Zeile nicht gewechselt wird? (Multiline = True)
    Eine Pizza auf einer Pizza sind 2 Pizzen

    Eine Lasagne auf einer Lasagne ergibt 1 große Lasagne
    Lass mich raten:

    VB.NET-Quellcode

    1. tb_column_A.Text = CStr(xlsBlatt.Range("A1").Value) & vbCrLf 'Ausgabe in Textbox Zeile 1
    2. tb_column_A.Text = CStr(xlsBlatt.Range("A2").Value) & vbCrLf 'Ausgabe in Textbox Zeile 2
    3. tb_column_A.Text = CStr(xlsBlatt.Range("A3").Value) & vbCrLf 'Ausgabe in Textbox Zeile 3


    er zeigt dir nur xlsBlatt.Range("A3").Value an.

    möglich wäre hier:

    VB.NET-Quellcode

    1. tb_column_A.Text = CStr(xlsBlatt.Range("A1").Value) & vbCrLf 'Ausgabe in Textbox Zeile 1
    2. tb_column_A.Text = tb_column_A.Text & CStr(xlsBlatt.Range("A2").Value) & vbCrLf 'Ausgabe in Textbox Zeile 2
    3. tb_column_A.Text = tb_column_A.Text & CStr(xlsBlatt.Range("A3").Value) & vbCrLf 'Ausgabe in Textbox Zeile 3
    Genau, er zeigte mir den Inhalt der 3. Zelle an --> "Zelle.A3"
    Dein Vorschlag hat geholfen, aber ich verstehe nicht, wieso es jetzt klappt... Kannst du das evtl. kurz erklären für mich? ?(

    Aber auf jeden Fall erstmal Danke! :)
    Eine Pizza auf einer Pizza sind 2 Pizzen

    Eine Lasagne auf einer Lasagne ergibt 1 große Lasagne
    Du hast einen Datensatz aus Zelle.A3 zBsp. ERSTERDATENSATZ

    Dann sagst du dem Textfeld tb_column_A.Text er soll den Inhalt aus Zelle.A3 übernehmen und einen Zeilumbruch vbCrLf dahinter legen.
    In der zweiten Zeile machst genau das gleich nur mit der nächsten Zelle.
    wobei die Zeile tb_column_A.Text = XYZ immer bedeutet, dass der vorherige Inhalt der tb_column_A.Text mit dem
    jetzt zugewiesen Inhalt ersetzt wird.
    Ausser du machst es halt so, dass er sich selber und den zusätzlichen Inhalt übernimmt.

    VB.NET-Quellcode

    1. tb_column_A.Text = tb_column_A.Text & CStr(xlsBlatt.Range("A2").Value) & vbCrLf 'Ausgabe in Textbox Zeile 2

    Einfach ausgedrückt, er zeigt auf sich selbst addiert den neuen Inhalt hinzu und speichert dies als Gesamt neu.
    die Textbox.Text - Property kann nur einen Wert entgegennehmen, nämlich einen String.
    Du hast ihm 3 Strings hintereinander zugewiesen - logisch, dass am Ende nur der letzte String drinnesteht, denn es kann halt nur ein String aufgenommen werden.
    Jede erneute Zuweisung überschreibt, was vorher drinnestand.

    Übrigens, um Text einer Textbox anzuhängen gibts die praktische Methode Textbox.AppendText()
    Danke für die Erklärung @tulla :) Ich habs verstanden, habe mich aber trotzdem für die Methode mit dem AppendText() entschieden :)
    Jetzt werde ich versuchen nicht alle Zellen einzeln, sondern die ganze Spalte auszugeben. Mal sehen wie weit ich alleine komme bevor ich hier wieder frage :thumbup:
    Eine Pizza auf einer Pizza sind 2 Pizzen

    Eine Lasagne auf einer Lasagne ergibt 1 große Lasagne
    Hätte ich auch gemacht, warum umständlich wenn es einfacher geht. :D Siehst ja man lernt nie aus!

    Hier ein Lösungsvorschlag für das auslesen aller 3 Spalten:

    VB.NET-Quellcode

    1. for i = 1 to 3
    2. tb_column_A.AppendText(CStr(xlsBlatt.cells(i,1).Value) & vbCrLf) ' Range wurde durch Cells ersetzt, da kannst die Spalten und Zeilen mit Zahlen ansprechen, was manchmal einfacher ist. cells(Zeile,Spalte)
    3. next i

    Habe es nicht getestet, kann sein, dass du kein vbCrLf mehr brauchst, wenn es das AppendText von allein macht.
    Guten Morgen,

    @tulla: kann es sein, dass du alle 3 Zeilen meinst? ^^ Du redest erst von 3 Spalten und dann von 3 Zeilen, wobei Zeilen mehr Sinn macht :)

    Ich werde versuchen mit deinem Lösungsvorschlag voran zu kommen. Das Auslesen der Spalte A mit einer Übergabe der Werte ist mein Zwischenziel.
    Im Endeffekt will ich erreichen, dass die Werte aus Spalte A die neuen Dateinamen einer bestimmten Liste sind. Sobald also in der Excel Tabelle Werte geändert wurden, soll das Programm dies erkennen und die entsprechenden Dateien umbennenen. Ich denke hierbei an einer Kopie der Tabelle zum Namensvergleich, damit man erkennen kann, wie die Datei vorher hieß. Aber das kommt erst später dran, erstmal soll die Ein- und Ausgabe funktionieren.
    Eine Pizza auf einer Pizza sind 2 Pizzen

    Eine Lasagne auf einer Lasagne ergibt 1 große Lasagne
    Jo meinte Zeilen.
    Cells(Zeile,Spalte) in der Next Schleife wird die Zeile geändert. Cells(i,1)

    Die Frage ist, wie du das auswerten willst. Soll an die gleiche Stelle alse Zeile und Spalte der Dateiname geändert werden?
    Oder willst in einem anderen Bereich die neuen Dateinamen eingeben und diese dann mit der 1. Liste vergleichen?
    Ein Vergleich ist mit einem Button möglich, falls du die Reihenfolge der Dateien änderst, in dem du Source und New Zeilen weise vergleichst.
    Ich zeige mal ein Beispiel:

    In Zelle A1 steht Deckel.101
    In A2 steht Boden.34
    A3: Wand.44


    Dazu gibt es Dateien, die eben die Inhalte der jeweiligen Zelle als Namen haben. Also es gibt Deckel.101.Dateiendung1, Deckel.101.Dateiendung2 und Deckel.101.Dateiendung3. Das Gleiche mit Boden und Wand.

    Wenn nun in der Excel Tabelle "Deckel.101" durch "Deckel.A1" ersetzt wird, dann sollen die 3 Dateien ebenfalls umbenannt werden.
    Sinn des Ganzen ist einfach nur die Kompensation von Faulheit :D Ich habe einfach nicht jedes Mal Lust die entsprechenden Dateien per Hand zu suchen und umzubennen. Nebenbei ist dies eine gute Programmierübung :)

    Ich dachte da als Lösungsweg daran die Tabelle jedes mal zu Kopieren. Wenn dann Datensätze geändert wurden, soll mit der Kopie verglichen werden, wie die Namen vorher waren. Die Dateien werden dann umbenannt und es wird eine neue Kopie angefertigt, um den neuen Stand der Namen gesichert zu haben.
    Eine Pizza auf einer Pizza sind 2 Pizzen

    Eine Lasagne auf einer Lasagne ergibt 1 große Lasagne
    Nein, wir entwickeln und entwerfen individuelle Maschinen und eben halt auch die Bauteile dazu. Wenn wir dann mal eine Maschine in Serie bauen, dann brauchen wir eine Bauteilliste :) Nur ist der erste Name, den ein Bauteil anfangs bekommt, nicht der Entgültige. Erst beim Einpflegen in diese Excel Liste (zusammen mit Informationen über die zugehörige Maschine) wird ein Name festgelegt. Dann gilt es halt noch die Dateien umzubennen.

    Das Programm wird nicht kommerziell benutzt oder vertrieben, es soll lediglich eine Übung für mich sein und eine geringe Arbeitserleichterung werden :)
    Eine Pizza auf einer Pizza sind 2 Pizzen

    Eine Lasagne auf einer Lasagne ergibt 1 große Lasagne
    Um Schreibfehler zu vermeiden, ist es ja möglich ein Form zu machen in der du den Kopiervorgang mit Namesänderung machst.
    1. Combobox (mit der Dateiliste) ' Sofern der Entwickler Ordner immer der Gleiche ist.
    2. Textbox für Eigenschaften oder Beschreibung der Datei 'Die hast du eventuell neben dem Dateinamen in der Tabelle stehen
    2. Textfeld(Für den neuen Dateinamen).
    3. Button zum Speichern ' sofern der Ziehlordner immer der Gleiche ist.