Dateneingabeformat in Excel definieren?
Hallo, ich möchte in einer Zelle die Eingabe beschränken. Es müssen Buchstaben (B), es müssen Zahlen (Z), es müssen Sonderzeichen (/ und _) und es kann ein Buchstabe (b) eingeben werden also Beispielsweise im Format BBZZZ/ZBB_Bb oder BBZZZ/ZBB_B Kann ich dies in Excel umsetzen? Ich dachte zunächst an die Datenüberprüfung, bin dort allerdings nicht fündig geworden.
Danke im voraus! LG Syrena
5 Antworten
Mit RegEx hat Excel Probleme. Kannst ja mal nach "Excel Regex" googeln.
Mein erster Fund:
Ich schau mal ob ich was für Dich zusammenstricken kann. Glaube aber eher nicht. Vielleicht hilft ja ein anderer Experte?
P.S.: Umlaute sind bei obigem Code übrigens nicht erlaubt. Das lässt sich aber leicht erweitern, falls nötig.
Wow super vielen dank!!!
Das einzige Problem was es noch gibt... wenn ich etwas falsch eintippe muss ich Excel via Taskmanager beenden, da ich die Fehlermeldung nicht mit Kopfdruck beenden kann (Excel 2010).
Ich fürchte da habe ich nicht aufgepasst. Bin doch schon etwas aus der Übung.
Lösche mal die BEIDEN Zeilen
Target.ClearContents
aus dem Code.
Dann wird allerdings die Zelle nicht mehr geleert.
Oder Du nimmst diesen erweiterten Code:
Function istZahl(s As String) As Boolean
If IsNumeric(s) Then istZahl = True
End Function
Function istBuchstabe(s As String) As Boolean
If Asc(s) >= 65 And Asc(s) <= 90 Then
istBuchstabe = True
ElseIf Asc(s) >= 97 And Asc(s) <= 122 Then
istBuchstabe = True
End If
End Function
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("A1:A20")) Is Nothing Then
On Error GoTo ErrorHandler
Application.EnableEvents = False
Dim s As String
Dim passt As Boolean
s = Target.Value
If Len(s) < 11 Or Len(s) > 12 Then
MsgBox "Eingabelänge falsch"
Target.ClearContents
Exit Sub
End If
If istBuchstabe(Mid(s, 1, 1)) _
And istBuchstabe(Mid(s, 2, 1)) _
And istZahl(Mid(s, 3, 1)) _
And istZahl(Mid(s, 4, 1)) _
And istZahl(Mid(s, 5, 1)) _
And (Mid(s, 6, 1)) = "/" _
And istZahl(Mid(s, 7, 1)) _
And istBuchstabe(Mid(s, 8, 1)) _
And istBuchstabe(Mid(s, 9, 1)) _
And (Mid(s, 10, 1)) = "_" _
And istBuchstabe(Mid(s, 11, 1)) _
Then passt = True
If Len(s) = 12 Then
If Not istBuchstabe(Mid(s, 12, 1)) Then _
passt = False
End If
If passt = False Then
MsgBox "Falsche Form"
Target.ClearContents
End If
ErrorHandler: Application.EnableEvents = True
End If
End Sub
SORRY!
Ich hoffe jetzt klappt es besser.
DH! habe an was ähliches gedacht, aber Du hast das schon perfekt ausgearbeitet!
lediglich die 3 Zeilen istzahl würde ich zu einer Zeile kürzen:
istZahl(Mid(s, 3, 3)
aber das sind Peanuts im Vegleich zur Gesamtarbeit!
Stimmt das wäre effektiver.
Kleines Gegenargument: Der Code wäre nicht mehr so leicht auf andere Strukturen anzupassen.
Aber natürlich könnte man das Ganze auch noch allgemeiner aufbauen, sodass man zumindest eine primitive Regex mit Zahl,Buchstabe und Zeichen als String übergeben kann.
Vielleicht habe ich mal Langeweile 🙂
Es gibt noch ein kleines Problem. Wenn ich nun etwas "falsches" in die Zelle eintrage kommt wie erhofft die Msgbox und die Zelle wird geleert. Wenn ich jetzt allerdings noch einmal etwas falsches eingebe bzw. in eine andere Zelle in dem Bereich etwas falsches eingebe, wird dies jedoch dann akzeptiert. Kannst du das noch fixen?
Ja, kann ich.
War wohl nicht mein bester Tag als ich den Code geschrieben habe (:o |
Ich denke mal das genannte Problem tritt nur bei falscher Länge auf, nicht bei falscher Struktur.
Da muss noch eine Zeile geändert werden und zwar diese:
Function istZahl(s As String) As Boolean
If IsNumeric(s) Then istZahl = True
End Function
Function istBuchstabe(s As String) As Boolean
If Asc(s) >= 65 And Asc(s) <= 90 Then
istBuchstabe = True
ElseIf Asc(s) >= 97 And Asc(s) <= 122 Then
istBuchstabe = True
End If
End Function
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("A1:A20")) Is Nothing Then
On Error GoTo ErrorHandler
Application.EnableEvents = False
Dim s As String
Dim passt As Boolean
s = Target.Value
If Len(s) < 11 Or Len(s) > 12 Then
MsgBox "Eingabelänge falsch"
Target.ClearContents
GoTo ErrorHandler
End If
If istBuchstabe(Mid(s, 1, 1)) _
And istBuchstabe(Mid(s, 2, 1)) _
And istZahl(Mid(s, 3, 1)) _
And istZahl(Mid(s, 4, 1)) _
And istZahl(Mid(s, 5, 1)) _
And (Mid(s, 6, 1)) = "/" _
And istZahl(Mid(s, 7, 1)) _
And istBuchstabe(Mid(s, 8, 1)) _
And istBuchstabe(Mid(s, 9, 1)) _
And (Mid(s, 10, 1)) = "_" _
And istBuchstabe(Mid(s, 11, 1)) _
Then passt = True
If Len(s) = 12 Then
If Not istBuchstabe(Mid(s, 12, 1)) Then _
passt = False
End If
If passt = False Then
MsgBox "Falsche Form"
Target.ClearContents
End If
ErrorHandler: Application.EnableEvents = True
End If
End Sub
Also
GoTo ErrorHandler
statt
Exit Sub.
SORRY, ich hoffe ich habe nicht noch mehr Bugs in den Code gebaut.
Durch den Fehler reagierte VBA gar nicht mehr auf eine Änderung, da die "Events" ausgeschaltet blieben.
Falls Du die Datei nicht schon geschlossen hast, dann mach das bitte und öffne sie neu, bevor Du die Änderung vornimmst.
Alternativ kannst Du auch dieses kleine Programm anfügen:
Sub EventsAn()
Application.EnableEvents = True
End Sub
den Curser dort hinein setzen und F5 drücken (dadurch wird es ausgeführt).
Hallo,
da Excel (leider) keine RegEx unterstützt, würde ich Dir empfehlen auf LibreOffice Calc umzusteigen.
Libre Office unterstützt die Regulären Ausdrücke.
(Kostenlos zum runter laden hier:)
https://de.libreoffice.org/download/libreoffice-still/
Diese könnten z.B. so aussehen:
[0-9a-zA-Z0-9]*.
Grüße,
iMPerFekTioN
meint wohl: xl und sonst nix
(Mein Problem: reguläre Ausdrücke sind mir als Dilettanten ein böhmisches Dorf, kenn ich nur vom Hörensagen, fürchte, dass es dem Frager nicht anders geht.)
Das klingt nach Datenerfassung/-erhebung und wäre per Definition dann eher ein Thema für Access, mit dem sich das Vorhaben deutlich besser umsetzen lässt als mit Excel.
Also: Wenn Du nichts kompliziertes berechnen musst, dann wechsel das Programm.
Das geht nicht ohne weiteres. Du könntest dir mittels VBA eine Bibliothek einbinden, die reguläre Ausdrücke unterstützt. Das wäre aber relativ viel Aufwand für relativ wenig Nutzen.
Was noch ginge, wäre gegen ein Schema zu prüfen.
https://support.office.com/de-de/article/%C3%9Cberblick-%C3%BCber-XML-in-Excel-F11FAA7E-63AE-4166-B3AC-C9E9752A7D80
https://msdn.microsoft.com/de-de/library/aa159902(v=office.11).aspx
Dort kann man ebenfalls mit regulären Ausdrücken arbeiten.
Beispiel:
https://msdn.microsoft.com/en-us/library/ms256481(v=vs.110).aspx
So einfach geht das nicht!
RegEx ist aber ein gutes Stichwort!
Musst halt schauen ob du die irgendwie in VBA mit rein bekommst!
Ich habe jetzt mal einen Code zusammengestoppelt, der eigentlich klappen müsste. Er gehört in das Modul des Tabellenblattes:
Ist recht einfach gestrickt und lässt sich sicherlich optimieren und allgemeiner fassen, aber müsste eigentlich klappen. Teste mal ausführlich (Sicherheitskopie!).
Habe ich Dich richtig verstanden?