In Excel Zeile bestimmen und ausgeben

  • VB.NET

Es gibt 16 Antworten in diesem Thema. Der letzte Beitrag () ist von HenryV.

    In Excel Zeile bestimmen und ausgeben

    Hallo zusammen,

    ich schreibe gerade investigativ ein Tool für unsere Abteilung. Mir fehlt noch eine Funktion, an der ich mir gerade die Zähne ausbeiße.

    Ich möchte, das eine Kundennummer aus einer TextBox mit einer bestehenden Excel Tabelle abgeglichen wird. Pro Kunde (Kundennummer) wird eine neue Zeile angelegt. Die Liste ist bereits 12 Duzend Zeilen lang.
    In Spalte G stehen die Kundennummern untereinander.

    Ich möchte nun das, das das Tool auf Knopfdruck die eingegebene Kundennummer Zeile für Zeile absucht, und mir die übereinstimmende Zeile in eine Variable schreibt, damit ich damit weiter arbeiten kann.
    Gedacht hatte ich es als Schleife:
    Do Until beides gleich
    oder
    Do While beides gleich
    oder
    For Schleife

    Bei allem läuft es auf Fehler. Entweder ist das Tool in einer Endlosschleife, oder es wird mir Stumpf Zeile 1 ausgegeben.


    Folgenden Code habe ich jetzt und der läuft in eine Endlosschleife. PS: Excel Initialisieren funktioniert(Workbook, Worksheet, etc), es geht mir wirklich nur um die Schleife. :(

    Quellcode

    1. Dim Excel As Excel.Application
    2. Dim Workbook As Excel.Workbook
    3. Dim Worksheet As Excel.Worksheet
    4. Excel = New Excel.Application
    5. Workbook = Excel.Workbooks.Open("D:\Exceldatei.xlsx")
    6. Worksheet = Workbook.Worksheets("Tabelle1")
    7. Dim Zeile As Integer
    8. Zeile = 1
    9. Do While Worksheet.Cells(Zeile, 7).Value = textbox_resellerangelegt_sapnummer.Text
    10. Zeile += 1
    11. Loop



    Ich sitzt hier schon so lange vor, ich glaube ich brauche einen Wink mit dem Zaunpfahl. ?(

    Eigentlich ist es ja nur eine popelige Schleife? Aber ich komm nicht weiter.


    Ich hoffe hier kann mir jemand weiter helfen und danke schonmal im Voraus! :)
    Wenn du aus deiner Do While ... Loop eine Do ... Loop Until machst, wird's funktionieren.

    Aber ich würde mit Range.Find arbeiten, das ist viel performanter.

    Visual Basic-Quellcode

    1. c = Worksheet.Range("G:G").Find(textbox_resellerangelegt_sapnummer.Text, LookIn:=Excel.XlFindLookIn.xlValues, LookAt:=Excel.XlLookAt.xlWhole)
    2. If Not c is Nothing Then Zeile = c.Row


    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Klasse danke. Wenn Range performanter als Cells ist, nehm ich das, wenn ich damit auch zum Ziel komme. :)


    ​Leider bekomme ich das mit der Schleife nicht hin.
    Ich habe schon ein paar Schreibweisen probiert. Aber jedesmal hat Visual Studio etwas zu meckern.
    ​Erst, das 'c' nicht deklariert ist. Das habe ich dann mit Integer, Boolean und Range versucht. -> Etwas besser, aber immer noch Fehler
    ..Dann beim If Not [...] :(


    ​Ich hab so viele Schleifen gesehen, probiert und umgestellt, ich seh den Wald vor lauter Bäumen nicht mehr. :S

    petaod schrieb:

    Mein Vorschlag war, auf die Schleife völlig zu verzichten und nur ein .Find zu verwenden.

    Ah!
    Jetzt wird ein Schuh draus.
    Ok dann setz ich mich nochmal dran. ^^

    Edit: Ich kriegs nicht hin, ich versteh nicht warum. X/ Logisch kann ich dem Code folgen, und finde daher auch keinen Fehler. Ich habe mehrere Varianten jetzt nochmal durchprobiert mit der Fußgesteuerten Schleife & deinem Vorschlag.

    Endlosschleifen

    VB.NET-Quellcode

    1. Dim Zeile as Long
    2. Zeile = 1
    3. Do
    4. Zeile = Zeile + 1
    5. If Worksheet.Cells(Zeile, 7).value = textbox_resellerangelegt_sapnummer.Text Then Exit Do
    6. Loop


    VB.NET-Quellcode

    1. Dim Zeile as Long
    2. Zeile = 1
    3. Do
    4. Zeile = Zeile + 1
    5. Loop Until Worksheet.Cells(Zeile, 7).value = textbox_resellerangelegt_sapnummer.Text



    Fehlermeldung: "System.MissingMemberException: "Der öffentliche Member XlFindLookIn für den Typ ApplicationClass wurde nicht gefunden."

    VB.NET-Quellcode

    1. Dim c As Range
    2. Dim Zeile as Long
    3. c = Worksheet.Range("G:G").Find(textbox_resellerangelegt_sapnummer.Text, LookIn:=Excel.XlFindLookIn.xlValues, LookAt:=Excel.XlLookAt.xlWhole)
    4. If Not c Is Nothing Then Zeile = c.Row




    Ich habe schon zig Schleifen Varianten und Beispiele gegooglet. Ich erkenne keinen Fehler. Bei der Errormeldung bin ich hoffnungslos überfordert.

    Variablen sind korrekt (TextBox, Worksheet, und Spalte 7 bzw. G.), das habe ich mehrfach überprüft.

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „DerShorty“ ()

    Das ganze Wochenende nochmal probiert, umgestellt und versucht. Aber keine Besserung.
    Er verstehe es nicht.

    Die Umgekehrte Schleife funktioniert: Wenn nicht gefunden, Dann STOP und gib mit die Zeile. (= Zeile 2, Überschrift + 1 Durchlauf)
    Vertausche ich dann den Operator bzw. die Operatoren, bin ich wieder in einer Endlosschleife. ... Hier müsste er doch dann anschlagen?!

    Eben noch eine For-Schleife probiert, als alternative.. Aus die läuft Ohne Ende, bzw bis zum definierten Ende.
    Code:

    VB.NET-Quellcode

    1. Dim Zeile As Long = 1
    2. For Zeile = 2 To 50
    3. If Worksheet.Cells(Zeile, 7).Value = textbox_resellerangelegt_sapnummer.Text Then
    4. Exit For
    5. End If
    6. Next Zeile
    7. MsgBox(Zeile)

    Ergebnis ist immer 51. Dabei steht der gesuchte Wert an 38. Stelle. Stelle ich die die For-Schleife auf ...Unused.Range.... läuft Excel wieder ins Nirvana. :(

    Ich habe mich durch diverse Foren und Webseiten gesucht, jedesmal wird die Schleife so dargestellt wie bei den vorherigen Seiten. Und egal wie ich sie anstelle, Kopf oder Fußgesteuert, mit If-Abfrage oder ohne, Do Until/ Do While, Do ... Loop Until, Do ... Loop While.
    Ich habe auch stumpf sämtliche Variationen probiert, ohne den Sinn zu hinterfragen, aber JEDESMAL läuft es in eine Endlosschleife.


    Würde sich jemand nochmal mit mir hinsetzen?

    Viele Grüße!

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

    Wie wär's erstmal mit Option Strict On, da Worksheet.Cells(Zeile, 7).Value vom Typ Object ist, und danach mit einfachen Debug-Methoden:

    VB.NET-Quellcode

    1. Dim Zeile As Integer = 1, TextsAreEqual = False
    2. For Zeile = 2 To 50
    3. Dim TextInCurrentCell = Worksheet.Cells(Zeile, 7).Value.ToString
    4. Dim TextToLookFor = textbox_resellerangelegt_sapnummer.Text
    5. Dim TextsAreEqual = (TextInCurrentCell = TextToLookFor) 'die Klammern sind nur zur Übersicht
    6. Stop
    7. If TextsAreEqual Then Exit For
    8. Next
    9. If TextsAreEqual Then
    10. MessageBox.Show($"Der gesuchte Wert ist in Zeile {Zeile}.")
    11. Else
    12. MessageBox.Show("Der gesuchte Wert wurde nicht gefunden".)
    13. End If

    Das Stop ist jetzt nur dafür da, damit Du zum Anfang - sobald das Programm an jenem Stop anhält - erstmal reinschauen kannst, ob in den Variablen vernünftige Werte drinstehen. Alternativ mit Haltepunkten und Überwachung arbeiten. Ist flexibler.
    Lustig wird's dann in Excel-Zeile#38. Wenn dann nämlich rauskommt, dass TextsAreEqual = False, dann sind da irgendwo unsichtbare Sonderzeichen drin (oder noch einfacher: Unterschiede in Groß-/Kleinschreibung), die das Ganze fehlschlagen lassen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

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

    DerShorty schrieb:

    Der öffentliche Member XlFindLookIn für den Typ ApplicationClass wurde nicht gefunden.
    Du musst den Excel-Namespace importieren.
    Ansomsten gib die Konstanten direkt an.

    VB.NET-Quellcode

    1. ​c = Worksheet.Range("G:G").Find(textbox_resellerangelegt_sapnummer.Text, LookIn:=-4163, LookAt:=1)
    2. If Not c Is Nothing Then Zeile = c.Row
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    VaporiZed schrieb:

    Wie wär's erstmal mit <code class="inlineCode">Option Strict On</code>, da <code class="inlineCode">Worksheet.Cells(Zeile, 7).Value</code> vom Typ <code class="inlineCode">Object</code> ist[...]


    Das habe ich gestern nach Feierabend auch herausgefunden. Ich denke hier liegt der Hund begraben. Jedoch, wenn ich Option Strict On eingebe, zerschieße ich mir andere Funktionen: "Option Strict On lässt späteres binden nicht zu."
    ..Die Zeile suchen ist die letzte Funktion des Tools.
    Darf ich mich jetzt nochmal Tage hinsetzen alles umzuschreiben?

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

    Ja, das wäre auf lange Sicht sinnvoll. Aber für den Moment reicht die Variante mit Worksheet.Cells(Zeile, 7).Value.ToString.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Nagut, dann ist das so.
    Die Variante mit .ToString habe ich glatt übersehen / überlesen.
    Das benutze ich erstmal um die Funktion herzustellen.
    ..Man möchte nämlich bis Ende der Woche das Tool auf dem Tisch haben.

    Jedoch ist Visual Studio der Meinung das "TextsAreEqual" in Zeile 5 einen Error produziert. "Die Variable "TextsAreEqual" verbirgt eine Variable in einem einschließenden Block."
    In Zeile 1, 7 und 10 wird nichts angestrichen.
    ​(Zeilen von VaporiZed Codebeispiel)

    Für mich als Hobbyprogrammierer ist das ein bisschen wenig Information für einen Error. Das ist ja eher ein Hinweis. Ich muss was unternehmen um den Build bauen zu können, aber keine Idee was.
    Ja, das ist mit der verborgenen Variable richtig.
    In Zeile#5 muss es richtig bei mir heißen:

    VB.NET-Quellcode

    1. TextsAreEqual = (TextInCurrentCell = TextToLookFor) 'die Klammern sind nur zur Übersicht

    Sonst wird ja ne neue Variable angelegt.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Danke VaporiZed.
    Ich war mit meiner Frage etwas zu vorschnell und hab bei Google recherche mit der Fehlermeldung auch gelernt, das er dort eine Neue Variable erstellen möchte.
    Zwar hab ich jetzt immer noch eine Fehlermeldung: "Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt." und zwar die Zeile, in der es heißt

    VB.NET-Quellcode

    1. Dim textincurrentcell = worksheet.Cells(zeile, 7).value.ToString

    (Build ok, Beim ausführen des Buttons kommt dann der Fehler)


    Versteht mich nicht falsch, ich will mir hier nicht den Code vorkauen lassen. Allerdings habe ich 9/10 des Tools in Eigenregie geschrieben und konnte mir bisher selbst helfen, mal länger mal weniger lang.
    ..Aber dieses Excelsuchen ist da doch etwas zu hoch für mich.
    Na Moment. Die Fehlermeldung wird für Worksheet ausgegeben, richtig? Ja gut, ich hab natürlich nur den Schleifen-Suchcode gepostet. Was jetzt Worksheet etc. ist, musst Du selber festlegen. Aber ich dachte, Du hättest den Code aus Post#1, wo Worksheet und Co. definiert sind, noch in Benutzung.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Mahlzeit!

    Die Fehlermeldung wird für .ToString angezeigt, wenn ich es richtig interpretiere.
    Die Worksheet Variable habe ich nicht geändert, sondern so übernommen wie ich es in anderen Methoden, wo Excel im Spiel ist, auch geschrieben habe. Diese funktionieren tadellos.
    Deswegen wäre ich nicht auf die Idee gekommen, das von selbst zu ändern. :)

    Ich habe auch noch ein Screenshot erstellt. Bilder sagen bekanntlich mehr als tausend Worte.
    http://bit.ly/2GD2oXV

    Selbige Fehlermeldung an selber Stelle bekomme ich, egal mit welcher Schleife ich arbeite. Immer beim ersten .ToString entsteht der Fehler.

    Ich habe mich bemüht alle Unternehmensrelevanten Namen unkenntlich zu machen.


    Vielen Dank euch für die ernsthafte Unterstützung. Das habe ich schon wirklich lange nicht mehr erlebt.

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