Dateneingabeformat in Excel definieren?

5 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Mit RegEx hat Excel Probleme. Kannst ja mal nach "Excel Regex" googeln.
Mein erster Fund:

https://stackoverflow.com/questions/22542834/how-to-use-regular-expressions-regex-in-microsoft-excel-both-in-cell-and-loops

Ich schau mal ob ich was für Dich zusammenstricken kann. Glaube aber eher nicht. Vielleicht hilft ja ein anderer Experte?

Woher ich das weiß:Berufserfahrung – IT-Administrator (i.R.)
Oubyi, UserMod Light  30.05.2017, 16:09

Ich habe jetzt mal einen Code zusammengestoppelt, der eigentlich klappen müsste. Er gehört in das Modul des Tabellenblattes:

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
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
End If
End Sub

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?

2
syrena1992 
Fragesteller
 30.05.2017, 17:08
@Oubyi, UserMod Light

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).

0
Oubyi, UserMod Light  30.05.2017, 17:24
@syrena1992 ps.

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.

0
Iamiam  31.05.2017, 00:16
@Oubyi, UserMod Light

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!

1
Oubyi, UserMod Light  31.05.2017, 01:10
@Iamiam

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 🙂

0
syrena1992 
Fragesteller
 31.05.2017, 11:05
@Oubyi, UserMod Light

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?

0
Oubyi, UserMod Light  31.05.2017, 12:35
@syrena1992

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).

0

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

Woher ich das weiß:Berufserfahrung – Eigenständiges lernen während und nach meiner Ausbildung
Suboptimierer  30.05.2017, 16:13

Top! Da hat einer die Scheuklappen abgelegt.

0
iMPerFekTioN  30.05.2017, 17:16

Scheuklappen?😂

0
Iamiam  31.05.2017, 00:23
@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.)

0
iMPerFekTioN  31.05.2017, 07:49

Das ist kein Problem,
Die kann man erklären:)

0

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.

Woher ich das weiß:Berufserfahrung – Programmierer

So einfach geht das nicht!

RegEx ist aber ein gutes Stichwort!

Musst halt schauen ob du die irgendwie in VBA mit rein bekommst!