Saltar al contenido

¿Existe una fórmula de Excel para identificar caracteres especiales en una celda?

Nuestros mejores programadores agotaron sus depósitos de café, por su búsqueda noche y día por la respuesta, hasta que Mauricio encontró la solución en Gitea así que hoy la compartimos aquí.

Solución:

¿Sin código? Pero es tan corto y fácil y hermoso y… 🙁

Su patrón RegEx [^A-Za-z0-9_-] se utiliza para eliminar todos los caracteres especiales en todas las celdas.

Sub RegExReplace()

    Dim RegEx As Object
    Set RegEx = CreateObject("VBScript.RegExp")
    RegEx.Global = True

    RegEx.Pattern = "[^A-Za-z0-9_-]"
    For Each objCell In ActiveSheet.UsedRange.Cells
        objCell.Value = RegEx.Replace(objCell.Value, "")
    Next

End Sub

Editar

Esto es lo más cerca que puedo llegar a su pregunta original.

ingrese la descripción de la imagen aquí

El segundo código es una función definida por el usuario. =RegExCheck(A1,"[^A-Za-z0-9_-]") con 2 argumentos. La primera es la celda a comprobar. El segundo es el patrón RegEx para verificar. Si el patrón coincide con alguno de los caracteres de su celda, devolverá 1; de lo contrario, 0.

Puede usarlo como cualquier otra fórmula normal de Excel si primero abre el editor de VBA con alternativa+F11inserte un nuevo módulo (!) y pegue el código a continuación.

Function RegExCheck(objCell As Range, strPattern As String)

    Dim RegEx As Object
    Set RegEx = CreateObject("VBScript.RegExp")
    RegEx.Global = True
    RegEx.Pattern = strPattern

    If RegEx.Replace(objCell.Value, "") = objCell.Value Then
        RegExCheck = 0
    Else
        RegExCheck = 1
    End If

End Function

Para los usuarios nuevos en RegEx, explicaré su patrón: [^A-Za-z0-9_-]

[] stands for a group of expressions
^ is a logical NOT
[^ ] Combine them to get a group of signs which should not be included
A-Z matches every character from A to Z (upper case)
a-z matches every character from a to z (lower case)
0-9 matches every digit
_ matches a _
- matches a - (This sign breaks your pattern if it's at the wrong position)

Usando algo similar al código de nixda, aquí hay una función definida por el usuario que devolverá 1 si la celda tiene caracteres especiales.

Public Function IsSpecial(s As String) As Long
    Dim L As Long, LL As Long
    Dim sCh As String
    IsSpecial = 0
    For L = 1 To Len(s)
        sCh = Mid(s, L, 1)
        If sCh Like "[0-9a-zA-Z]" Or sCh = "_" Then
        Else
            IsSpecial = 1
            Exit Function
        End If
    Next L
End Function

Las funciones definidas por el usuario (UDF) son muy fáciles de instalar y usar:

  1. ALT-F11 abre la ventana VBE
  2. ALT-I ALT-M abre un nuevo módulo
  3. pegue las cosas y cierre la ventana de VBE

Si guarda el libro de trabajo, la UDF se guardará con él. Si está utilizando una versión de Excel posterior a 2003, debe guardar el archivo como .xlsm en lugar de .xlsx

Para eliminar la UDF:

  1. abrir la ventana VBE como se muestra arriba
  2. borrar el código
  3. cerrar la ventana VBE

Para usar la UDF desde Excel:

=EsEspecial(A1)

Para obtener más información sobre las macros en general, consulte:

http://www.mvps.org/dmcritchie/excel/getstarted.htm

y

http://msdn.microsoft.com/en-us/library/ee814735(v=office.14).aspx

y

http://www.cpearson.com/excel/WritingFunctionsInVBA.aspx

para detalles sobre UDF

Las macros deben estar habilitadas para que esto funcione!

Aquí hay una solución de formato condicional que marcará los registros con caracteres especiales.

Simplemente aplique una nueva regla de formato condicional a sus datos que use la fórmula (extremadamente larga) a continuación, donde A1 es el primer registro en la columna de nombres de archivos:

=SUMPRODUCT((CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))<48)*(CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))<>45))+SUMPRODUCT((CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))>57)*(CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))<65))+SUMPRODUCT((CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))>90)*(CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))<97)*(CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))<>95))+SUMPRODUCT((CODE(MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1))>122)*1)

Esta fórmula verifica cada carácter de cada nombre de archivo y determina si su código ASCII está fuera de los valores de caracteres permitidos. Desafortunadamente, los códigos de caracteres permitidos no son todos contiguos, por eso la fórmula tiene que usar sumas de SUMPRODUCTs. La fórmula devuelve el número de caracteres malos que hay. Se marcan todas las celdas que devuelven un valor superior a 0.

Ejemplo:
ingrese la descripción de la imagen aquí

Reseñas y valoraciones del post

Recuerda algo, que tienes la capacidad de comentar si te fue útil.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *