Hi,
ich will prüfen, ob der eingegebene Inhalt einer Userform in der Spalte A vorhanden ist. Wenn ja, dann Neueingabe, wenn Nein, dann Übernahme in Variable.
Geht das so? Bei Text hat es funktioniert, eine doppelte Zahl wurde trotzdem akzeptiert.
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean) ' Kunde: KdNr
If TextBox1.Value = "" Then Exit Sub
Set objWsK = ThisWorkbook.Worksheets("Kundendaten")
loLetzte = objWsK.Cells(Rows.Count, 1).End(xlUp).Row ' letzte belegte in Spalte A (1)
For i = 2 To loLetzte
If TextBox1.Value = Range("A" & i) Then ' gibt es die KdNr schon in Spalte A?
frm_KdNr_vorhanden.Show ' Fehlermeldung
TextBox1.Value = "" ' TextBox leeren
TextBox1.SetFocus ' Cursor in TextBox 1 zur Neueingabe
Cancel = True
Exit Sub
Else
strKdNr = TextBox1.Value ' Übertrag Eingabe in Variable
End If
Next i
End Sub
Hallo Rabe,
umgeprüft und deshalb nur als Anregung zu verstehen:
Ersetze
= range("A"&i)
Durch
= objwsk.cells(i , "A")
Mfg
Moin Ralf!
Ungetestet müsstest Du zunächst den Typ prüfen.
Nach dem Motto:
If IsNumeric(TextBox1) Then Variable = CDbl(TextBox1)
Gruß Ralf
Im Übrigen:
Warum nimmst Du nicht die Range.Find-Methode?
Ist jedenfalls schneller als Deine Schleife.
(Ich schaue erst heute Abend wieder rein)
Gruß Ralf
Hallo Ralf(Rabe)
warum überhaupt eine TextBox?
Wenn du gleich eine Combobox nimmst in welcher die Einträge der Kundendaten (Nummern) sind, sparst du Dir ohnehin die Abfrage ob es diesen Wert gibt?
lg
Chris
Hi,
hmm,
meinst du so etwas?
Code:
Option Explicit
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Dim lngKdNr As Long
Dim objWsK As Worksheet
Set objWsK = ThisWorkbook.Worksheets("Kundendaten")
If TextBox1.Value <> "" Then
If IsNumeric(Me.TextBox1.Text) Then
If WorksheetFunction.CountIf(objWsK.Columns(1), CLng(TextBox1.Value)) = 0 Then
lngKdNr = CLng(TextBox1.Value)
MsgBox lngKdNr & " ist nicht vorhanden und wird der Variablen zugewiesen"
Else
frm_KdNr_vorhanden.Show
TextBox1.Value = ""
TextBox1.SetFocus
Cancel = True
End If
End If
End If
End Sub
die Msgbox kann dann natürlich raus!
oder
Code:
Option Explicit
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Dim lngKdNr As Long
Dim objWsK As Worksheet
Set objWsK = ThisWorkbook.Worksheets("Kundendaten")
If TextBox1.Value <> "" Then
If IsNumeric(Me.TextBox1.Text) Then
If WorksheetFunction.CountIf(objWsK.Columns(1), CLng(TextBox1.Value)) = 0 Then
lngKdNr = CLng(TextBox1.Value)
MsgBox lngKdNr & " ist nicht vorhanden und wird der Variablen zugewiesen"
Else
ErrM
Cancel = True
End If
Else
ErrM
Cancel = True
End If
End If
End Sub
Sub ErrM()
TextBox1.Value = ""
frm_KdNr_vorhanden.Show
End Sub
Hi,
(16.03.2016, 09:13)RPP63 schrieb: [ -> ]Warum nimmst Du nicht die Range.Find-Methode?
ich habe es jetzt mal so probiert und das geht auch:
With objWsK.Range("A2:A" & loLetzte)
Set c = .Find(TextBox1.Value, LookIn:=xlValues)
If Not c Is Nothing Then
firstAddress = c.Address
Do
frm_KdNr_vorhanden.Show ' Fehlermeldung
TextBox1.Value = "" ' TextBox leeren
TextBox1.SetFocus ' Cursor in TextBox 1 zur Neueingabe
Cancel = True
Exit Sub
Loop While Not c Is Nothing And c.Address <> firstAddress
Else
strKdNr = TextBox1.Value ' Übertrag Eingabe in Variable
End If
End With
Wenn das dadurch schneller wird, gefällt mir das.
Was würde es bringen, Range durch Cells zu ersetzen?
Hi Chris,
ich meinte es so:
Es soll alles eingegeben werden können, egal ob Text oder Zahlen, es darf keine doppelten Werte geben.
Das CountIf gefällt mir gut, wenn ich die numerische Abfrage und die Umwandlung rausnehme, dann müßte das doch passen.
Jetzt sieht es so aus:
If TextBox1.Value <> "" Then
If WorksheetFunction.CountIf(objWsK.Columns(1), TextBox1.Value) = 0 Then ' gibt es die KdNr schon in Spalte A?
strKdNr = TextBox1.Value
' MsgBox strKdNr & " ist nicht vorhanden und wird der Variablen zugewiesen"
Else
frm_KdNr_vorhanden.Show ' Fehlermeldung
TextBox1.Value = "" ' TextBox leeren
TextBox1.SetFocus ' Cursor in TextBox 1 zur Neueingabe
Cancel = True
' Exit Sub
End If
End If
Aber das mit der ComboBox teste ich auch mal, das wäre doch noch einfacher?
Hi,
da du unterschiedliche Einträge suchst wäre die Combo falsch, das hatte ich überlesen.
Zitat:Es soll alles eingegeben werden können, egal ob Text oder Zahlen, es darf keine doppelten Werte geben.
dann müsste es so passen.
Code:
Option Explicit
Private Sub TextBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
Dim varKdNr As Variant
Dim objWsK As Worksheet
Set objWsK = ThisWorkbook.Worksheets("Kundendaten")
If TextBox1.Value <> "" Then
If WorksheetFunction.CountIf(objWsK.Columns(1), TextBox1.Value) = 0 Then
varKdNr = TextBox1.Value
MsgBox varKdNr & " ist nicht vorhanden und wird der Variablen zugewiesen"
Else
TextBox1.Value = ""
frm_KdNr_vorhanden.Show
cancel=true
End If
End If
End Sub
lg
Chris