Excel Datei durchsuchen und bei Verändertem Layertext wiedergeben

  • VB.NET

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

    Excel Datei durchsuchen und bei Verändertem Layertext wiedergeben

    Einen wunderschönen guten Morgen :)

    Ich bin (relativ) neu hier, und schon eine Weile ein stummer mitleser, dem in diesem Forum bisher meistens echt ganz toll geholfen wurde. Nun aber habe ich Problem mit einem Software Projekt, zu dem ich leider keinen genaueren Anhaltspunkt gefunden habe, deswegen mal ganz flott registriert und mitgepostet *lach*.



    Ich hoffe ihr könnt mir bei folgendem Problem helfen:



    Ich habe mit VB2010 ein Programm geschrieben, dass mir innerhalb meiner Firma dem Umgang mit (tausenden) von Excel Files erleichtern soll.

    Innerhalb meines Programms habe ich geschätzte 200 Buttons in meiner Hauptform, die mir verschiedene Daten auswerfen sollen.

    Nun zu meinem Problem:

    Ich habe eine Art "Hauptfile" im Excel Format, das ich bereits mit Buttons aktiv auslesen kann. Dazu habe ich Excel importiert und meinem Programm beigebracht, mit Excel eine Tabélle auszulesen. Dieses ist passiert mit:


    Quellcode

    1. Option Explicit On
    2. 'Option Strict OnImports Microsoft.Office.Interop


    Nun habe ich auf jeden button meinen Code gelegt, der mir mein File auslesen kann.

    Wenn ich nun auf Button 1 drücke, liest es das entsprechende File aus, gibt mir in einem Layer1.text eine Nummer an. Dieses passiert also wenn ich in Button 1 folgenden Code einfüge.

    Quellcode

    1. Dim xlApp As Object = CreateObject("Excel.Application")
    2. xlApp.Visible = FalseDim xlWB As Object = xlApp.Workbooks.Open("Pfad meiner Datei")
    3. Dim xlWS As Object = xlWB.Worksheets("Arbeitsblatt meiner Datei")
    4. Layer1.Text = xlWS.Range("D4").text 'Hier erscheint also meine Partnummer als Text im Layer
    5. xlApp.quit()

    Nun möchte ich eine Textbox mit besonderen Infos füllen. Dazu möchte ich ein zweites Excel File auslesen, was mir soweit klar ist (DIM Befehl -> Pfad, Blatt etc.)

    Aber: Wie? Ich möchte das er mit der Nummer im Layer1.text nun mein zweites Excel File durchsucht und mir in der betreffenden Zeile, in der er die Nummer findet, drei oder vier Spalten nach rechts geht und mir den dort aufgelisteten Wert in meine textbox1 schreibt.
    Mein Gedankengang war nun, auf den Layer eine Funktion zu legen. Hier aber keine "Click-Funktion" anzugeben, sondern eher eine "Change-Funktion". Also wäre mein nächster Schritt:

    Quellcode

    1. Private Sub Layer1_TextChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles Layer1.TextChanged
    2. End Sub

    Und nun? Wie erkläre ich dem lieben VB dass er mein Excel File in Spalte "b" auf die Nummer aus Layer1 durchsuchen soll, und mir den Wert exakt drei Spalten versetzt in eine Textbox packen soll?



    Ich entschuldige mich direkt für sooo viel Text aber ich komm da um's Mäusemelken nicht weiter und hoffe dass Ihr mir helfen könnt :)

    Und verbleibe daher schonmal freundlich:

    Mit nem schönen Tag ;)

    Koopa

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

    was du suchst ist denke ne Rekursion und kein Handles Layer1.TextChanged - handle ==> die könnte hier in etwa so aussehen:

    VB.NET-Quellcode

    1. private sub testedaten
    2. while layer1.text <> ""
    3. layer1.text = leseexelfile(layer1.text)
    4. end while
    5. end sub
    6. private function leseexelfile(byval layertext as String) as string
    7. dim meinrückgabestring as String = ""
    8. .... dein Excel ausleseSpaß
    9. meinrückgabestring = (der Teil der in der Excel gefunden wird) --> üblicherweise etwa so: wsheet.Cells(x, y).value().ToString
    10. return meinrückgabestring
    11. end function



    wenn du nen bissl mitdenkst, kannste layer1 hier auch herauskürzen ;)
    => um die Funktion nicht 200 mal neu schreiben zu müssen, kannst du beispielsweise der Funktion auch noch andere Übergabewerte mitgeben, wie zb Positionen etc.
    Hallo und danke dir für die schnelle Antwort :)
    Ich glaub ich bin mit meinem Verstehen auf dem richtigen Weg, habe aber noch zwei drei Fragen um mich abzusichern *gg*



    Visual Basic Quellcode
    1 2 3 4 5 6 7 8 9 10 11 12 13 14
    private sub testedaten while layer1.text <> "" layer1.text = leseexelfile(layer1.text) end while end sub private function leseexelfile(byval layertext as String) as string dim meinrückgabestring as String = "" .... dein Excel ausleseSpaß meinrückgabestring = (der Teil der in der Excel gefunden wird) --> üblicherweise etwa so: wsheet.Cells(x, y).value().ToString return meinrückgabestring end function


    Das würde ja bedeuten, dass Leseexelfile meine Auslese Funktion ist. Und das die private Function "Leseexelfile" demnach ja auf meine Text
    box bezogen wäre, richtig?

    Anschliessend setzt du den Layer1.text als String fest und lässt danach suchen. Soweit habe ich (hoffentlich nicht falsch) verstanden. Aber die Frage ist wie ich genau das Excelfile durchsuchen kann. wsheet.cells (x,y) gibt ja eine genaue Zelle an oder ist das die Position VON meiner Nummer aus?
    Aufruf der Funktion sieht in etwa so aus:

    VB.NET-Quellcode

    1. private sub leseexcel()
    2. Dim Exceldatei As Object = CreateObject("Excel.Application")
    3. Dim path = "c:\deineexcel.xls"
    4. Dim wb = Exceldatei.application.workbooks.Open(path)
    5. 'ja den Datentyp findet es bei mir nicht, daher übrgeb ich es als Object ==> das ist falsch!
    6. Dim sheetindex as Integer = 0
    7. For Each xlsDatei In wb.Worksheets
    8. if import_Excel_einzelnes_sheet(wb,sheetindex) = true then
    9. MessageBox .Show ("Import in Ordnung")
    10. else
    11. MessageBox .Show ("Import Fehler" & vbcrlf & "Seite: " & sheetindex)
    12. end if
    13. sheetindex +=1
    14. next
    15. wb.close(savechanges:=False)
    16. end sub

    ===== Achtung workbook as object ist eigentlich Murks!! ====== (workbook ist deine Excel Datei)
    ===== Ich hab hier nur das Excel workbook net gefunden! ====


    VB.NET-Quellcode

    1. Private Function import_Excel_einzelnes_sheet(ByVal workbook As Object, ByVal SheetIndex As Integer) As Boolean
    2. try
    3. Dim ws = workbook .Sheets(SheetIndex)
    4. MessageBox .Show (ws.name & " wird durchsucht!")
    5. For x = 0 To ws.UsedRange.Rows.Count
    6. For i = 0 To ws.UsedRange.Columns.Count
    7. 'ließt das komplette Sheet aus ==> das Sheet ist die Tabelle in einem Exel File --> jedes Excel FIle kann mehrere Tabellen haben
    8. MessageBox .Show (ws.Cells(x, i).value().toString)
    9. ' hier kannst du jetzt beispielsweise auch sowas machen:
    10. if ws.Cells(x, i).value().toString ="AchtungabdemWortistmeinwichtigerwertdaneben_oder_woanders:" then
    11. Dim meinwichtigerwert = ws.Cells(x+1, i+4).value().toString
    12. end if
    13. next
    14. next
    15. return true
    16. catch exmess as exception
    17. MessageBox .Show (exmess .message)
    18. return false
    19. end try
    20. end function


    du kannst natürlich der Funktion import_Excel_einzelnes_sheet auch noch werte übergeben und damit statt X+ (1) auch x+n etc machen
    --> wenn du jetzt aus dem Konstrukt was rekursives machst, solltest du deine Lösung haben :)
    --> wenn du bei der Funktion statt Boolean nen String zurückgibst ist das auch nicht falsch und es ist auch net verboten den Rückgabewert der Funktion mit einer while Schleife zu testen, um die Funktion dann wieder aufzurufen wenn die while Bedingung nicht erfüllt ist
    --> als Pseudo fehlt hier noch das rekursive auslesen des Ordners, wo sich deine Excel Files befinden und den path dann halt immer änderst (ist nen leichtes)

    Koopa schrieb:

    Dim xlApp As Object = CreateObject("Excel.Application")
    Ist nicht Option Strict On-fähig (wegen Late Binding).
    In diesem Fall Dim xlApp as New Excel.Application verwenden.
    Dazu natürlich die entsprechende DLL in die Verweise einbinden.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --