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.
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
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)
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
13.02.2020, 16:26 (Dieser Beitrag wurde zuletzt bearbeitet: 13.02.2020, 16:50 von atilla.
Bearbeitungsgrund: Vor "Range" fehlte ein Punkt
)
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
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 = ""
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.
14.02.2020, 08:13 (Dieser Beitrag wurde zuletzt bearbeitet: 14.02.2020, 08:13 von Kuwer.)
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
14.02.2020, 10:08 (Dieser Beitrag wurde zuletzt bearbeitet: 14.02.2020, 10:08 von atilla.)
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.
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.