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

13

Tenemos alrededor de 3500 documentos cuyos nombres de archivo deben eliminarse manualmente para eliminar caracteres especiales como corchetes, dos puntos, punto y coma, comas, etc.

Tengo un archivo de texto que he descargado en Excel, y estoy tratando de crear una columna que marque el nombre del archivo para su modificación si incluye caracteres especiales. La fórmula del pseudocódigo sería

=IF (cellname contains [^a-zA-z_-0-9], then "1", else "0")

para marcar la fila si contiene caracteres que no sean AZ, 0-9, - o _, independientemente del caso.

Alguien sabe de algo que pueda funcionar para mí? Dudo en el código y la ifdeclaración masiva si hay algo rápido y fácil.

dwwilson66
fuente
¿Hay alguna razón particular por la que está haciendo esta tarea de procesamiento de texto en Excel? Incluso limitándose a las herramientas de Microsoft Office, es una búsqueda y reemplazo bastante simple en Word. Tabla con dos columnas, nombre de archivo original y nombre de archivo procesado.
mpez0
Estas son entradas de índice de un software de terceros. Este software genera nombres de archivo que incluyen dos puntos, corchetes, símbolos de unión, etc., que causan excepciones en los programas de conversión. Necesitamos restregar los datos en el software de terceros antes de convertir; el proveedor no proporciona una API para automatizar esa tarea. Tengo una lista de nombres de archivo en un archivo de texto. Estoy usando Excel para crear una bandera basada en la presencia de caracteres especiales en un nombre de archivo. Powershell, c # y Java devuelven resultados inexactos porque los caracteres especiales se interpretan como operadores.
dwwilson66
1
Quiero señalar que probablemente estés usando la herramienta incorrecta para esto. Puedo pensar en un par de formas de hacer esto bastante rápido en Notepad ++, por ejemplo. Incluso podría importar los resultados a Excel al final y tener una columna de 1s y 0s.
Dane
@Dane Es bueno saber acerca de NP ++. Tendré que explorar eso. Tengo instalada la herramienta, pero no tengo mucha experiencia. Gracias por el consejo.
dwwilson66

Respuestas:

19

¿Sin código? Pero es tan corto, fácil, 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 tu 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. El primero es la celda para verificar. El segundo es el patrón RegEx para verificar. Si el patrón coincide con alguno de los caracteres en su celda, devolverá 1, de lo contrario 0.

Puede usarlo como cualquier otra fórmula normal de Excel si primero abre el editor VBA con ALT+ F11, inserta un nuevo módulo (!) Y pega 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)
nixda
fuente
El problema es que no quiero REEMPLAZAR los caracteres, solo marcarlos en la lista para poder pasárselos a otra persona. Los nombres de archivo son creados por un software de terceros y deben cambiarse manualmente dentro de ese programa ... Solo necesito marcar sí o no. Dicho esto, creo que puedo modificar su código Reemplazar para marcar la columna en su lugar. :)
dwwilson66
para implementar esto ... es solo cuestión de cortar y pegar en un nuevo módulo y guardar, ¿verdad? o necesito hacer otra cosa? la fórmula =RegExReplace(cell)no es reconocida ... y estoy un poco oxidado en la creación de nuevas funciones.
dwwilson66
@ dwwilson66 ¡Actualizado!
nixda
Énfasis en el guión dentro de RegEx (este signo rompe su patrón si está en la posición incorrecta)
The Red Pea
7

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 VBE

Si guarda el libro, el UDF se guardará con él. Si está utilizando una versión de Excel más tarde que 2003, debe guardar el archivo como .xlsm en lugar de .xlsx

Para eliminar el UDF:

  1. abrir la ventana VBE como arriba
  2. borrar el código
  3. cierra la ventana de VBE

Para usar el UDF de Excel:

= IsSpecial (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 !

Estudiante de gary
fuente
¿Por qué usaste "_" como un elemento O separado? Se puede incluir en el mismo grupo []
jstuardo
@jstuardo Solo para hacer obvio que el guión bajo es un carácter válido.
Estudiante de Gary
¿No debería actualizarse el código para If sCh Like "[0-9a-zA-Z ]" Or sCh = "_" Thenque la macro suponga que los espacios son caracteres válidos?
Ovaryraptor
@Ovaryraptor ¡Estás en lo correcto! Actualizaré esto mañana.
Estudiante de Gary
2

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 A1está el primer registro en la columna de nombres de archivo:

=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 las celdas que devuelven un valor mayor que 0.

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

Excellll
fuente
1

Utilicé un enfoque diferente para encontrar personajes especiales. Creé nuevas columnas para cada uno de los caracteres permitidos, y luego usé una fórmula como esta para contar cuántas veces ese carácter permitido estaba en cada entrada de fila (Z2):

AA2=LEN($Z2)-LEN(SUBSTITUTE($Z2,AA$1,""))
AB2=LEN($Z2)-LEN(SUBSTITUTE($Z2,AB$1,""))
...

Luego sumé el número de caracteres permitidos en cada fila, y luego lo comparé con la longitud total de la entrada de la fila.

BE2=LEN(Z2)
BF2=SUM(AA2:BC2)-BE2

Y finalmente, clasifiqué en la última columna (BF2) para encontrar valores negativos, lo que me llevó a las columnas que necesitaban corrección.

Lampe en InfoSec Institute
fuente