Letzte Woche habe ich hier gezeigt, wie man eine einfache Pflichtfeldprüfung in Excel realisiert, so wie sie häufig in Formularen benutzt wird.
Auch diese Woche bleiben wir bei einem ähnlichen Thema:
Wie kann man mit Excel prüfen, ob in ein Formular/eine Zelle eine formal gültige E-Mail-Adresse eingegeben wurde?
Was auf den ersten Blick recht trivial aussieht, erweist sich bei näherer Betrachtung also etwas komplexer. Sei also hiermit gewarnt, wenn es gleich richtig zur Sache geht.
Und so geht’s:
Die E-Mail-Adresse
Wie eine E-Mail-Adresse grundsätzlich aussieht, davon hat jeder eine mehr oder weniger klare Vorstellung. Wie sie aber tatsächlich aussehen darf, darüber macht man sich eher selten Gedanken. Für unsere Gültigkeitsprüfung ist das aber sehr wohl wichtig.
Der technische Aufbau einer E-Mail-Adresse ist z.B. in Wikipedia nachzulesen. Wer es noch ein wenig technischer möchte, dem sei das RFC 5321 zum Simple Mail Transfer Protocol als Lektüre empfohlen.
Vereinfacht gesprochen besteht die E-Mail-Adresse aus dem sogenannten Lokalteil (also der Teil vor dem @-Zeichen) und einem Domainteil (der Teil nach dem @-Zeichen). Der Domainteil hat wiederum mindestens drei Elemente: Einen Hostnamen, einen Punkt und eine sogenannte Top-Level-Domain (kurz TLD), wie „de“ oder „com“.
Darüberhinaus gelten bestimmte Einschränkungen, was die Länge und die enthaltenen Zeichen angeht. Wir wollen uns bei der Prüfung auf die wichtigsten Elemente und Eigenschaften einer E-Mail-Adresse beschränken und die folgenden 10 Regeln überprüfen:
- Minimallänge der gesamten E-Mail-Adresse: 6
- Maximallänge der gesamten E-Mail-Adresse: 254
- @-Zeichen enthalten
- @-Zeichen nicht an erster oder letzter Stelle
- Kein Punkt an erster oder letzter Stelle
- Mindestens ein Punkt im Domaintail enthalten (und nicht unmittelbar nach dem @)
- Minimallänge des Lokalteils: 1
- Maximallänge des Lokalteils: 64
- Minimallänge der Top-Level-Domain (TLD): 2
- Nur gültige Zeichen verwendet
Eine stattliche Anzahl von Regeln, die wir nun Schritt für Schritt überprüfen wollen. Die gute Nachricht gleich vorweg: Die Beispieldatei, welche sämtliche hier vorgestellten Funktionen enthält, kannst du dir einfach hier herunterladen.
Regel 1: Minimallänge der gesamten E-Mail-Adresse
Eine E-Mail-Adresse muss mindestens 6 Zeichen lang sein. Dies ergibt sich aus den jeweils kürzest möglichen Einzelelementen (Hinweis: die TLD muss mindestens 2 Zeichen lang sein). Diese Prüfung ist mit Hilfe der LÄNGE-Funktion schnell vorgenommen. Das Ergebnis ist entweder WAHR, wenn die Minimallänge eingehalten wurde, oder FALSCH, wenn die Adresse zu kurz ist:
Regel 2: Maximallänge der gesamten E-Mail-Adresse
Eine E-Mail-Adresse darf insgesamt nicht länger als 254 Zeichen sein. Auch hier nutzen wir wieder die LÄNGE-Funktion:
Regel 3: Ist das @-Zeichen enthalten
Bekanntlich enthält jede E-Mail-Adresse den Klammeraffen. Daher benutzen wir die FINDEN-Funktion, um nach dem @-Zeichen zu suchen. Die Funktion gibt die Position an, an der sich der Klammeraffe befindet. Wird keiner gefunden, liefert die Funktion einen #WERT!-Fehler zurück. Da uns die Position nicht interessiert, sondern nur die Tatsache, ob überhaupt ein @ vorhanden ist, schließen wir das Ganze in die ISTZAHL-Funktion ein:
Regel 4: @-Zeichen nicht an erster oder letzter Stelle
Auch wenn das @-Zeichen vorhanden ist, darf es nicht an erster oder letzter Stelle der E-Mail-Adresse stehen. Dies prüfen wir mit Hilfe der LINKS- und RECHTS-Funktion. Die umgebende UND-Funktion liefert nur dann ein WAHR zurück, wenn beides nicht der Fall ist:
Regel 5: Kein Punkt an erster oder letzter Stelle
Analog zum @-Zeichen darf eine E-Mail-Adresse auch nicht mit einem Punkt beginnen oder enden. Die Prüffunktionen sind wieder identisch:
Regel 6: Mindestens ein Punkt im Domaintail enthalten
Jetzt wird es ein wenig spannender: Im Domainteil muss (mindestens) ein Punkt vorhanden sein, darf aber nicht unmittelbar nach dem @-Zeichen stehen. Da es auch Domains gibt, die mehr als einen Punkt enthalten, ist die Prüfung ein wenig kniffeliger:
Was passiert hier?
Sehen wir uns die Formel von innen nach außen an. Die innere FINDEN-Funktion liefert die Position des @-Zeichens. Dies ist wichtig, da wir ja den Punkt im Domainteil suchen – also HINTER dem @-Zeichen. Allerdings darf der Punkt nicht unmittelbar hinter diesem @-Zeichen liegen, daher addieren wir noch den Wert 2 zu dieser berechneten Position.
Die äußere FINDEN-Funktion sucht nun nach dem Punkt, beginnt bei der Suche aber an der gerade berechneten Position. Bei der Beispieladresse „ich.auch@richtig.co.uk“ beginnt die Suche also an Position 11 (@-Zeichen liegt an Position 9, dazu noch 2 addieren). Wenn dann noch ein Punkt gefunden wird, wird wieder die Position zurückgeliefert. Bei mehreren Punkten wird nur der erste berücksichtigt, was uns aber ausreicht. Im Beispiel „ich.auch@richtig.co.uk“ also die Position 17.
Und zuletzt prüft die ISTZAHL-Funktion wieder, ob überhaupt ein Punkt (und damit ein Positionswert) gefunden wurde oder ob die innere FINDEN-Funktion stattdessen schon einen #WERT!-Fehler zurückgeliefert hat.
Regel 7: Minimallänge des Lokalteils
Der Lokalteil – also der Teil vor dem @-Zeichen – muss mindestens 1 Zeichen lang sein. Im Umkehrschluß heißt dass, das @-Zeichen muss sich an Position 2 oder größer befinden:
Regel 8: Maximallänge des Lokalteils
Laut Regelwerk darf der Lokalteil maximal 64 Zeichen lang sein. Auch hier prüfen wir wieder den Umkehrschluß, d.h. das @-Zeichen darf höchstens an Position 65 stehen:
Regel 9: Minimallänge der Top-Level-Domain (TLD)
Die Top-Level-Domain, also der Teil nach dem letzten Punkt, muss mindestens 2 Zeichen lang sein. Hier wird die Prüfung wieder etwas komplizierter, da es auch E-Mail-Adressen mit Subdomains gibt und damit mehrere Punkte im Domainteil enthalten sein können:
Zerlegen wir zum besseren Verständnis dieses Formelmonster wieder in seine Bestandteile:
Zunächst berechnen wir die Länge der Original-E-Mail-Adresse. Im Beispiel also 14. Als nächstes entfernen wir alle Punkte mit Hilfe der WECHSELN-Funktion und ermitteln dann erneut die Länge, was in unserem Fall also 12 ergibt. 14 minus 12 = 2, somit wissen wir, dass die Adresse 2 Punkte enthält.
Dies ist wichtig, da uns ja nur der letzte (hier also der zweite) Punkt interessiert.
Jetzt kommt im Bild in Zeile 17 ein kleiner Trick:
Wir wollen nun lediglich den zweiten Punkt durch ein Sonderzeichen ersetzen. Kein Problem für die WECHSELN-Funktion. Hier kann man nämlich nicht nur angeben, was man wodurch ersetzen möchte, sondern auch ab welchem Vorkommen des gesuchten Zeichens wir mit dem Ersetzen beginnen wollen:
=WECHSELN(Text;Alter Text;Neuer Text;ntes Auftreten)
Als Sonderzeichen brauchen wir eines, welches in einer E-Mail-Adresse unzulässig ist und damit normalerweise nicht vorkommt (welche Zeichen zulässig sind, erfährst du in der 10. Regel). Ich habe mir das ASCII-Zeichen 8 ausgesucht, da man dieses schön erkennen kann: Weißer Punkt auf schwarzem Hintergrund.
Das Ergebnis sieht man im Bild oben in Zelle B17.
In der Zelle B18 prüfen wir, an welcher Position nun dieses gerade eingefügte Sonderzeichen vorkommt. In unserem Beispiel also an Position 12.
Danach stellen wir noch eine letzte Rechnung an: Ist die Gesamtlänge minus der Länge bis zum Sonderzeichen größer oder gleich 2. Mit anderen Worten: Ist der Teil hinter dem Sonderzeichen, also die TLD, länger als 2 Zeichen.
Ich weiß, das war eine knackige Prüfung, die ein wenig Hirnschmalz erfordert.
Regel 10: Nur gültige Zeichen verwendet
Die krönende Regel habe ich mir bis zum Schluß aufgehoben: Werden in der E-Mail-Adresse auch nur gültige Zeichen verwendet? Dazu muss man wissen, dass nur die ASCII-Zeichen 32 – 127 zulässig sind. Im Klartext:
A-Za-z0-9.!#$%&’*+-/=?^_`{|}~
Alle anderen Zeichen dürfen in einer E-Mail-Adresse nicht vorkommen.
Hinweis: Die in dieser Formel verwendete geniale SUMMENPRODUKT-Funktion habe ich mir nicht selbst ausgedacht, sondern auf exelformeln.de gefunden, eine Seite, die es so leider nicht mehr gibt.
Also wieder Schritt für Schritt:
In der Zeile 11 lösen wir das erste Zeichen, nämlich den Buchstaben „m“ mit Hilfe der TEIL-Funktion aus der E-Mail-Adresse heraus:
=TEIL(Text;Erstes Zeichen;Anzahl Zeichen)
Die E-Mail-Adresse hat in unserem Beispiel eine Länge von 17 Zeichen. Für den zweiten Parameter „Erstes Zeichen“ verwenden wir anstelle eines festen Wertes die ZEILE-Funktion „=ZEILE(1:17)“. Dies hat später in der SUMMENPRODUKT-Funktion den Vorteil, dass jedes einzelne der 17 Zeichen nacheinander verwendet wird.
In der Zeile 12 prüfen wir dann mit der FINDEN-Funktion, ob der Buchstabe „m“ in der Liste der erlaubten Zeichen enthalten ist. Dies ist hier der Fall, nämlich an Position 39. Dabei spielt dieser Wert für unsere Zwecke überhaupt keine Rolle, wichtig ist nur, dass überhaupt ein Wert gefunden wird.
In Zeile 13 prüft die SUMMENPRODUKT-Funktion dann das Vorhandensein jedes einzelnen Zeichens der E-Mail-Adresse in meiner Liste mit den gültigen Zeichen. Die dabei ermittelten Positionswerte ergeben in der Summe dann den Wert 801 (auch dieser Wert an sich ist nicht von Bedeutung; Hauptsache, es ist wieder überhaupt ein Wert).
In Zeile 14 prüfen wird dann, ob die SUMMENPRODUKT-Funktion überhaupt eine Zahl geliefert hat. Wenn ja, dann geben wir mit der WENN-Funktion den Wert WAHR zurück, ansonsten FALSCH.
Im Bild oben habe ich das Ganze auch nochmal in der Formelauswertung dargestellt, so dass es vielleicht ein wenig leichter nachvollziehbar wird.
Zusammenfassung
Nun haben wir also mit Hilfe von 10 Regeln die formale Gültigkeit einer E-Mail-Adresse überprüft. Erst wenn alle 10 Prüfungen den Wert WAHR ergeben, handelt es sich um eine gültige Adresse:
(Hinweis: In Kürze erscheint hier auf dem Blog ein ausführlicher Gastartikel zum Thema SUMMENPRODUKT).
Herzlichen Glückwunsch, wenn du bis hierher durchgehalten hast! Das war wirklich ein schönes Stück Arbeit für eine vermeintlich so einfache Angelegenheit.
Auch wenn diese Prüfung nicht 100%ig vollständig ist, sollten damit zumindest die wichtigsten Fehleingaben bei einer E-Mail-Adresse abgefangen werden.
P.S. Die Lösung ist immer einfach. Man muss sie nur finden.
(Alexander Solschenizyn)
P.P.S. Das Problem sitzt meistens vor dem Computer.
@Zeile17: Weniger statisch und umständlich wäre
=WENN(UND(B6:B15);"gültig";"ungültig")
Bei mehr oder weniger Kriterien muss nur der Bereich „B6:B15“ angepasst werden, nicht aber die Anzahl „=10“.
Hallo Andi,
stimmt, die UND-Variante ist deutlich flexibler und kürzer. Danke dafür.
Schöne Grüße,
Martin
Ich habe mal alle Regeln in eine große Formel gepackt. Dabei gehe ich von einer Tabelle mit vier Spalten (A-D) aus. Spalte A = Name, Spalte B = Vorname, Spalte C = Mail-Adresse, Spalte D = unsere Checker-Formel. Zeile 1 enthält die Spaltenbeschriftungen (= Kopfspalten). Das heißt, die erste zu prüfende Mail-Adresse befindet sich in Zelle D2, die nächste in D3, dann D4 und so weiter. Die Formel, die ich hier poste, wird in C2 eingetragen und dann bis zur letzten benötigten Zelle/Zeile runtergezogen. In einem weiteren Tabellen-Blatt mit dem Namen „Hilfs-Tab“ befindet sich in Zelle A2 die unerlaubten Zeichen (letzte Regel).
Das sieht dann so aus:
=WENN(ISTFEHLER(LÄNGE(C2)-FINDEN(ZEICHEN(8);WECHSELN(C2;“.“;ZEICHEN(8);LÄNGE(C2)-LÄNGE(WECHSELN(C2;“.“;““))))>=2);“ungültig“;WENN(UND(LÄNGE(C2)>=6;LÄNGE(C2)<=254;ISTZAHL(FINDEN("@";C2));UND(LINKS(C2;1)“@“;RECHTS(C2;1)“@“);UND(LINKS(C2;1)“.“;RECHTS(C2;1)“.“);ISTZAHL(FINDEN(„.“;C2;FINDEN(„@“;C2)+2));UND(FINDEN(„@“;C2)>1);UND(FINDEN(„@“;C2)=2;WENN(ISTZAHL(SUMMENPRODUKT(FINDEN(TEIL(C2;ZEILE($1:$255);1);’Hilfs-Tab‘!$A$2;1)));WAHR;FALSCH));“gültig“;“ungültig“))
Die erste WENN-/ISTFEHLER-Abfrage benötige ich z.B. zur Prüfung solcher Zell-Inhalte: kino@arthaus-entenhausen,de
Argh! Da habe ich in der Eile C und D vertauscht. Jetzt nochmals richtig:
Dabei gehe ich von einer Tabelle mit vier Spalten (A-D) aus.
Spalte A = Name, Spalte B = Vorname, Spalte C = Mail-Adresse, Spalte D = unsere Checker-Formel.
Zeile 1 enthält die Spaltenbeschriftungen (= Kopfspalten).
Das heißt, die erste zu prüfende Mail-Adresse befindet sich in Zelle C2, die nächste in C3, dann C4 und so weiter. Die Formel, die ich hier poste, wird in D2 eingetragen und dann bis zur letzten benötigten Zelle/Zeile runtergezogen.
In einem weiteren Tabellen-Blatt mit dem Namen „Hilfs-Tab“ befindet sich in Zelle A2 die unerlaubten Zeichen (letzte Regel).
Das sieht dann so aus:
=WENN(ISTFEHLER(LÄNGE(C2)-FINDEN(ZEICHEN(8);WECHSELN(C2;“.“;ZEICHEN(8);LÄNGE(C2)-LÄNGE(WECHSELN(C2;“.“;““))))>=2);“ungültig“;WENN(UND(LÄNGE(C2)>=6;LÄNGE(C2)<=254;ISTZAHL(FINDEN("@";C2));UND(LINKS(C2;1)“@“;RECHTS(C2;1)“@“);UND(LINKS(C2;1)“.“;RECHTS(C2;1)“.“);ISTZAHL(FINDEN(„.“;C2;FINDEN(„@“;C2)+2));UND(FINDEN(„@“;C2)>1);UND(FINDEN(„@“;C2)=2;WENN(ISTZAHL(SUMMENPRODUKT(FINDEN(TEIL(C2;ZEILE($1:$255);1);’Hilfs-Tab‘!$A$2;1)));WAHR;FALSCH));“gültig“;“ungültig“))
Die erste WENN-/ISTFEHLER-Abfrage benötige ich z.B. zur Prüfung solcher Zell-Inhalte: kino@arthaus-entenhausen,de
Hallo Martin
Zuallererst möchte ich zum Ausdruck bringen, dass ich ob der aufgezeigten Lösung ziemlich beeindruckt bin!
Kompliment dazu!
Ich habe eine ganze Liste von E-Mail-Adressen zu überprüfen. Also z.B. von A1 bis A500. Wie könnte eine Lösung aussehen, damit ich z.B. in der Spalte B ausgeben kann, ob die E-Mail-Adresse gültig oder ungültig ist?
Sind sämtliche 10 Regeln in eine Formel zu packen oder gibt es hierzu elegantere Lösungen?
Herzlichen Dank für dein Feedback.
Beste Grüsse, Urs
Hallo Urs,
vielen Dank für das Lob, das freut mich sehr!
Ich persönlich würde die Regeln nicht in eine einzige Formel packen, das wird einfach zu komplex und ist zu wenig transparent. Mein Vorschlag wäre, jede Regel in eine eigene Spalte neben die E-Mail-Adressen zu packen und dann in einer zusätzlichen Spalte die Ergebnisse zusammenfassen:
Spalte A = E-Mail-Adresse
Spalten B – K = die 10 Prüfregeln
Spalte L = Gesamtprüfung, ob alle einzelnen Regeln WAHR ergeben.
Dann sieht man im Zweifel auch, wo es genau hakt.
Schöne Grüße,
Martin
Cool!
Vielen Dank für die superschnelle Antwort!
Werde ich gerne so umsetzen.
All the best, Urs
Dies dürfte wohl das Format sein, in dem die meisten Leser diese Prüfungen umsetzen wollen würden. Dafür möchte ich jedoch eine Änderung an Regel 10 empfehlen:
=WENN(ISTZAHL(SUMMENPRODUKT(SUCHEN(TEIL(B1;ZEILE($1:$254);1);$A$3;1)));WAHR;FALSCH)
anstatt
=WENN(ISTZAHL(SUMMENPRODUKT(SUCHEN(TEIL(B1;ZEILE(1:254);1);A3;1)));WAHR;FALSCH)
(wobei B1 die zu prüfende Adresse referenziert, während A3 die Kette gültiger Zeichen enthält (dazu gleich noch mehr))
Ohne die $-Zeichen zählt Excel beim Übertragen der Formel in darunterstehende Zellen an dieser Stelle pro Zeile um 1 weiter (1:254, 2:255, 3:256 usw.), mit jeder neuen Zeile wird also erst ab der 2., 3. usw. Stelle der Mailadresse (B1) geprüft. Auch der Verweis auf A3 würde sich auf A4, A5 usw. verändern.
Ausserdem ist in der Beispieldatei B090_E-Mail-Adresse-2.xlsx ein Fehler:
Auf dem Tabellenblatt „Zusammenfassung“ erfolgt die Prüfung 10 (gültige Zeichen) gegen die Zelle A3 mit dem Inhalt
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0-9.!#$%&’*+-/=?^_`{|}~@
Korrekt ist die Zeichefolge auf Tabellenblatt „R10a“ in Zelle A2:
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789.!#$%&’*+-/=?^_`{|}~@
Ansonsten Danke für diese tolle Seite hier!
n.
Hallo Nico,
vielen Dank für das Feedback und deine Ergänzungen. Und die Beispieldatei habe ich jetzt auch auf die andere Zeichenfolge angepasst.
Schöne Grüße,
Martin
Hallo Martin Weiß,
vielen Dank für diesen tollen und wirklich hilfreichen Beitrag. Ich habe nur eine Sache, die ich anmerken möchte (oder die ich vielleicht nicht so ganz verstanden habe.)
Bei Prüfung der Regeln 7 (Minimallänge des Lokalteils), 8 (Maximallänge des Lokalteils) und 9 (Minimallänge der Top-Level-Domain (TLD)) bekomme ich zum Beispiel beim Ausgangswert „MMAYER“ nicht das Ergebnis „Falsch“, sondern „#WERT“. Dieses Ergebnis wird auch in der Zusammenfassung der Prüfung übernommen. Ich habe mir nun geholfen, indem ich bei den drei betroffenen Regeln noch eine WENN()-Funktion einfüge. Bei 7 und 8 prüfe ich, ob ein „@“-Zeichen enthalten ist und bei 9 ein Punkt.
Aber vielleicht gibt es da einen weniger komplizierten Lösungsweg?
Über eine Rückmeldung würde ich mich daher sehr freuen.
Viele Grüße!
Max
P.S: Den Newsletter werde ich abonnieren 🙂
Hallo Max,
ja, die Regeln 7 – 9 gehen in meinem Beispiel grundsätzlich davon aus, dass ein @-Zeichen vorhanden. Falls nicht – wie bei „MMAYER“ – kommt es zu besagtem #WERT-Fehler. Die von Dir vorgeschlagene Prüfung mit der WENN-Funktion ist somit das richtige Mittel. Etwas anderes würde ich auch nicht machen.
Schöne Grüße,
Martin
Ich habe das Ganze als mehr oder weniger kompletter Neuling verfolgt und viel gelernt. Ich fürchte, das ist in Euren Profi-Augen eine echte Anfänger-Frage, dennoch: Wie sähe das denn bei 7,8 oder 9 am Ende aus, also mit der Wenn-Bedingung?
Hallo Antonio,
die Regeln könnten beispielsweise so aussehen:
Regel 7: =WENNFEHLER(UND(FINDEN(„@“;B1)>1);FALSCH)
Regel 8: =WENNFEHLER(UND(FINDEN(„@“;B1)<=65);FALSCH) Regel 9: =WENNFEHLER(LÄNGE(B1)-FINDEN(ZEICHEN(8);WECHSELN(B1;".";ZEICHEN(8);LÄNGE(B1)-LÄNGE(WECHSELN(B1;".";""))))>=2;FALSCH)
Also jeweils eine alles umschließende WENNFEHLER-Funktion, die statt eines Fehlerwerts eben FALSCH zurückliefert.
Schöne Grüße,
Martin
Wofür das UND für nur ein Argument bei Regel7?
Hallo Arno Nühm ;-),
stimmt, bei Regel 7 (und auch 8) ist das UND nicht nötig.
Schöne Grüße,
Martin
Hallo Martin,
vielen Dank für die ausführliche Prüfung, habe mich schon lange davor gedrückt in Excel.
Mein Excel 2018 mag in Zelle A3 die Zahlen alle aufgereiht 0123456789 und nicht in regex schreibweise 0-9
Meine Newsletterdatenbankprüfung findet bei alles WAHR noch E-Mailadressen mit ß ö
name@domain@tld
name.@domain.tld
Hallo Rainer,
ich wusste gar nicht, dass es schon Excel 2018 gibt 🙂
Aber ich gebe zu, dass die Prüfungsregeln nicht 100%ig wasserdicht sind. Es wird immer wieder Fälle wie von Dir beschrieben geben, die durchrutschen.
Schöne Grüße,
Martin
in der Office 365 die Version 1802
Danke & schönes Wochenende
Rainer
Hammer. Wie viel Arbeit Du mir damit erleichtert hast (Prüfung von ca. 65.000 Adressen).
Dankesehr!!
Freut mich zu hören!
Schöne Grüße,
Martin
Der Beitrag ist ja schon älter, aber weiterhin aktuell und für mich eine Goldgrube 😀
Vielen Dank für das Teilen und auch die guten Ergänzungen der anderen Besucher:innen!
Hallo Fantske,
freut mich zu hören. Manche Tipps sind tatsächlich zeitlos 🙂
Schöne Grüße,
Martin