Registriert seit: 10.04.2014
Version(en): 2016 + 365
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
Registriert seit: 06.12.2015
Version(en): 2016
Hallo Rabe,
umgeprüft und deshalb nur als Anregung zu verstehen:
Ersetze
= range("A"&i)
Durch
= objwsk.cells(i , "A")
Mfg
Folgende(r) 1 Nutzer sagt Danke an Fennek für diesen Beitrag:1 Nutzer sagt Danke an Fennek für diesen Beitrag 28
• Rabe
Registriert seit: 12.10.2014
Version(en): 365 Insider (32 Bit)
Moin Ralf!
Ungetestet müsstest Du zunächst den Typ prüfen.
Nach dem Motto:
If IsNumeric(TextBox1) Then Variable = CDbl(TextBox1)
Gruß Ralf
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag.
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
Registriert seit: 12.10.2014
Version(en): 365 Insider (32 Bit)
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
Gib einem Mann einen Fisch und du ernährst ihn für einen Tag.
Lehre einen Mann zu fischen und du ernährst ihn für sein Leben. (Konfuzius)
Folgende(r) 1 Nutzer sagt Danke an RPP63 für diesen Beitrag:1 Nutzer sagt Danke an RPP63 für diesen Beitrag 28
• Rabe
Registriert seit: 14.04.2014
Version(en): Office 2013/2016/2019/365
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
lg Chris
Feedback nicht vergessen.
3a2920576572206973742064656e20646120736f206e65756769657269672e
Registriert seit: 10.04.2014
Version(en): 2016 + 365
Hi,
(16.03.2016, 10:11)Fennek schrieb: Durch
= objwsk.cells(i , "A")
danke, werde ich testen.
Registriert seit: 14.04.2014
Version(en): Office 2013/2016/2019/365
16.03.2016, 10:44
(Dieser Beitrag wurde zuletzt bearbeitet: 16.03.2016, 10:44 von chris-ka.)
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
lg Chris
Feedback nicht vergessen.
3a2920576572206973742064656e20646120736f206e65756769657269672e
Folgende(r) 1 Nutzer sagt Danke an chris-ka für diesen Beitrag:1 Nutzer sagt Danke an chris-ka für diesen Beitrag 28
• Rabe
Registriert seit: 10.04.2014
Version(en): 2016 + 365
Hi,
(16.03.2016, 10: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?
Registriert seit: 10.04.2014
Version(en): 2016 + 365
16.03.2016, 11:15
(Dieser Beitrag wurde zuletzt bearbeitet: 16.03.2016, 11:15 von Rabe.)
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?
Registriert seit: 14.04.2014
Version(en): Office 2013/2016/2019/365
16.03.2016, 11:16
(Dieser Beitrag wurde zuletzt bearbeitet: 16.03.2016, 11:17 von chris-ka.)
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
lg Chris
Feedback nicht vergessen.
3a2920576572206973742064656e20646120736f206e65756769657269672e
Folgende(r) 1 Nutzer sagt Danke an chris-ka für diesen Beitrag:1 Nutzer sagt Danke an chris-ka für diesen Beitrag 28
• Rabe