Live-Forum - Die aktuellen Beiträge
Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender

Forumthread: VBA Fehlerhafte Schleife

VBA Fehlerhafte Schleife
01.05.2021 23:56:11
MarC
Abend zusammen,
ich hänge gerade an einer Schleife fest und weiß nicht wo mein Fehler ist. Ich rufe ein UserForm auf und es werden die gewünschten Daten in 5 Textboxen geladen. Wenn ich die Daten ändere und auf Save klicke soll im Tabellenblatt "DB" überprüft werden ob die Werte aus den Textboxen in irgendeiner anderen Zeile zu finden sind außer in der Zeile aus der ich sie habe. Wenn die Daten wo anders vorkommen soll die Schleife beendet werden.
Eine Fehlermeldung erhalte ich leider nicht daher weiß ich nicht wo der Fehler liegt =(. Könnte mir wer helfen und sagen wo mein Fehler ist?
  • 
    Private Sub Save_Click()
    Dim RowNo_1 As Long
    Dim LastRow As Long
    LastRow = Sheets("DB").Cells(Rows.Count, 2).End(xlUp).Row
    For RowNo_1 = 8 To LastRow
    If RowTarget  RowNo_1 And Sheets("DB").Cells(RowNo_1, 2) = TextBox1 Then
    MsgBox "Text bereits vorhanden", vbExclamation, "Eingabe"
    Exit Sub
    End If
    Next RowNo_1
    End Sub
    

  • Anzeige

    10
    Beiträge zum Forumthread
    Beiträge zu diesem Forumthread

    Betreff
    Datum
    Anwender
    Anzeige
    AW: VBA Fehlerhafte Schleife
    02.05.2021 00:12:39
    onur
    1) Was soll RowTarget sein?
    2) "die Werte aus den Textboxen" ? Hier steht nur was von einer TextBox, und zwar TextBox1.
    3) Woher weisst du, dass die Schleife fehlerhaft ist?
    AW: VBA Fehlerhafte Schleife
    02.05.2021 09:35:29
    MarC
    Guten Morgen alle,
    ich habe eine Beispieldatei mit zwei Tabellenblättern und einem Userform erstellt. Auf der Übersichtsseite gebe ich in der Textbox unter Suchen den gesuchten Begriff ein. Je nach dem was in den Zeilen daneben erscheint kann ich weitere Infos per Doppelklick auf eine Zelle aufrufen. Das Userform das sich öffnet hat 5 Textboxen. Die Inhalte kann ich wie ich möchte bearbeiten und Speichern.
    Problem:
    Beim speichern soll der Inhalt wieder in die gleiche Zeile aus die die Infos stammen Tabellenblatt DB gespeichert werden. Aber der Inhalt aus den Textboxen 1 bis 4 darf nur einmal im ganzen Tabellenblatt DB vorkommen. Wenn einer der Inhalt in irgendeiner anderen Zeile vorkommt soll der Vorgang abgebrochen werden und eine MSG kommen, damit man weiß hey den Inhalt gibt es schon irgendwo.
    1) in RowTarget steht die Zeile in der der Inhalt vom Tabellenblatt "Übersicht" im Tabellenblatt "DB" gefunden wurde
    2) es steht nur noch eine TextBox im Code, weil ich die anderen 4 wieder gelöscht habe weil ich an einer schon gescheitert bin
    3) Fehlerhaft ist vielleicht das falsche Wort. Ich weiß nicht ob meine Herangehensweise die richtige ist. Ich habe mir gedacht das ich die Zeile nehme aus der ich den Inhalt habe und mit allen anderen vergleiche und den Inhalt der Textbox1 mit dem aus der Zeile X und Spalte 2. Wenn die Zeile X nicht der Zeile RowTarget entspricht aber der Inhalt Textbox1 dem der Zeile X und Spalte 2 gleich ist bedeutet dass das der Wert ein zweites mal vorkommen würde. Und dann soll der Inhalt nicht gespeichert werden.
    Sorry für den großen Text.
    https://www.herber.de/bbs/user/145917.xlsm
    Anzeige
    AW: VBA Fehlerhafte Schleife
    03.05.2021 18:29:57
    Yal
    Hallo MarC,
    Es ist manchmal schöner, die Prüfung einer separaten Funktion abzulegen.
    
    Private Sub Save_Click()
    '   1. Angepassten Term speichern.
    '    If MsgBox("Soll der neue Eintrag gespeichert werden?", vbYesNo)  vbYes Then Exit Sub
    Application.ScreenUpdating = False
    If IstEintrag_vorhanden Then
    MsgBox "Text bereits vorhanden", vbExclamation, "Eingabe"
    Else
    With Sheets("DB")
    .Cells(RowTarget, 2).Value = TextBox1.Value
    .Cells(RowTarget, 3).Value = TextBox2.Value
    .Cells(RowTarget, 4).Value = TextBox3.Value
    .Cells(RowTarget, 5).Value = TextBox4.Value
    .Cells(RowTarget, 6).Value = TextBox5.Value
    Unload Me
    End With
    End If
    End Sub
    Private Function IstEintrag_vorhanden() As Boolean
    Dim r
    Dim strToCompare As String
    strToCompare = TextBox1 & TextBox2 & TextBox3 & TextBox4 & TextBox5
    With Sheets("DB")
    For r = 8 To .Cells(Rows.Count, 2).End(xlUp).Row
    If InStr(1, .Cells(r, 2) & Cells(r, 3) & .Cells(r, 4) & Cells(r, 5), strToCompare, vbTextCompare) Then
    IstEintrag_vorhanden = True
    Exit Function
    End If
    Next
    End With
    End Function
    
    VG
    Yal
    Anzeige
    AW: VBA Fehlerhafte Schleife
    03.05.2021 20:59:09
    Marc
    Servus Yal,
    danke schon mal für deine Hilfe. Ich habe gerade deinen Code in die Datei kopiert, aber funktionieren tut es leider nicht. Ich kann immer noch Begriffe in die Textbox eingeben die schon in einer anderen Zeile stehen.
    Gruß
    Marc
    AW: VBA Fehlerhafte Schleife
    03.05.2021 21:50:31
    Yal
    Ach komm! Es waren nur 3 Fehler in einer Zeile. Darauf hättest Du auch selber drauf kommen können ;-)
    Hier die korrigierte Version:
    
    Private Function IstEintrag_vorhanden() As Boolean
    Dim r
    Dim strToCompare As String
    Dim strCompared As String
    strToCompare = TextBox1 & TextBox2 & TextBox3 & TextBox4 & TextBox5
    With Sheets("DB")
    For r = 8 To .Cells(Rows.Count, 2).End(xlUp).Row
    strCompared = .Cells(r, 2) & .Cells(r, 3) & .Cells(r, 4) & .Cells(r, 5) & .Cells(r, 6)
    If InStr(1, strCompared, strToCompare, vbTextCompare) Then
    IstEintrag_vorhanden = True
    Exit Function
    End If
    Next
    End With
    End Function
    
    Die ursprungliche Version war.
    
    strCompared = .Cells(r, 2) & Cells(r, 3) & .Cells(r, 4) & Cells(r, 5)
    
    Findest Du die 3 Fehler ?
    VG
    Yal
    Anzeige
    AW: VBA Fehlerhafte Schleife
    03.05.2021 23:10:19
    MarC
    Hi Yal,
    die Fehler habe ich schon gefunden, aber es geht trotzdem nicht. Ich kann immer noch in jeder Textbox den Text eingeben der in anderen Zeilen steht und dieser wird dann auch gespeichert.
    VG
    Marc
    AW: VBA Fehlerhafte Schleife
    04.05.2021 11:27:08
    Yal
    Hallo Marc,
    ich habe für den Test die Werte übernommen, wie sie vorgeschlagen werden, ohne Änderung, und es führt zu der Meldung des bereits Vorhandensein.
    Ich weiß nicht wie es anders testen soll.
    Man könnte mit Trim ein bischen "putzen". Würde aber wenig ändern:
    
    Private Function IstEintrag_vorhanden() As Boolean
    Dim r
    Dim strToCompare As String
    Dim strCompared As String
    strToCompare = Trim(TextBox1) & Trim(TextBox2) & Trim(TextBox3) & Trim(TextBox4) & Trim(TextBox59
    With Sheets("DB")
    For r = 8 To .Cells(Rows.Count, 2).End(xlUp).Row
    strCompared = Trim(.Cells(r, 2)) & Trim(.Cells(r, 3)) & Trim(.Cells(r, 4)) & Trim(.Cells(r, 5)) & Trim(.Cells(r, 6))
    If InStr(1, strCompared, strToCompare, vbTextCompare) Then
    IstEintrag_vorhanden = True
    Exit Function
    End If
    Next
    End With
    End Function
    
    VG
    Yal
    Anzeige
    AW: VBA Fehlerhafte Schleife
    04.05.2021 20:32:48
    MarC
    Servus Yal,
    danke nochmal für deine Hilfe, aber es funktioniert nicht. Hast du meine Datei verwendet oder selber eine erstellt? Ich habe es jetzt nochmal mit meinem Code versucht und einfach ein ".text" an Textbox1 gehängt. Jetzt geht es, aber warum es nur mit ".text" geht kann ich dir nicht sagen. Ich habe mir die Formatierung der Zellen angeschaut und da steht bei allen Standard drin. Ich habe mir auch den Inhalt der Variablen angeschaut und der hat auch gepasst, daher kann ich mir nicht erklären wieso das nicht funktioniert hat. Aber mit .text geht es. VG MarC
    
    Private Sub Save_Click()
    Dim RowNo_1 As Long
    Dim LastRow As Long
    LastRow = Sheets("DB").Cells(Rows.Count, 2).End(xlUp).Row
    For RowNo_1 = 8 To LastRow
    If RowTarget  RowNo_1 And Sheets("DB").Cells(RowNo_1, 2) = TextBox1.Text Then
    MsgBox "Text bereits vorhanden", vbExclamation, "Eingabe"
    Exit Sub
    ElseIf RowTarget  RowNo_1 And Sheets("DB").Cells(RowNo_1, 3) = TextBox2.Text Then
    MsgBox "Text bereits vorhanden", vbExclamation, "Eingabe"
    Exit Sub
    ElseIf RowTarget  RowNo_1 And Sheets("DB").Cells(RowNo_1, 4) = TextBox3.Text Then
    MsgBox "Text bereits vorhanden", vbExclamation, "Eingabe"
    Exit Sub
    ElseIf RowTarget  RowNo_1 And Sheets("DB").Cells(RowNo_1, 5) = TextBox4.Text Then
    MsgBox "Text bereits vorhanden", vbExclamation, "Eingabe"
    Exit Sub
    End If
    Next RowNo_1
    With Sheets("DB")
    .Cells(RowTarget, 2).Value = TextBox1.Value
    .Cells(RowTarget, 3).Value = TextBox2.Value
    .Cells(RowTarget, 4).Value = TextBox3.Value
    .Cells(RowTarget, 5).Value = TextBox4.Value
    .Cells(RowTarget, 6).Value = TextBox5.Value
    Unload Me
    End With
    End Sub
    

    Anzeige
    AW: VBA Fehlerhafte Schleife
    04.05.2021 22:28:10
    Yal
    Hallo MarC,
    3 punkten hast Du in deine Erklärung vergessen:
    _ es soll ggü alle Einträge in DB ausser der Eintrag, der gerade in der Userform gezeigt wird, geprüft. Genau diese Eintrag hatte ich als Test verwendet.
    _ es soll abbrechen, wenn nur ein Element bereit vorhanden ist, und nicht alle. Also Christin darf es nur einmal geben, Kiel nur einmal, usw. Ich hatte bisher die gesamte Zeile geprüft.
    _ .Cells(r,6) muss nicht geprüft werden.
    Jede Objekt hat eine Default-Eigenschaft, das zurückgegeben wird, wenn nicht spezifiziert. Meistens ".Value". ".Text" ist daher nicht erforderlich. Es müsse aber davor "Me." stehen. Also "Me.TextBox1" (die übrigens auch mit Me.Controls("TextBox" & i) abrufbar ist). Dann geht es.
    Wenn ich in Übersicht "T" oder "t" eingebe, bekomme ich verschiedene Ergebnisse. Ist es so gewollt?
    Auch die Prüfung wären auf LowerCase vielleicht sinnvoller:
    
    Private Sub Save_Click()
    Dim r As Long
    Dim i As Integer
    With Sheets("DB") 'wenn schon With, dann konsequent von Anfang an
    For r = 8 To .Cells(Rows.Count, 2).End(xlUp).Row
    If RowTarget  r Then
    For i = 1 To 4
    If LCase(.Cells(r, i + 1)) = LCase(Me.Controls("TextBox" & i).Text) Then
    MsgBox "Text bereits vorhanden", vbExclamation, "Eingabe"
    Exit Sub
    End If
    Next i
    End If
    Next r
    For i = 1 To 5
    .Cells(RowTarget, i + 1).Value = Me.Controls("TextBox" & i).Value
    Next i
    Unload Me
    End With
    End Sub
    
    Alternative:
    
    If StrComp(.Cells(r, i + 1), Me.Controls("TextBox" & i), vbTextCompare) Then
    
    Das Coding läuft bei jeder Eingabe in B9 extrem lang. Es ist ein Punkt, wo Du noch feilen kannst.
    Aber ingesamt "VBA Bescheiden" mit einem Plus am Ende ;-)
    VG
    Yal
    Anzeige
    AW: VBA Fehlerhafte Schleife
    02.05.2021 07:57:45
    Hajo_Zi
    RowTarget RowNo_1
    trifft immer zu
    RowTarget nicht definiert und damit 0
    GrußformelHomepage
    Anzeige
    ;

    Forumthreads zu verwandten Themen

    Anzeige
    Anzeige
    Anzeige
    Entdecke relevante Threads

    Schau dir verwandte Threads basierend auf dem aktuellen Thema an

    Alle relevanten Threads mit Inhaltsvorschau entdecken
    Anzeige

    Beliebteste Forumthreads (12 Monate)

    Anzeige
    Anzeige
    Entdecke mehr
    Finde genau, was du suchst

    Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

    Suche nach den besten Antworten
    Unsere beliebtesten Threads

    Entdecke unsere meistgeklickten Beiträge in der Google Suche

    Top 100 Threads jetzt ansehen
    Anzeige