Validar direcciones de email en OpenOffice Calc con la función ESEMAIL()

Validar direcciones de email en OpenOffice Calc

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

Comentario De: veronica [Visitante]

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

27.02.14 @ 23:42
Comentario De: mara [Visitante]  

Hola Alguno me ayuda a pegar el macro en OO ??
Les estare eternamente agradecida porque tengo 10 mil mails pa chequearr!

01.07.15 @ 00:13
Comentario De: [Miembro]

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

01.07.15 @ 15:33
Comentario De: mara [Visitante]

Muchas Gracias slv-es, ya mismo me pongo en marchaaa.

01.07.15 @ 17:31


Form is loading...