Wir wünschen allen Forenteilnehmern ein frohes Fest und einen guten Rutsch ins neue Jahr. x

Userform mit automatischer Datenübernahme
#1
Question 
Hallo Leute,

ich benötige mal wieder etwas Unterstützung.
Mein Problem: ich benutze eine Userform zur Dateneingabe. In dem Feld Nummer gebe ich eine Nummer ein und das Makro nimmt sich die Daten aus dem Tabellenblatt "Quelle".
Dies funktioniert auch soweit, jedoch wenn ich eine Nummer eingebe, die nicht hinterlegt ist, dann bleiben die eingelesenen Felder durch die erste oder ersten Ziffern belegt.
    Beispiel: Eingabe 1: es kommt Name und Vorname der Person, die bei 1 hinterlegt ist.
                 Eingabe 11: es kommt Name und Vorname der Person, die bei 11 hinterlegt ist.
                 Eingabe 111: bleibt der Name und Vorname von Person, die bei 11 hinterlegt ist - hier sollten jedoch dann keine Namen stehen.
                 bei Eingabe 1111 kommt wieder der Name und Vorname, der Person, die bei 1111 hinterlegt ist.
Ich hoffe, ich habe mich verständlich genug ausgedrückt.

1. Wie kann ich nun erreichen, dass das Makro bei jeder Zahleneingabe (Tastendruck) prüft und wenn nichts hinterlegt ist, die Felder (hier im Beispiel "Vorname" und "Nachname") leer bleiben.
2. Wenn die Nummer eingeben ist, die richtigen Daten vorhanden, Enter betätigt wird und der Curser dann in das Feld "Telefon" spring.

Eine Beispieldatei habe ich mal angefertigt und ist dabei.

Ich bin für jede Hilfe und Unterstützung dankbar.

Marvin


Angehängte Dateien
.xlsm   Nummer.xlsm (Größe: 32,34 KB / Downloads: 16)
Top
#2
Hallo,

auf den ersten Blick sehe ich da zwei Ansätze:
1. du leitest die Suchen nicht über das Change-Ereignis des Textfeldes ein, sondern mit einer Schaltfläche, oder
2. du arbeitest anstelle der TextBox mit einem Kombinationsfeld, in dem nur die Nummern angezeigt werden, die es schon gibt.
Viele Grüße
Klaus-Dieter
Der Erfolg hat viele Väter, 
der Misserfolg ist ein Waisenkind
Richard Cobden
Top
#3
Moin!
Wiederum mein erhobener Zeigefinger:
Ein Tabellenblatt kennt "von Haus aus" ein After_Update-Ereignis, nämlich beim Verlassen der Zelle.
Der Rest wird dann mittels simplem SVERWEIS() erledigt …
(das Ganze in einer "intelligenten" Tabelle, und Du brauchst Dich noch nicht einmal um die Fortschreibung der Formeln zu kümmern)

Zu einfach?
Mag sein …

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
Hallo Marvin,
Private Sub Nummer_Change()
Dim lzeile As Integer
Dim x As Integer
Dim y As Integer

If IsNumeric(Nummer) Then
With Sheets("Quelle")
lzeile = .Cells(Rows.Count, 1).End(xlUp).Row
For x = 1 To lzeile
If .Cells(x, 1) = CDbl(Nummer.Value) Then
Vorname.Value = .Cells(x, 2)
Nachname.Value = .Cells(x, 3)
Exit For
End If
Next x
End With
End If
If x = 0 Or x = lzeile + 1 Then
Vorname.Value = ""
Nachname.Value = ""
End If
End Sub
Gruß Uwe
Top
#5
Hallo,

ich würde ohne Schleife arbeiten, dann geht es einfacher:

Code:
Private Sub Nummer_Change()
   Dim lzeile As Integer
   Dim vntZ
   
   If IsNumeric(Nummer) Then
      With Sheets("Quelle")
         lzeile = .Cells(Rows.Count, 1).End(xlUp).Row
         vntZ = Application.Match(CDbl(Nummer.Value), .Range(.Cells(1, 1), .Cells(lzeile, 1)), 0)
         If IsNumeric(vntZ) Then
            Vorname.Value = .Cells(vntZ, 2)
            Nachname.Value = .Cells(vntZ, 3)
         Else
            Vorname.Value = ""
            Nachname.Value = ""
         End If
      End With
   End If
End Sub
Gruß Atilla
Top
#6
Hallo,

ich hatte die Möglichkeit des löschens einer eingegebenen Nummer nicht mit eingeplant, deshalb eine Code Korrektur.

Code:
Private Sub Nummer_Change()
   Dim lzeile As Integer
   Dim vntZ
   If IsNumeric(Nummer) Then
      With Sheets("Quelle")
         lzeile = .Cells(Rows.Count, 1).End(xlUp).Row
         vntZ = Application.Match(CDbl(Nummer.Value), .Range(.Cells(1, 1), .Cells(lzeile, 1)), 0)
         If IsNumeric(vntZ) Then
            Vorname.Value = .Cells(vntZ, 2)
            Nachname.Value = .Cells(vntZ, 3)
         End If
      End With
   End If
   If Nummer = "" Or Not IsNumeric(vntZ) Then
      Vorname.Value = ""
      Nachname.Value = ""
   End If
End Sub

Beim Initialize der UserForm brauchst Du nichts leeren, da die Textboxen leer bleiben, bis sie befüllt werden.
Diese Zeilen sind dort nicht nötig:

Code:
        Nummer = ""
        Vorname = ""
        Nachname = ""
        Telefon = ""
        Mobil = ""
Gruß Atilla
Top
#7
Danke an Uwe und attila,

beide Makros funktionieren einwandfrei (Ich kann die Makros sogar nachvollziehen und verstehen). Somit wäre mein erstes Problem gelöst.
Aber wie bekomme ich den Sprung hin, wenn die Felder (hier "Vorname" und Nachname") durch die automatische Suchfunktion gefüllt worden sind, dass der Curser in das Feld "Telefon" springt.
Mit "Telefon.SetFocus" klappt dies nicht und meine VBA-Kenntnisse sind noch sehr gering.

Ich bin für jede Hilfe und Untertützung dankbar.

Marvin
Top
#8
Hallo Marvin,

hier klappt das Telefon.SetFocus:
Private Sub Nummer_Change()
    Dim lzeile As Integer
    Dim x As Integer
    Dim y As Integer

    If IsNumeric(Nummer) Then
      With Sheets("Quelle")
        lzeile = .Cells(Rows.Count, 1).End(xlUp).Row
        For x = 1 To lzeile
          If .Cells(x, 1) = CDbl(Nummer.Value) Then
            Vorname.Value = .Cells(x, 2)
            Nachname.Value = .Cells(x, 3)
            Exit For
          End If
        Next x
      End With
    End If
    If x = 0 Or x > lzeile Then
      Vorname.Value = ""
      Nachname.Value = ""
    Else
      Telefon.SetFocus
    End If
End Sub
Gruß Uwe
Top
#9
Hallo Marvin,

das klappt bei mir:

Code:
Private Sub Nummer_Change()
   Dim lzeile As Integer
   Dim vntZ
   If IsNumeric(Nummer) Then
      With Sheets("Quelle")
         lzeile = .Cells(Rows.Count, 1).End(xlUp).Row
         vntZ = Application.Match(CDbl(Nummer.Value), .Range(.Cells(1, 1), .Cells(lzeile, 1)), 0)
         If IsNumeric(vntZ) Then
            Vorname.Value = .Cells(vntZ, 2)
            Nachname.Value = .Cells(vntZ, 3)
            Telefon.SetFocus
         End If
      End With
   End If
   If Nummer = "" Or Not IsNumeric(vntZ) Then
      Vorname.Value = ""
      Nachname.Value = ""
   End If
End Sub

Aber das wird eher nerven, denke ich.
Wenn Du z.B. 1111 eingeben möchtest, musst nach jeder eingegebenen 1 (bis auf einmal) der Cursor manuell wieder aus der Box Telefon in die Box Nummer gesetzt werden.
Du könntest entweder neben der Nummer ein Schalter für weiter einbauen oder ein Ereignis der Userform nutzen, um nach Eingabe den Cursor in Telefon zu setzen.
Ich persönlich würde das Doppelklick der Userform testen.
Aber das hängt auch von Deinen Vorlieben und Deiner Arbeitsweise ab. Vielleicht ist es einfacher den Cursor manuell hinein zu setzen.
Gruß Atilla
Top
#10
Hallo Uwe und attila,

das mit dem "Telefon.SetFocus" hatte ich bereits probiert. Ist aber nicht das, was ich wollte.
Wahrscheinlich habe ich mich nicht ganz richtig ausgedrückt.
Also der Sprung soll dann erfolgen, wenn die Zahlen im Nummernfeld alle eingegeben sind und die Felder "Vorname" und "Nachname" gefüllt sind. Anderenfalls nicht.

Beispiel: Ich gebe die Nummer 1234 ein, die Felder "Vorname" und Nachname" bleiben leer (da keine Quelle vorhanden ist), betätige Enter dann Sprung in das Feld "Vorname".
             Gebe ich die Nummer 123 ein, das Feld "Vorname" wird gefüllt mit "Peter", "Nachname" mit "Huber" (da in der Quelle vorhanden ist), betätige ich jetzt Enter, dann soll der Curser in das Feld "Telefon" springen.

Jetzt frage ich mich, wie realisiere ich diese Abfrage, und hierfür sind meine VBA-Kenntnisse nicht vorhanden. Die Abfrage darf also erst mit "Enter" ausgelöst werden und dann entsprechend vorgenommen werden.
Ich hoffe, das ich mich diesmal richtig oder besser ausgedrückt habe.

Wie immer, bin ich für jede Hilfe und Untertützung dankbar.

Marvin
Top


Gehe zu:


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