Validar direcciones de email en OpenOffice Calc con la función ESEMAIL()
En recientes fechas una persona muy querida y respetada por mí me encargó, y de forma muy directa, que adaptase para Apache Openoffice una macro que él habia desarrollado para Excel.
El trabajo fué sencillo: sólo tuve que copiar y pegar el código, con lo que se demuestra que ciertas macros sí que son completamente compatibles entre ambas suites, pero como bien saben los programadores de macros que han migrado de una a la otra, es sólo la excepción que cumple la regla.
La macro se creó frente a la necesidad de poder validar direcciones de correo destinadas a campañas de marketing, procedentes de fuentes dispersas en tablas de hojas de cálculo, documentos copiados desde la web y directorios diversos.
Estas direcciones de email suelen presentar abuntantes errores de transcripción, con nombres de dominio mal escritos, espacios traicioneros, falta o exceso de puntos o de arrobas, etc.
Así que Ismael, que así se llama la persona de quien hablo, se puso a trabajar en una macro que verificase, al menos que:
- Sólo exista una arroba en la dirección de correo
- Que haya un punto tras la arroba, y no sea consecutivo
- Que no contenga dos puntos consecutivos
- Que sólo contenga carácteres ASCII válidos para direcciones de correo (a-z, A-Z, 0-9, @, punto, guión bajo y guión)
La macro, como bien dice Ismael, no está completa, pues no valida los nombres de dominio internacionalizados de las direcciones, ni su existencia. Pero, y supongo que coincidimos en ello, ya es un buen primer paso para filtrar direcciones incorrectas.
Pues sin más, os dejo la macro, que tendreis que copiar y pegar en vuestro Apache OpenOffice, cosa que supongo no os será difícil.
Rem ***** BASIC *****
Function ESEMAIL(email As String) As String
' Comprueba que el argumento es una dirección de email válida
'
' Cosas a comprobar:
' - una arroba y sólo una
' - debe haber un punto después de la arroba (pero no juntos)
' - no puede haber un punto junto a otro
' - caracteres admitidos (A-Z, a-z, 0-9, @, . (punto), _ (guión bajo), - (guión)
'
' Para mejoras futuras, estudiar RFC 3490 - Internationalizing Domain Names in Applications (IDNA):
' http://www.faqs.org/rfcs/rfc3490.html
' Adaptada a Apache OpenOffice por sugerencia de Ismael Fanlo
' sugerencia que fue expresada en http://superalumnos.net/validar-direcciones-de-email-en-excel-con-la-udf-esemail
' Adaptada por SLV-es
' Sólo tuve que copiar y pegar :) y modificar algunas cosillas a mi gusto
' Gracias, Ismael.
' Modificaciones
' En lugar de devolver true o falsa, devuelve una cadena indicando el error encontrado
' o nada si está correcto
Dim i As Integer
Dim char As String
Dim charvalidos As String
Dim sinarroba As String
Dim espunto As Boolean
Dim espuntoanterior As Boolean
Dim haypuntos As Boolean
Dim result As String
charvalidos = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789._-@"
result = ""
espunto = False
espuntoanterior = False
haypuntos = False
' detecta más de una arroba
sinarroba = Replace(email, "@", "")
If Len(email) - Len(sinarroba) > 1 Then
result = result & "Dos o más @. "
End If
' bucle de final a principio de la cadena
For i = Len(email) To 1 Step -1
' si el caracter anterior era un punto
If espunto Then
espuntoanterior = True
espunto = False
Else
espuntoanterior = False
End If
' obtiene carácter
char = Mid(email, i, 1)
' no es un caracter válido
If InStr(charvalidos, char) = 0 Then
result = result & "Caracter no válido: " & IIf(char=" ","espacio",char) & ". "
Exit For
End If
' si es un punto
If char = "." Then
' si el anterior también era un punto
If espuntoanterior Then
result = result & "Punto incorrecto. "
Exit For
Else
espunto = True
haypuntos = True
End If
End If
' si es una arroba, debería haber un punto antes
If char = "@" Then
If Not haypuntos Then
result = result & "Falta el punto."
Exit For
End If
End If
Next i
ESEMAIL = result
End Function
Por mi parte he modificado un poco la macro original, aportando mi visión personal, de forma que en lugar de devolver un verdadero o false según la dirección sea válida o no, la macro devuelve un texto con el error encontrado o un texto vacío si no encontró error.
Para utilizar la macro, tan sólo teneis que insertar la fórmula =ESEMAIL(A1) en la celda B1 suponiendo que la dirección de email está en la celda A1.
La macro devolverá en esa celda un texto describiendo el error o errores encontrados, o dejará la celda vacía si no ha encontrado ninguno.
Así que con esto considero que el encargo ha sido cumplido.
Sólo me queda agradecer a Ismael Fanlo, que para mí ha sido un ejemplo y la persona que sin saberlo inspiró el nacimiento de open-office.es, su dedicación desde hace años, a hacer el software libre más y más grande día a día, con su esfuerzo y su generosidad.
Si quereis leer su artículo, pasaros por SuperAlumnos.net. Visita recomendada, qué digo, ¡¡¡¡ visita obligada !!!!
4 comentarios
jajaja ay ya le entendí ñ.ñ
lo puse así :P
' detecta más de una arroba
sinarroba = Replace(email, "@", "")
If Len(email) - Len(sinarroba) > 1 Then
result = result & "Dos o más @ "
End If
sinarroba = Replace(email, "@", "")
If Len(email) - Len(sinarroba) = 0 Then
result = result & "Falta el @ "
End If
Hola Alguno me ayuda a pegar el macro en OO ??
Les estare eternamente agradecida porque tengo 10 mil mails pa chequearr!
Hola mara
En este enlace, en el apartado Copiar la macro desde el documento a Mis Macros y viceversa, tienes información que te puede ayudar.
Saludos
Muchas Gracias slv-es, ya mismo me pongo en marchaaa.