Inhalt einer Userform-TextBox in Spalte vorhanden?
#1
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
Top
#2
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:
  • Rabe
Top
#3
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)
Top
#4
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:
  • Rabe
Top
#5
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.
[Bild: v.gif]
3a2920576572206973742064656e20646120736f206e65756769657269672e
Top
#6
Hi,

(16.03.2016, 10:11)Fennek schrieb: Durch
= objwsk.cells(i , "A")

danke, werde ich testen.
Top
#7
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.
[Bild: v.gif]
3a2920576572206973742064656e20646120736f206e65756769657269672e
[-] Folgende(r) 1 Nutzer sagt Danke an chris-ka für diesen Beitrag:
  • Rabe
Top
#8
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?
Top
#9
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?
Top
#10
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.
[Bild: v.gif]
3a2920576572206973742064656e20646120736f206e65756769657269672e
[-] Folgende(r) 1 Nutzer sagt Danke an chris-ka für diesen Beitrag:
  • Rabe
Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste