Einen bestimmten Wert in einer VBA UserForm suchen und dann zusätzliche Werte in dieselbe Zeile erfassen

  • Excel

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

    Einen bestimmten Wert in einer VBA UserForm suchen und dann zusätzliche Werte in dieselbe Zeile erfassen

    Hallo liebe Experten,

    ich benötige mal bitte Eure Hilfe.
    Mein Problem: Ich habe eine Maske (Aussonderung) in VBA /Userform erstellt. In dieser Maske ist eine TextBox_Inventarnummer.

    Wie programmiere ich es, dass ich mit Hilfe der TextBox einen bestimmten Wert (Zahlen und Buchstaben) suchen kann.
    Der Wert steht in Spalte A (von Zeilen 3- [open end])

    Ich habe mir den Befehl Range.Find schon angesehen, aber ich kann es leider nicht umsetzen, dass die Maske mir die Zeile mit dem bestimmten Wert anzeigt und ich dann (so meine Idee),
    noch zusätzliche Werte in die gleiche Zeile einfügen kann.
    Es würde dann so aussehen.
    Spalten
    A: Inventarnummer / B: Bezeichnung / AD: TagDerBeräumung / AE: GrundDerAussonderung


    Spoiler anzeigen
    Option Explicit

    Private Sub Button_Schließen_Click()

    'Eingabefenster schließen

    Unload Aussonderungs_Maske

    End Sub

    Private Sub Button_Eingabe_Click()

    'Eingaben der Schaltfläche in die Arbeitsmappe übernehmen

    Dim last As Integer
    last = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row + 1

    'TagDerBeräumung
    Cells(last, 30).Value = TextBox_TagDerBeräumung

    'GrundDerAussonderung
    Cells(last, 31).Value = TextBox_GrundDerAussonderung

    'Aussonderung
    Cells(last, 29).Value = "Ja"

    MsgBox "Eingabe erfolgreich"

    End Sub

    Private Sub TextBox_Inventarnummer_Change()
    Wenn eine Nummer in die TextBox eingetragen wird, dann soll dieser Wert
    in Spalte A gefunden und angezeigt werden.
    Außerdem möchte ich den "Tag Der Beräumung" in dieselbe Zeile erfassen
    End Sub

    Private Sub UserForm_Initialize()

    'TagDerBeräumung
    TextBox_TagDerBeräumung = ""

    'GrundDerAussonderung
    TextBox_GrundDerAussonderung = ""

    If CheckBox1.Value Then

    CheckBox1 = Cells(29)

    End If

    End Sub


    Verzippte Datei angehängt.

    Ich würde mich sehr über Hilfe freuen, da ich mit VBA erst seit Juni 2020 arbeite.

    Danke Johanne
    Dateien

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

    1. geändert
    2. Den würde ich hier unterbringen wollen, aber ich habe keinen blassen schimmer wie, da ich auf dem Schlauch stehe. Tut mir leid.
    Ich dachte es hilft, vielleicht, wenn ich das was ich möchte, in Deutsch aufschreibe.

    Private Sub TextBox_Inventarnummer_Change()
    Wenn eine Nummer in die TextBox eingetragen wird, dann soll dieser Wertin Spalte A gefunden
    und angezeigt werden.
    Außerdem möchte ich den "Tag Der Beräumung" in dieselbe Zeile erfassen
    End Sub
    Hi,
    1. ich habe deinen Code, wie oben beschrieben, eingebaut.


    Visual Basic-Quellcode

    1. Private Sub TextBox_Inventarnummer_Change()
    2. Set c = Range("A:A").Find(TextBox_Inventarnummer.Text)
    3. End Sub


    Aber da kommt folgende Fehlermeldung:

    Fehler beim Kompilieren:
    Variable nicht definiert.

    Das c= wird dann auch blau hinterlegt.

    Ich versteh das leider nicht.


    2. Deinen Link habe ich mir angeschaut und laut dem muss ich dem .Find sagen, was ich suche.
    Alle möglichen Daten, die in "A" stehen? Dann hab ich was zu tun, da es über 7000 Zeilen sind und es werden noch mehr.
    Oder habe ich die Anleitung falsch verstanden?

    Danke für den ersten Teil der Hilfe!

    Johanne schrieb:

    Variable nicht definiert.
    Das c= wird dann auch blau hinterlegt.

    Dann musst du das c definieren.
    Das liegt daran, dass du vorbildhafterweise mit ​Option Explicit arbeitest, was bedeutet, dass alle benutzten Variablen definiert werden müssen.
    Ich wollte jetzt nicht unbedingt die Basics von VBA durchkauen.

    Visual Basic-Quellcode

    1. ​Private Sub TextBox_Inventarnummer_Change()
    2. Dim c as Range
    3. Set c = Worksheets("WhatEver").Range("A:A").Find(TextBox_Inventarnummer.Text, LookIn:=xlValues, LookAt:=xlWhole)
    4. If c Is Nothing Then
    5. MsgBox "Wert " & TextBox_Inventarnummer.Text & " nicht gefunden"
    6. Else
    7. MsgBox "Wert " & TextBox_Inventarnummer.Text & " gefunden in Zelle " & c.Address
    8. End If
    9. End Sub
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Hi Petaod,

    Danke für die Hilfe.
    Das funktioniert, wie du sicher erwartet hast.

    Nun ist die Frage, wenn mir die MsgBox die Adresse ausgibt, kann ich meiner Eingabemaske dann "sagen", dass ich genau in der Zeile die "leeren Felder" der Aussonderung ausfüllen möchte.

    In meiner Aussonderungsmaske sind nur die Spalten benannt / erfasst, die in der Regulären Eingabemaske sowieso "unberührt" bleiben.
    Ich würde damit also nichts überschreiben.

    Ich würde mich über deine weitere Hilfe freuen.
    Oder wenn du jem anderen hast, der mir helfen mag, sag ihm/ihr bitte gerne Bescheid.

    *Dankeschön*
    In c hast du die Zelle.
    ​c.Row ist die dazugehörige Zeile.

    Visual Basic-Quellcode

    1. ​Worksheets("WhatEver").Cells(c.Row, 2).Value = "dein Wert für Spalte 2"
    2. Worksheets("WhatEver").Cells(c.Row, 3).Value = "dein Wert für Spalte 3"
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Moin,
    ich habe deine Vorschläge versucht umzusetzen, was etwas länger gedauert hat. Pardon, dafür.

    Ich weiß, es sollte funktionieren, da du ein Profi / Experte bist, aber irgendwas mache ich mit meinem "Anfänger wissen" doch noch falsch.


    Hier meine Änderungen:

    Spoiler anzeigen
    Option Explicit

    Private Sub Button_Schließen_Click()

    'Eingabefenster schließen

    Unload Aussonderungs_Maske

    End Sub

    Private Sub CommandButton1_Click()
    Kalender_Maske.Show
    End Sub


    Private Sub TextBox_Inventarnummer_Change()
    'Eingaben der Schaltfläche in die Arbeitsmappe übernehmen

    Dim c As Range
    Set c = Worksheets("Inventar").Range("A:A").Find(TextBox_Inventarnummer.Text, LookIn:=xlValues, LookAt:=xlWhole)

    If c Is Nothing Then
    MsgBox "Wert " & TextBox_Inventarnummer.Text & " nicht gefunden"
    Else
    MsgBox "Wert " & TextBox_Inventarnummer.Text & " gefunden in Zelle " & c.Address

    'TagDerBeräumung
    Cells(c.Row, 25).Value = TextBox_TagDerBeräumung

    'GrundDerAussonderung
    Cells(c.Row, 26).Value = TextBox_GrundDerAussonderung

    'Aussonderung
    Cells(c.Row, 24).Value = "X"


    MsgBox "Eingabe erfolgreich"

    End If

    End Sub

    Private Sub UserForm_Initialize()

    'TagDerBeräumung
    TextBox_TagDerBeräumung.Text = ""

    'GrundDerAussonderung
    TextBox_GrundDerAussonderung = ""

    If CheckBox1.Value Then

    CheckBox1 = Cells(24)

    End If

    End Sub


    Ich habe es nach Deiner Anleitung versucht einzubauen.
    Aber dann tauchen plötzlich Fragen auf.

    1. Der Kalender wird nicht mehr übernommen. (ich versteh nicht warum)
    2. Die MsgBox kommt nach jedem Buchstaben. Ich habe versucht "Brut-00044" einzugeben und nach jeder Eingabe, kommt die MsgBox, dass der Wert nicht gefunden wurde. Bis er zu Schluss in A7736 gefunden wird. Das wird dann auch angezeigt.
    3. Die MsgBox "Eingabe erfolgreich" kommt zu früh. Sie sollte erst kommen, wenn ich auf den Eingabe Button drücke und beim Schließen Button sollten die Daten (idealerweise) in die gleiche Zeile übernommen werden. Das klappt auch nicht. (Den Befehl für den Eingabe Button habe ich vermutlich gelöscht.)

    Ich Danke sehr für Deine Geduld mit mir und für Deine Hilfe!!!
    -------------------------------------------------------------------------------------

    Ich habe es hinbekommen, dass die MsgBox Eingabe erfolgreich wieder mit drücken des Eingabe Buttons kommt.
    Aber meine Eingaben gehen dann nicht in die gleich Zeile, wie der gefundene Wert, sondern eine Zeile darunter (nächste freie Zeile)

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

    Johanne schrieb:

    Die MsgBox kommt nach jedem Buchstaben. Ich habe versucht "Brut-00044" einzugeben und nach jeder Eingabe, kommt die MsgBox, dass der Wert nicht gefunden wurde. Bis er zu Schluss in A7736 gefunden wird. Das wird dann auch angezeigt.
    Du wertest das Change-Ereignis aus.
    Das wird geworfen, sobald die Textbox sich ändert. Also nach jedem Buchstaben.
    Du könntest statt dessen, das LostFocus Event verwenden. Das tritt auf, wenn du die Textbox verlässt.

    Aber wenn du schon einen Button hast, dann nimm das Button-Click-Ereignis, um deine Suche zu starten.

    Dein Code ist in dem Format schwer zu lesen.
    Verwende bitte VB-Tags, um den Code zu strukturieren.
    [Forum] Wie füge ich Quellcode korrekt im Forum ein?
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

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

    Ich habe den Code umgebaut.

    Spoiler anzeigen
    Option Explicit

    Private Sub Button_Schließen_Click()

    'Eingabefenster schließen

    Unload Aussonderungs_Maske

    End Sub

    Private Sub CommandButton1_Click()
    Kalender_Maske.Show
    End Sub

    Sub Button_Eingabe_Click()

    'Eingaben der Schaltfläche in die Arbeitsmappe übernehmen
    Dim last As Integer
    last = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row + 1

    'Eingaben in der TextBox_Inventarnummer finden
    Dim c As Range
    Set c = Worksheets("Inventar").Range("A:A").Find(TextBox_Inventarnummer.Text)

    'TagDerBeräumung
    Cells(last, 25).Value = TextBox_TagDerBeräumung

    'GrundDerAussonderung
    Cells(last, 26).Value = TextBox_GrundDerAussonderung

    'Aussonderung
    Cells(last, 24).Value = "X"

    MsgBox "Eingabe erfolgreich"

    End Sub

    Private Sub UserForm_Initialize()

    'TagDerBeräumung
    TextBox_TagDerBeräumung.Text = ""

    'GrundDerAussonderung
    TextBox_GrundDerAussonderung = ""

    If CheckBox1.Value Then

    CheckBox1 = Cells(24)

    End If

    End Sub


    Nun finde ich aber keine Werte mehr, wenn ich sie in die TextBox eingebe.
    Wenn ich den Eingabe Button drücke, dann kommt die MsgBox mit "Eingabe erfolgreich" und meine Daten schreibt er in die nächste Leere Zeile und nicht in die gewünschte gefundene Zeile.

    Ich steh auf dem Schlauch.
    Bitte:
    [Forum] Wie füge ich Quellcode korrekt im Forum ein?

    Johanne schrieb:

    meine Daten schreibt er in die nächste Leere Zeile und nicht in die gewünschte gefundene Zeile.
    Works as designed. Soll heißen: Er tut genau, was du ihm sagst.
    Du verwendest last und nicht c.Row
    Du kannst nach dem Find auch den last auf die entsprechende Zeile setzen:

    Visual Basic-Quellcode

    1. If c is Not Nothing Then last = c.Row

    Dann würde ich die Variable allerdings nicht unbedingt last nennen.

    Edit:
    Außerdem sollten Zeilen nicht als Integer, sondern als Long deklariert werden, sonst gibt's bei großen Dateien einen Overflow.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

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

    mit c.Row habe ich es auch versucht, aber das klappte auch nicht.

    Ich lese mir deinen Link durch und probiere weiter.

    Danke für deine Geduld und Hilfe!

    -------------------------------------------------------------------------------------------------

    Spoiler anzeigen

    Visual Basic-Quellcode

    1. Sub Button_Eingabe_Click()
    2. 'Eingaben der Schaltfläche in die Arbeitsmappe übernehmen
    3. 'Eingaben in der TextBox_Inventarnummer finden
    4. Dim c As Range
    5. Set c = Worksheets("Inventar").Range("A:A").Find(TextBox_Inventarnummer.Text)
    6. 'TagDerBeräumung
    7. Cells(c.Row, 25).Value = TextBox_TagDerBeräumung
    8. 'GrundDerAussonderung
    9. Cells(c.Row, 26).Value = TextBox_GrundDerAussonderung
    10. 'Aussonderung
    11. Cells(c.Row, 24).Value = "X"
    12. MsgBox "Eingabe erfolgreich"
    13. End Sub


    Bitte was mache ich falsch?

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Johanne“ ()

    Johanne schrieb:

    meine Daten schreibt er in die nächste Leere Zeile und nicht in die gewünschte gefundene Zeile.
    Wenn du das Sheet aus der Form ansprichst, solltest du es adressieren, sonst kann alles Zufall sein.

    Visual Basic-Quellcode

    1. Sub Button_Eingabe_Click()
    2. 'Eingaben der Schaltfläche in die Arbeitsmappe übernehmen
    3. 'Eingaben in der TextBox_Inventarnummer finden
    4. Dim c As Range, ws As Worksheet
    5. Set ws = Worksheets("Inventar")
    6. Set c = ws.Range("A:A").Find(TextBox_Inventarnummer.Text)
    7. If c Is Nothing Then
    8. MsgBox "nicht gefunden"
    9. Else
    10. 'TagDerBeräumung
    11. ws.Cells(c.Row, 25).Value = TextBox_TagDerBeräumung.Text
    12. 'GrundDerAussonderung
    13. ws.Cells(c.Row, 26).Value = TextBox_GrundDerAussonderung.Text
    14. 'Aussonderung
    15. ws.Cells(c.Row, 24).Value = "X"
    16. MsgBox "Eingabe erfolgreich"
    17. End If
    18. End Sub
    Ansonsten einfach mal mit dem Debugger durchsteppen und die Variablen kontrollieren.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Hey, guten Morgen!

    Ich bedanke mich sehr für Deine Hilfe.
    Ich habe den Code gerade übertragen und wie du sicher vermutest (oder weißt) er funktioniert.

    Hätte nicht gewusst, dass ich das

    VB.NET-Quellcode

    1. ws As Worksheet
    2. Set ws = Worksheets("Inventar")
    hinzufügen muss.

    Für mich ist VB immer noch wie hebräisch/arabisch lernen....aber ich gebe mir Mühe und ich lerne.

    Dank Dir auch immer mehr.
    Auch den Debugger habe ich zum durchsteppen benutzt. Da sieht man dann Schritt für Schritt was passiert. Danke

    Vorerst ein schönes Wochenende.
    Ich versuche dann mal den Rest des Wunsches meines Vorgesetzten umzusetzen.

    Johanne schrieb:

    wie du sicher vermutest (oder weißt) er funktioniert
    Ich habe mir Mühe gegeben.
    Getestet habe ich nichts.
    Das war aus dem Kopf geschrieben und da kann sich auch mal ein Fehler einschleichen.

    Johanne schrieb:

    Hätte nicht gewusst, dass ich das
    ws As Worksheet
    hinzufügen muss
    Es war nicht unbedingt erforderlich, du hättest auch statt dessen überall wo ws steht auch Worksheets("Inventar") verwenden können.
    Aber es ist halt einfacher, kürzer und übersichtlicher, das Objekt in einer Variablen zu speichern.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Hey, konnte nicht eher antworten, da ich das ganze Projekt auf der Arbeit mache, kann ich auch nur auf der Arbeit um Hilfe bitten oder besser, dementsprechend Danken / antworten.

    Das ist lieb, dass Du Dir Mühe gegeben hast und es hat funktioniert.
    Ja bei einem Fehler hätte ich nachgefragt, ob Du Dir das noch mal anschauen kannst bzw. ich hätte die Fehlermeldung gepostet und dann hättest Du es wahrscheinlich schnell herausbekommen, wo es falsch lief.

    Fakt ist: Ich bin Dankbar für Deine Hilfe.
    Hi,
    meine Datenbank "wächst und gedeiht".(und auch als Anfänger macht es Spaß diese zu programmieren)

    Und wie es so ist, mit jeder Änderung heißt es probieren oder nach einer Antwort suchen, weil es nicht geht, wie gewünscht.
    Da ich für die folgende Probleme (2) keine Lösung gefunden habe, frage ich einfach.

    Nachfolgend mein Quellcode

    Spoiler anzeigen

    Visual Basic-Quellcode

    1. Visual Basic-QuellcodePrivate Sub TextBox_Inventarnummer_Change()
    2. Dim c as Range
    3. Set c = Worksheets("WhatEver").Range("A:A").Find(TextBox_Inventarnummer.Text, LookIn:=xlValues, LookAt:=xlWhole)
    4. If c Is Nothing Then
    5. MsgBox "Wert " & TextBox_Inventarnummer.Text & " nicht gefunden"
    6. Else
    7. MsgBox "Wert " & TextBox_Inventarnummer.Text & " gefunden in Zelle " & c.Address
    8. End If
    9. End Sub



    Kann man die gefundene Zelle mit der Adresse auch markieren? Damit man sie schneller findet.
    Die Datenbank hat mittlerweile über 8000 Zeilen und das Ende ist nicht absehbar.

    Ich habe versehentlich einmal nichts in die Inventarnummer eingegeben und musste feststellen, dass "mein Datum und das X" in Zeile 2 geschrieben wurden, weil da nichts im Feld Inventarnummer eingetragen ist.
    Generell hat das Programm das gemacht was es sollte, auch wenn es für mich ungünstig war.

    Mit der Eingabe und der Markierung der gefundenen Zelle " gefunden in Zelle " & c.Address möchte ich verhindern, dass der Anwender seine Eingabe nicht findet bzw. die Eingabe wiederholt (auch wenn sie vorher schon nicht passte.).

    Ich hoffe, ich habe mein Problem verständlich ausgedrückt.

    Ich danke im voraus.

    Johanne

    Johanne schrieb:

    Kann man die gefundene Zelle mit der Adresse auch markieren?
    Ja.

    Visual Basic-Quellcode

    1. ​c.Interior.Color=RGB(255,255,0)

    Das Problem ist dann, wann willst du die MArkierung wieder entfernen, damit am Ende nicht alle markiert sind.
    Eine Möglichkeit wäre, vor der Suche alle Zellen zurücksetzen.

    Visual Basic-Quellcode

    1. Worksheets("Inventar").UsedRange.Interior.Color=RGB(255,255,255)
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Hey,

    ich habe es probiert und es funktioniert super. Die Markierung bleibt nach Schließen der Maske noch bestehen, aber mit erneutem Aufrufen und Suchen verschwindet die erste Markierung.

    ... damit am Ende nicht alle markiert sind.


    Das hatte ich natürlich nicht bedacht / glatt vergessen, dass ich die Markierung auch wieder wegnehmen muss, damit nicht alles "Gelb" wird.
    Danke das Du daran gedacht hast.

    Würde es gehen, dass man nach Schließen des Fenster (durch drücken des Button "schließen") die Markierung aufhebt?
    Wenn nicht, wäre es schade.