Exceltabelle mit VB durchsuchen und Wert wiedergeben

  • VB.NET

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von Mitschy.

    Exceltabelle mit VB durchsuchen und Wert wiedergeben

    Hallo Gemeinde,

    ich muss gleich sagen das ich nicht viel Ahnung von programmierung und dem Programm habe. Arbeite jetzt 2 Tage intensiv mit dem Programm.

    Ich habe folgendes Problem und find keine Lösung (ja die Suche habe ich verwendet, aber in den Threads sind Sie meist schon ein Schritt weiter als ich [denke ich]).

    Ich möchte in Excel eine Tabelle anlegen die Artikelnummer und einen (realtiven) Dateipfad enthält.

    Jetzt habe ich erstmal Versuch eine Datenbank in Visual Studio 2010 zu erstellen, aber bin nicht zufrieden mit der Handhabung (es ist zu kompilziert).

    Die Datenpflege sollte so einfach wie möglich sein. Warum ich Excel bevorzugen würde.

    Ist es Möglich mit Visual Studio 2010 auf die Daten einer Exceldatei zuzugreifen? Ich hab schon gefunden das man die Datei irgendwie über "dns" anhängen kann. Aber er findet dann die Tabelle in der xlsx nicht.


    Im Anhang ist mein Programm.

    Soweit funktioniert alles wie ich es will (bis auf Kleinigkeiten), es fehlt nur noch die Tabelle im Hintergrund die, die entsprechenden Artikelnummern und Dateipfade beinhaltet.

    Erklärung:

    Bei "Arikelnummer" soll die Artikelnummer eingegeben werden dann sucht das Programm in der Excel in Spalt A nach der Nummer und gibt die Zeilennummer (z.B. 59) zurück. Mit der Zeilennummer gegucken wir was in Spalte C Zeile 59 für eine Dateipfad steht und gibt den dann unten bei "Dateipfad" aus.

    Ich brauche wirklich dringen Hilfe!

    Viele Grüße
    Bilder
    • Image1.jpg

      49,43 kB, 960×730, 878 mal angesehen

    Mitschy schrieb:

    Bei "Arikelnummer" soll die Artikelnummer eingegeben werden dann sucht das Programm in der Excel in Spalt A nach der Nummer und gibt die Zeilennummer (z.B. 59) zurück. Mit der Zeilennummer gegucken wir was in Spalte C Zeile 59 für eine Dateipfad steht und gibt den dann unten bei "Dateipfad" aus.
    Da du keinen Code verrätst, kann ich nur mutmaßen.

    VB.NET-Quellcode

    1. DateiPfad = ExcelApp.WorkSheets(1).Columns(1).Find(ArtikelNummer).Offset(0,2).Value
    Wirft einen Fehler, falls die Artikelnummer nicht existiert, den du ggf. abfangen musst.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Hallo petaod,

    danke für die Hilfe.


    petaod schrieb:

    Da du keinen Code verrätst, kann ich nur mutmaßen.



    Da ich nicht leider überhaupt keinen Ansatz habe, habe ich auch keine Code den ich dir geben kann. Oder wie genau meinst du das?

    Du gibst mir direkt einen Code, leider verstehe ich nicht mal wie VB jetzt weiß wo meine Excel-Datei liegt (also in welchen Ordner und wie die Excel heist) bzw. wie ich meine Programm und die Excel-Datei verbinde.

    Das wäre ja der erste Schritt den ich machen muss. Bevor ich irgendwas progrmmieren kann, oder?

    Trotz alle dem, deinen Code verstehe ich so:

    Visual Basic Quellcode1 DateiPfad = ExcelApp.WorkSheets(1).Columns(1).Find(ArtikelNummer).Offset(0,2).Value

    ExcelApp -> Dateinname

    WorkSheets(1) -> erste Tabelle

    Columns(1) -> Zeile 1

    Find(ArtikelNummer) ->das ist logisch "suchen"

    Offset(0,2).Value -> hier habe ich keine Plan was mir das sagt :(



    Ich hoffe du kannst mir weiter helfen.

    Viele Grüße
    Ich hätte schon gedacht, dass du die Grundlagen schon integriert hast:
    [Sonstige/Allgemein] Allgemeiner Zugriff aus VB auf Word/Excel

    VB.NET-Quellcode

    1. Dim ExcelApp As New Excel.Application
    2. Dim WBook As New Excel.Workbook = ExcelApp.Open("c:\x.xlsx")
    3. Dim WSheet As Excel.WorkSheet = WBook.Sheets(1)
    4. DateiPfad = WSheet.Columns(1).Find(ArtikelNummer).Offset(0,2).Value

    Mitschy schrieb:

    Columns(1) -> Zeile 1
    Ich würde sagen: Spalte 1 ;)

    Mitschy schrieb:

    Offset(0,2).Value -> hier habe ich keine Plan was mir das sagt
    Zwei Spalten Offset von der gefunden Zelle.
    msdn.microsoft.com/en-us/libra…et(v=office.11).aspx#Y200
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

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

    Es funktioniert nicht

    Hallo,

    habe mich heute nochmal mit der Sache befasst. Leider ohne Erfolg!

    Ich bin mir nicht sicher was ich wo machen muss. ?(

    Verweise hab ich angelegt. Siehe Anhang1

    Auch habe ich die Daten bank mal auf der rechten Seite dem Projekt hinzugefügt (ob es nun was bringt oder nicht).

    So und ob ich nun deinen oder den Code von INOPIAE einfüge ist egal, es wird bei beiden bunt. Siehe Anhang2

    Was kann bzw. muss ich jetzt machen? Oder was mache ich falsch? Hab ich irgendwas vergessen???

    Viele Grüße
    Michael

    Edit:

    Ehrlich gesagt hab ich kein Plan was ich machen muss. ;(

    Wäre mist wenn ich das nicht hinbekomme. Weil alles andere an meinem Programm bereits funktioniert. Aber das ist eben das wichtigste, ohne den Teil war alles andere umsonst, leider.
    Bilder
    • Image1.jpg

      452,92 kB, 1.920×1.200, 900 mal angesehen
    • Image2.jpg

      405,84 kB, 1.920×1.200, 727 mal angesehen

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

    Wenn Du es noch nicht einmal schaffst, richtig zu lesen, dann wird es schwer Dir zuhelfen.

    Warum bindest Du denn den Verweis auf Access ein und nicht den Verweis auf Excel? (Bild 1)

    Bevor Du Dich mit VBA rumschlägst, verwende doch einfach die in Excel eingebaute Funktion SVerweis. Die sollte für Dich wahrscheinlich einfacher sein.
    NB. Es ist doch schön, wenn man lesbare Namen vergibt. Siehe auch [VB.NET] Beispiele für guten und schlechten Code (Stil).
    Hallo ihr beiden,

    danke nochmal für die Unterstützung.

    INOPIAE schrieb:

    Warum bindest Du denn den Verweis auf Access ein und nicht den Verweis auf Excel? (Bild 1)
    Gut war vielleicht schon zu spät gestern.

    Hab jetzt die "Excel Object Library" eingefügt dabei hat er mir de andern beiden Sachen von Microsoft automatisch mit reingehauen. Siehe Anhang1

    Eine "TypeLib" von Excel wie hier beschrieben:

    HTML-Quellcode

    1. http://www.ms-office-forum.net/forum/sitemap/index.php?t-108409.html


    finde ich nicht.
    Jetzt habe ich mal den Code von INOPIAE eingefügt mit dem vorherigen Import Befehl. Ohne dem Import sagt er mir Excel.Application nicht definiert.

    Quellcode

    1. Imports Microsoft.Office.Interop
    2. Public Class Form1
    3. Private exApp As New Excel.Application
    4. Private exDok As Excel.Workbook
    5. Private Sub ExcelDokumentÖffnen()
    6. exDok = exApp.Open("C:\Users\Mitschy\Desktop\Programm Tapeverpackung\Programm Tapeverpackung\Datenbank.xlsx")
    7. End Sub
    8. Private Sub ExcelDokumentSchließen()
    9. exDok.Close()
    10. End Sub
    11. Private Sub ExcelSchließen()
    12. exApp.Quit()
    13. exApp = Nothing
    14. End Sub


    Aber was passiert da jetzt???

    Beim Starten müsste er mir doch die entsprechende Datei öffnen oder nicht?

    Sorry, aber bin halt ein totaler Anfänger, habt ein bisschen Geduld mit mir.

    INOPIAE schrieb:



    Bevor Du Dich mit VBA rumschlägst, verwende doch einfach die in Excel eingebaute Funktion SVerweis. Die sollte für Dich wahrscheinlich einfacher sein.
    SVerweis könnte ich auch nutzen. Aber wie?
    Meine Aufgabe ist es die Artikelnr in Textbox2 auszulesen und in der Excel Spalte A zu suchen und dann den Dateipfad (der in Spalte C steht) an Textbox3 einzutragen.

    Gruß Michael
    Bilder
    • Image1.jpg

      387,36 kB, 1.920×900, 555 mal angesehen

    INOPIAE schrieb:

    Schau Dir mal den Taskmanager an. Da wirst Du Deine Excel-Sitzung finden. Du musst die Excelsitzung noch sichtbar machen.


    Stimmt ist im Taskmanager.

    Und wie mach ich das jetzt mit der Funktion?

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    2. 'Fehlermarke bei Texteingabe
    3. On Error GoTo Fehlermarke1
    4. 'Artikelnummer einlesen
    5. If TextBox2.Text > 999999999 Then
    6. ArtikelNr = TextBox2.Text
    7. 'Listbox Artikelnummer übergeben
    8. ListBox1.Items.Insert(0, ArtikelNr)
    9. Else
    10. 'Fehler ausgeben
    11. MsgBox("10-stellige Artikelnummer eingeben!", vbInformation)
    12. End If
    13. ''''''''''''''''''''''''''''''''''''''''''''Suchen in Excel-Datei nach Artikelnummer
    14. _____Hier muss die Funktion rein_____
    15. ''''Dateipfad in Textbox3 in Zwischenablage kopieren
    16. 'Zwischenablage löchen
    17. Clipboard.Clear()
    18. 'Prüfen ob ein Inhalt in Textbox3 steht
    19. If TextBox3.Text = "" Then
    20. MsgBox("Kein Dateipfad eingetragen, bitte Artikelnummer eingeben!", MsgBoxStyle.Critical)
    21. Exit Sub
    22. Else
    23. 'Inhalt von Textbox3 in Zwischenablage kopieren
    24. Clipboard.SetText(TextBox3.Text)
    25. End If
    26. Exit Sub
    27. Fehlermarke1:
    28. MsgBox("Artikelnummer eingeben!", vbExclamation)
    29. End Sub



    EDIT:

    So jetzt haut er mir diese Meldung um die Ohren. Keine Ahnung was ich machen soll. Siehe Bild
    Bilder
    • Image1.jpg

      357,5 kB, 1.597×1.138, 690 mal angesehen

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Mitschy“ () aus folgendem Grund: Code kommentiert

    Ich habs hinbekommen.

    Aber wenn der 3000 Zeilen durchsuchen muss braucht er ein bisschen Zeit.

    Habe es jetzt über eine Schleife gelöst:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    2. 'Fehlermarke bei Texteingabe
    3. On Error GoTo Fehlermarke1
    4. 'Artikelnummer einlesen
    5. If TextBox2.Text > 999999999 Then
    6. ArtikelNr = TextBox2.Text
    7. Else
    8. 'Fehler ausgeben
    9. MsgBox("10-stellige Artikelnummer eingeben!", vbInformation)
    10. Exit Sub
    11. End If
    12. 'Suchen in Excel-Datei nach Artikelnummer
    13. Dim Exceldatei As Object = CreateObject("Excel.Application")
    14. Exceldatei.application.workbooks.Open(Pfad_zur_Datenbank)
    15. Exceldatei.application.sheets(1).Select(1) REM Tabelle 1 in Datenbank.xls wird ausgewählt
    16. Dim Zeilennr As Integer
    17. 'Durchsuchen von Splate A
    18. For Zeilennr = 2 To 3001
    19. Dim SpalteA As String = Exceldatei.application.cells(Zeilennr, 1).value
    20. 'Vergleiche ArtkelNr mit Inhalt aus SplateA
    21. If ArtikelNr = SpalteA Then
    22. 'Listbox Artikelnummer übergeben
    23. ListBox1.Items.Insert(0, ArtikelNr)
    24. 'Dateipfad in Textbox3 ausgeben
    25. Dim Dateipfad As String = Exceldatei.application.cells(Zeilennr, 3).value
    26. TextBox3.Text = (Pfad_zu_Jobs)
    27. 'Exceldatei beenden
    28. Exceldatei.quit()
    29. 'Schleife verlassen
    30. Exit For
    31. End If
    32. Next
    33. 'Exceldatei beenden
    34. Exceldatei.quit()
    35. 'MsgBox wenn Artikelnummer nicht gefunden wurde
    36. If Zeilennr > 3000 Then
    37. MsgBox("Artikelnummer nicht gefunden!", vbInformation)
    38. Exit Sub
    39. End If
    40. 'Dateipfad in Textbox3 in Zwischenablage kopieren
    41. 'Zwischenablage löchen
    42. Clipboard.Clear()
    43. 'Prüfen ob ein Inhalt in Textbox3 steht
    44. If TextBox3.Text = "" Then
    45. MsgBox("Kein Dateipfad eingetragen, bitte Artikelnummer eingeben!", MsgBoxStyle.Critical)
    46. Exit Sub
    47. Else
    48. 'Inhalt von Textbox3 in Zwischenablage kopieren
    49. Clipboard.SetText(TextBox3.Text)
    50. End If
    51. Exit Sub
    52. Fehlermarke1:
    53. MsgBox("Artikelnummer eingeben!", vbExclamation)
    54. End Sub


    Geholfen hat mir dabei dieser Eintrag :
    [VB 2010] Excel-Datei einlesen
    Währe die Frage ob das nicht auch ohne Schleife geht (und vielleicht dadurch schneller ist)?

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Mitschy“ () aus folgendem Grund: Code kommentiert

    Das mit der Schleife stimmt.

    Es gibt im Excel-VBA die Funktion Worksheetfunction.Match. Schau dir diese mal an. (Im Zweifelsfall in Excel in den VBA Editor, dann F2 für den Objektbrowser und Match eingeben).

    VB.NET-Quellcode

    1. Dim lngSearch as long = ExApp.WorksheetFunction.Match([Suchwert], ExApp.ActiveSheet.Columns(1), 0)
    2. if lngSearch>0 then TextBox3.Text = ExApp.ActiveSheet.Cells(lngSearch,3)


    Kleiner Hinweis: Dokumentieren ist gut, aber Du solltest es schon einheitlich mache ' oder REM macht das Lesen einfacher.
    NB. Es ist doch schön, wenn man lesbare Namen vergibt. Siehe auch [VB.NET] Beispiele für guten und schlechten Code (Stil).
    Hallo ihr Zwei,

    INOPIAE schrieb:

    Kleiner Hinweis: Dokumentieren ist gut, aber Du solltest es schon einheitlich mache ' oder REM macht das Lesen einfacher.
    Ich war so happy, das ich das erstmal weggelassen habe. :D Habe es aber für die Nachwelt nochmal geändert. ;)


    Hab jetzt nur noch ein Problem :thumbdown:
    Habe das Programm heute auf Arbeit getestet und es geht nicht! X( Weil auf dem PC nur eine Office Starter 2010 installiert ist. Eine richtige Lizenz bekomme ich nicht auf dem Rechner.

    Also muss ich die Datenbank als CSV speichern.... Ich sag nur HILFE!
    Jetzt brauch ich die Excel Verweise rein theoretisch nicht mehr. Oder?

    Und wie lese ich die Datei jetzt aus? Ich werd mich jetzt auf die Suche machen :huh:.

    Gruß