Listbox aus Exceltabelle füllen

  • VB.NET

Es gibt 27 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Listbox aus Exceltabelle füllen

    Hallo zusammen,

    ich möchte aus einer Excel-tabelle die Daten die in der Spalte "A" stehen in eine Visual Basic listbox eintragen.
    habe schon gegoogelt aber nichts passendes gefunden. hoffe ihr könnt mir helfen.

    das Hab ich bis jetzt aber das Klappt überhaupt nicht, bin eben noch anfänger


    VB.NET-Quellcode

    1. ​Imports System.IO
    2. Imports Excel = Microsoft.Office.Interop.Excel
    3. Imports Office = Microsoft.Office.Interop
    4. Public Class UF_Schichtübersicht_Anschauen
    5. Dim Excel1 As New Microsoft.Office.Interop.Excel.Application
    6. Private Sub UF_Schichtübersicht_Anschauen_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    7. Try
    8. Excel1.Workbooks.Open("C:\Mappe1")
    9. ListBox.Show(Excel1.Range("A1").Value())
    10. Excel1.Application.Quit()
    11. Catch ex As Exception
    12. MsgBox(ex.Message)
    13. End Try
    14. End Sub



    danke schonmal

    VB.NET-Quellcode

    1. Public Class test
    2. Dim exclApp As Object
    3. Dim Datei As Object 'WorkBook - ExcelDatei
    4. Dim Blatt As Object 'WorkSheet - ExcelTabelle
    5. Private Sub test_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    6. exclApp = CreateObject("Excel.Application")
    7. Dim sSuche As String = ""
    8. With exclApp
    9. .Visible = True 'Kannst du auch auf False setzen.*
    10. Datei = .Workbooks.Open("C:\test.xlsx") 'Anpassen: Ganz klar dein Pfad
    11. Blatt = Datei.Worksheets("Tabelle1") 'Anpassen: Die Tabelle/Das Sheet auf welches du zugreifen möchtest.*
    12. For iCount = 1 To 1000
    13. sSuche = exclApp.Range("A" & iCount.ToString).Value()
    14. ListBox1.Items.Add(sSuche)
    15. 'MsgBox(sSuche)
    16. Next
    17. End With
    18. End Sub
    19. End Class



    .... kein Problem.
    Natürlich kann man diese ForEachSchleife verbessern, einmal durchlaufen und überprüfen wann die Zelle leer ist und anschließend diesen Zähler einsetzen.
    Soll ja nur demonstrieren das du es so realisieren könntest.

    Ich hoffe das ich dir damit helfen konnte :)
    wenn ja kannst du es ja als Hilfreich markieren. ;)
    Option Strict On!
    @Drahuverar Hilfreich wär es, wenn es mit Option Strich On liefe. ;)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @Phaethon
    Wie- geht nicht? Was genau passiert denn?

    @RodFromGermany
    Ah, verdammt. Dachte das hätte ich mittlerweile als Standard-Einstellung.
    Dennoch sollte es kein Problem sein, wenn er die korrekte Schnittstellenbeschreibung für das Objekt hat. Oder ist das eine falsche Aussage von mir?
    Korrigiere mich bitte, man lernt nie aus. ^^
    Option Strict On!
    es geht doch :saint: hab mich nur doof angestellt ... da bei mir erst ab A2 befüllt wird .... und der Wert in der LB darf nicht NULL sein.
    jetzt muss ich des nur noch machen das bis zur nächsten leeren zeile befüllt wird,
    und das ich durch die listbox auswahl ein textbox befülle.
    Ach so. Ja-
    Beginne leider bei der ersten Zelle in A, durch die schleife. (kann man natürlich noch besser machen)

    VB.NET-Quellcode

    1. Private Sub ListBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ListBox1.SelectedIndexChanged
    2. TextBox1.Text = ListBox1.SelectedItem.ToString
    3. End Sub


    damit kannst du den ausgewählten text selektieren..
    Was meinst du denn mit der nächsten leere Zeile?


    Und beachte den Einwand von @RodFromGermany .. Das du "Option Strict On" und "Option Explicit On" scharf schaltest.
    Option Strict On!
    ich habe das sowas schonmal in VBA gemacht.
    und so sollte es auch mal in VB funktionieren.... leider ist das ja nicht so einfach


    Quellcode

    1. ​Private Sub UserForm_Initialize()
    2. With UF_Schichtübergabe_anschauen
    3. .LB_Datum_elektrik.ColumnCount = 9
    4. .LB_Datum_elektrik.ColumnWidths = "70;0,1;0,1;40;0,1;0,1;0,1;0,1;0,1;0,1;0,1;0,1"
    5. Sheets("Elektro").Activate ' Tabellenblatt wechseln
    6. Range("A2").Select ' Spalte auswählen( bevorzugt immer Spalte A und ggf. mit Offset eine andere Spalte abfragen)
    7. i = 0 ' Zähler für die Listbox
    8. .LB_Datum_elektrik.Clear ' Listbox leeren
    9. Do Until ActiveCell.Value = "" ' Schleife bis zur ersten leeren Zelle
    10. .LB_Datum_elektrik.AddItem ActiveCell.Value ' Wert der aktiven Zelle in die Listbox übertragen
    11. .LB_Datum_elektrik.Column(1, i) = ActiveCell.Offset(0, 1).Value ' Wert der nächsten Spalte aus Excel in die nächste Spalte der Listbox eintragen
    12. .LB_Datum_elektrik.Column(2, i) = ActiveCell.Offset(0, 2).Value
    13. .LB_Datum_elektrik.Column(3, i) = ActiveCell.Offset(o, 3).Value
    14. .LB_Datum_elektrik.Column(4, i) = ActiveCell.Offset(0, 4).Value ' Wert der nächsten Spalte aus Excel in die nächste Spalte der Listbox eintragen
    15. .LB_Datum_elektrik.Column(5, i) = ActiveCell.Offset(0, 5).Value
    16. .LB_Datum_elektrik.Column(6, i) = ActiveCell.Offset(o, 6).Value
    17. .LB_Datum_elektrik.Column(7, i) = ActiveCell.Offset(0, 7).Value
    18. .LB_Datum_elektrik.Column(8, i) = ActiveCell.Offset(o, 8).Value
    19. ' .LB_Datum_elektrik.Column(9, I) = ActiveCell.Offset(o, 9).Value
    20. i = i + 1
    21. ActiveCell.Offset(1, 0).Select
    22. Loop


    Quellcode

    1. Private Sub LB_Datum_elektrik_Click()
    2. With UF_Schichtübergabe_anschauen
    3. .LA_Name_elektriker = .LB_Datum_elektrik.Column(1) ' Listbox Spalte 0 in die Textbox schreiben
    4. .TB_Schichtübergabe_Elektirk = .LB_Datum_elektrik.Column(2)
    5. .TB_Arbeit1_Elektro = .LB_Datum_elektrik.Column(4)
    6. .TB_Arbeit2_Elektro = .LB_Datum_elektrik.Column(5)
    7. .TB_Arbeit3_Elektro = .LB_Datum_elektrik.Column(6)
    8. .TB_Arbeit4_Elektro = .LB_Datum_elektrik.Column(7)
    9. .TB_Arbeit5_Elektro = .LB_Datum_elektrik.Column(8)


    es werden nur die Befüllten zeilen in die LB eigetragen, wenn ich auf denn LB-eitrag Cklicke dann wird das was rechts neben dem ausgewählten
    eintrag (in der Excelliste) steht in eine Textbox (TB) eingetragen
    nein ...
    Listbox ist mit zeillenwert "A1"-"A3" gefüllt

    in der Listbox steht z.B. der Wert von "A1" , wenn ich das dann auswähle soll in einer Textbox der wert von "B1" sehten.
    listbox Wert "A2" dann Textbox wert "B2"
    listbox Wert "A3" dann Textbox wert "B3"
    Ach so.. ^^

    Also was du machen könntest, so würde ich es zuerst versuchen (bin leider "On the Go", sonst würde ich es testen):
    Beim durchlaufen der Zellen in Spalte A kannst du dir ja zusätzlich die Werte von Spalte B zwischenspeichern.
    Ob du das jetzt in einem Array machst oder nicht ist dir überlassen. So würde ich es aber versuchen, da die ListBox ja auch auf Indizes zugreift und du einen "schönen" Zähler hast.



    ~sprich im SelectedIndexChanged - Event(, wenn du ein Array hast)
    TextBox1.Text = myArray(ListBox1.SelectedIndex)

    Müsste mal schauen ob das so "einfach" geht ^^

    EDIT:
    Wird doch wohl nicht so einfach, da du "Lücken" in deiner Excelliste hast. Aber in dieser Richtung , müsste man sich wohl bewegen.
    Option Strict On!
    Im Grunde ist es eine ziemlich gute Sache in dieser Kombination. (Visuell meine ich, in Verbindung mit Excel)
    Du kannst dir ein Array als Feld vorstellen;
    und aus mehreren Feldern kannst du eine Art Tabelle erstellen. Diese Arrays können mehrere Dimensionen haben.

    Jetzt zum fachlichen:
    Wieso gibt es Arrays?

    VB.NET-Quellcode

    1. Dim sName1 as String = "Jim Panse"
    2. Dim sName2 as String = "Brech Bohne"
    3. '...hättest du nun eine Anwendung/Software die mehrere Namen verarbeiten müsste wärst du ja ewig an dieser Arbeit beschäftigt.
    4. 'Aus diesem Grund gibt es Arrays, weil wir alle ja ziemlich faul und clever sind ^^


    Es ist im Grunde egal welche Datentypen du verarbeiten möchtest. Die Vorgehensweise ist immer die gleiche.
    Du hast eine Art Stapel den du dir erstellst und dein Array packt diese Informationen (den Stapel) zusammen und reserviert einen Speicher (je nach Datentyp Größen abweichend).
    Durch den Index erhältst du den Zugriff auf die Variablen.

    VB.NET-Quellcode

    1. 'Sprich:
    2. Dim sArray(5) as String 'Reserviere Speicher für 6 Stringvariablen (0-5)
    3. 'Einzelne Zuweisungen
    4. sArray(0) = "Jim Panse"
    5. sArray(1) = "Brech Bohne"
    6. sArray(2) = "Lee Köhr"
    7. sArray(3) = "Klara Fall"
    8. sArray(4) = "Alf Abet"
    9. sArray(5) = "Ken Stumich"
    10. 'Was du auch machen könntest:
    11. Dim sarray() As String = {"Jim Panse", "Brech Bohne", "Lee Köhr", "Klara Fall", "Alf Abet", "Ken Stumich"} 'Hier weist du deinem Array mehrere Variablen zu


    Was du also nun machen könntest wäre folgendes:
    Durchlaufen und jede Zeile in ein Array Speichern (Spalte A und Spalte B, jenachdem was du brauchst.. kenne den Aufbau deiner Excel Liste ja nicht
    und beim drauf klicken in der Listbox auf den Index der Listbox zugreifen und somit auf den Index deines Arrays.. ^^

    Gibt auch noch einen anderen Weg, der vllt. nicht so schön aber ziemlich einfach ist..
    Wieso gibt es Lücken in der Liste?

    Grüße
    Option Strict On!
    okay das hilft mir nur ein bisschen weiter , nur wie bekomme ich das was in Zeile "B" steht in die Listbox ( Brauche dann mehere spalten in der listbox : Listboxspalte1 = ExcelSpalte "A" ; listboxspalte2 = ExcelSpalte "B"

    wie muss ich das machen??

    aber das mit dem arrays ist schon mal gut danke :)
    oder gibt es eine andere Möglichkeit die Excel spalten in etwas zu speichern und per Auswahl abfragen, dachte so an listview, oder so was.
    kenn mich da überhaupt nicht aus .... weiß auch nicht recht wie ich da anfangen soll
    Was ist denn überhaupt das Ziel?
    Komplette Tabellen lassen sich recht einfach auslesen, ich würde da nicht anfangen das spaltenweise zu programmieren.
    Zudem würde ich auch die Finger vom ollen Listview lassen. Die Frage ist aber zunächst wirklich, was das Ergebnis Deiner Bemühungen sein soll.
    Es bietet sich an die Tabellen als ganzes in eine Datatable einzulesen. Hier stellt sich die nächste Frage, ändert sich der Aufbau der Tabelle beim Anwender nicht, kannst Du direkt ein typisiertes (im Designer erstelltes) Dataset / Datatable einlesen. (Der andere Weg, den ich für ein Projekt nutze ist es komplizierter und geht über Zuweisungstabellen von einem nicht typisiertes in ein typisiertes Dataset.)
    Wie auch immer, der Weg hört sich komplizierter an als es ist. Der klare Vorteil ist, dass Du alle Abfragen und Datenbindungen direkt mit dem Dataset machst. Da jetzt ein Datagridview dranzuhängen ist nur noch ein Klacks.
    Ich möchte für die Arbeit ein schichtübergabe Programm schreiben.
    In Form1 gebe ich alles ein und speichere das alles in einer excel tabelle (Spalte A soll das datum der schichtübergabe sein; Spalte B soll der name der es geschrieben hat rein; Spalte C soll die schichtübergabe stehen. )
    Das klappt auch schon soweit!
    Jetzt möchte ich das in einer anderen Form mir anzeigen lassen.
    Das Datum (excel Spalte A) soll in einer Liste stehen, wenn ich dann auf ein Datum klicke soll in einer Textbox1 der dazugehörige name(excel Spalte B) und in textbox2 die dazugehörige schichtübergabe(excel Spalte C) stehen.

    Sprich 1'es datum in der listbox = excel zelle A1
    wenn ich das 1. Datum auswähle soll in der Textbox1 (name) der Inhalt von Excel zelle B1,
    In textbox2 (schichtübergabe)der Inhalt von excel zelle C1 stehen .

    Wenn ich dann eine neu schichtübergabe anlege werden die daten in die nächste zeile geschrieben ( datum dann A2.....usw....)

    Hoffe ich habe es verständlich erklärt !
    Ich würde dafür DataBinding verwenden. Damit befüllst du ein Dataset mit deinen Tabellenspalten und deine Steuerelemente holen sich dann die Daten. Wenn du einen anderen Eintrag in der Listbox auswählst, wird automatisch die Textbox mit der dazugehörigen Spalte B befüllt.

    Der ErfinderDesRades hat dazu ein Tut hier im Forum. (die vier Views auf Video)
    Von hinten durch die Brust ins Auge ........

    @HamburgerJungeJr hat es nun (auch) schon geschrieben, es gibt vom @ErfinderDesRades dazu hervorragende Tutorials.
    Lese die Tut's, schaue Dir die Beispielprojekte an und plane dann das Design für Deine Anwendung mit Datasets und den benötigten Tabellen. Dann entwickle das in einem neuen Projekt und vergess erst einmal Deine Excel-Tabelle.
    Alles was Du brauchst kann man sich im Designer zusammenklicken ohne eine Zeile code zu schreiben. Erst zum Speichern und Laden der Daten (auch alles in den Tutorials) benötigst Du etwas Code.
    Ganz zum Schluß wenn es denn so sein soll, kannst Du einen Excel-Export machen. Draus zurückzulesen brauchst Du nichts.