PDA

Vollständige Version anzeigen : VBA und reguläre Ausdrücke (Beispiel: Mailadresse)


Arne Dieckmann
07.03.2007, 18:25
Eingaben mit regulären Ausdrücken kontrollieren

Mit der Funktion <span style="font-family:Courier New;color:#000080;">rgxValidate</span> von Validation with Regular Expressions (http://www.mvps.org/access/modules/mdl0063.htm) ist es möglich, Eingaben, die einem bestimmten Muster unterliegen, auf Gültigkeit zu überprüfen. Als Beispiel wird das Muster/der reguläre Ausdruck für eine gültige Mailadresse (Konstante <span style="font-family:Courier New;color:#000080;">rgxMail</span>) aufgeführt.

Man kopiert also zunächst die o.g. Funktion in ein globales Modul, speichert dieses unter einem Namen wie z.B. <span style="font-family:Courier New;color:#000080;">mdlExpr</span>. Danach fügt man noch folgende Konstante in den Deklarationsbereich des Moduls ein, sodass man zukünftig Mailadressen sehr einfach kontrollieren kann:

<div><link href="http://www.ms-office-forum.net/forum/externals/codeconv.css" rel="stylesheet"><span class="TOKEN">Option</span> <span class="TOKEN">Compare</span> <span class="TOKEN">Database</span>
<span class="TOKEN">Option</span> <span class="TOKEN">Explicit</span>
<span class="TOKEN">Public</span> <span class="TOKEN">Const</span> rgxMail = &quot;^[a-zA-Z][\w\.-]*[a-zA-Z0-9]@[a-zA-Z0-9][\w\.-]*[a-zA-Z0-9]\.[a-zA-Z][a-zA-Z\.]*[a-zA-Z]$&quot;</div>



Wenn man nun checken möchte, ob in dem Textfeld "txtMail" eine gültige Mailadresse eingegeben wurde, braucht man nur noch den folgenden Code beim Ereignis "Vor Aktualisierung":
<div><link href="http://www.ms-office-forum.net/forum/externals/codeconv.css" rel="stylesheet"><span class="TOKEN">Private Sub</span> txtMail_BeforeUpdate(Cancel <span class="TOKEN">As</span> <span class="TOKEN">Integer</span>)
&nbsp;
<span class="TOKEN">If</span> <span class="TOKEN">Not</span> rgxValidate(Me!txtMail, rgxMail) <span class="TOKEN">Then</span>
MsgBox &quot;Ung&uuml;ltige Mailadresse!&quot;, vbCritical, &quot;Eingabekontrolle&quot;
Cancel = <span class="TOKEN">True</span>
<span class="TOKEN">End</span> <span class="TOKEN">If</span>
&nbsp;
<span class="TOKEN">End</span> <span class="TOKEN">Sub</span></div>


Weitere Anwendungsmöglichkeiten findet man unter Validation with Regular Expressions (http://www.mvps.org/access/modules/mdl0063.htm). Näheres zu regulären Ausdrücken gibt es unter Regular-Expressions.info - Regex Tutorial, Examples and Reference - Regexp Patterns (http://www.regular-expressions.info/).


<div style="padding: 5px 7px; border: 1px solid #BBCCE9; background-color: #F5F8FD; border-left: 5px solid #8CA9DA; font-size: 95%;"><img class="inlineimg" src="/daten/icons/info.gif" /> Hinweis: Die Funktion <span style="font-family:Courier New;color:#000080;">rgxValidate</span> wird aufgrund der Bestimmungen unter Terms Of Use (http://www.mvps.org/access/terms.htm) hier nicht aufgeführt.</div>

wusaa
12.04.2007, 09:51
Hallo Leute,

ich finde diese Funktion sehr cool und habe sie in mein Formular eingebaut, klappt auch wunderbar bis auf ein fehler dir mir ab und an einschleicht :o)

Es ist so, wenn ich durch mein Formular per tab durchführe und ich nichts in das txt_mailfeld gebe, funktioniert alles reibungslos.

doch sobald mal eine eingabe gemacht worden ist und ich dieses textfeld leere kommt diese fehlermeldung und es wird eine gültige mailadresse erwartet.
wisst ihr wie ich das im code mit einbaue dass diese Situation auch abgefangen werden kann?

Arne Dieckmann
12.04.2007, 17:48
Am besten vorher testen, ob es etwas zu kontrollieren gibt (ungetestet):
Private Sub txtMail_BeforeUpdate(Cancel As Integer)

If Nz(Me!txtMail,"")<>"" Then
If Not rgxValidate(Me!txtMail, rgxMail) Then
MsgBox "Ungültige Mailadresse!", vbCritical, "Eingabekontrolle"
Cancel = True
End If
End If

End Sub

wusaa
13.04.2007, 09:37
Guten Morgen Arne,
also nach meinem kurzen Test hat alles geklappt.

Danke dir

Sascha Trowitzsch
14.10.2007, 14:19
Ich habe hier einen Alternative mit vollständigem Code - ohne irgendwelche Terms Of Use ;) :

Function IsValidEmailAddress(ByVal sAddress As String) As Boolean
Const EmailPattern = "^([a-zA-Z0-9_\-\.\+]+)" & _
"@(((25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9])\." & _
"(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\." & _
"(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[1-9]|0)\." & _
"(25[0-5]|2[0-4][0-9]|[0-1]{1}[0-9]{2}|[1-9]{1}[0-9]{1}|[0-9])|" & _
"(\w+((-\w+)|(\w*))\.)+[a-z]{2,4}))$"
Dim CRegExp As Object


On Error Resume Next
Set CRegExp = CreateObject("VBScript.RegExp")
If CRegExp Is Nothing Then
IsValidEmailAddress = True
Msgbox "Eine Email-Adressvalidierung kann nicht durchgeführt werden," & vbCrLf & _
"weil die Komponente VBScript.RegExp im System fehlt.", vbExclamation, "Hinweis:"
Exit Function
End If

On Error GoTo Fehler
With CRegExp
.Pattern = EmailPattern
.Global = False
.IgnoreCase = True
IsValidEmailAddress = .Test(sAddress)
End With

Ende:
On Error Resume Next
Set CRegExp = Nothing
Exit Function

Fehler:
Msgbox Err.Description, vbCritical, "Emailvalidierung - Fehler:"
Resume Ende
End Function

Ich gebe aber zu, dass ich das Pattern nicht selbst ausgedacht habe, sondern es von hier kommt:
http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=26930&lngWId=1

Ciao, SAscha