Esiste una formula di Excel per identificare caratteri speciali in una cella?


13

Abbiamo circa 3500 documenti i cui nomi di file devono essere lavati manualmente per rimuovere caratteri speciali come parentesi, due punti, punto e virgola, virgole, ecc.

Ho un file di testo che ho scaricato in Excel e sto provando a creare una colonna che contrassegna il nome file per la modifica se include caratteri speciali. La formula dello pseudocodice sarebbe

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

per contrassegnare la riga se contiene caratteri diversi da AZ, 0-9, - o _, indipendentemente dal caso.

Qualcuno sa di qualcosa che potrebbe funzionare per me? Sono titubante al codice e alla massiccia ifaffermazione se c'è qualcosa di facile e veloce.


C'è un motivo particolare per cui stai eseguendo questa attività di elaborazione del testo in Excel? Anche limitandosi agli strumenti di Microsoft Office, è una ricerca e una sostituzione abbastanza semplici in Word. Tabella con due colonne, nome file originale e nome file elaborato.
mpez0,

Queste sono voci di indice da un software di terze parti. Questo software genera nomi di file che includono due punti, parentesi quadre, e commerciali, ecc., Causando eccezioni nei programmi di conversione. Dobbiamo cancellare i dati nel software di terze parti prima di convertirli; il fornitore non fornisce un'API per l'automazione di tale attività. Ho un elenco di nomi di file in un file di testo. Sto usando Excel per creare una bandiera basata sulla presenza di caratteri speciali in un nome file. Powershell, c # e Java restituiscono risultati imprecisi perché i caratteri speciali vengono interpretati come operatori.
dwwilson66,

1
Voglio sottolineare che probabilmente stai usando lo strumento sbagliato per questo. Posso pensare a un paio di modi per farlo abbastanza rapidamente in Notepad ++, per esempio. Alla fine potresti persino importare i risultati in Excel e avere una colonna di 1 e 0 secondi.
Dane,

@Dane Buono a sapersi su NP ++. Dovrò esplorarlo. Ho installato lo strumento, ma non ho molta esperienza con esso. Grazie per il consiglio.
dwwilson66,

Risposte:


19

Nessun codice? Ma è così breve, facile e bello e ... :(

Il modello RegEx [^A-Za-z0-9_-]viene utilizzato per rimuovere tutti i caratteri speciali in tutte le celle.

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

modificare

Questo è il più vicino possibile alla tua domanda originale.

inserisci qui la descrizione dell'immagine

Il secondo codice è una funzione definita dall'utente =RegExCheck(A1,"[^A-Za-z0-9_-]")con 2 argomenti. La prima è la cella da controllare. Il secondo è il modello RegEx da verificare. Se il modello corrisponde a uno dei caratteri nella tua cella, restituirà 1 altrimenti 0.

Puoi usarlo come qualsiasi altra normale formula di Excel se apri l'editor VBA per la prima volta con ALT+ F11, inserisci un nuovo modulo (!) E incolla il codice qui sotto.

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

Per gli utenti che non conoscono RegEx, spiegherò il tuo modello: [^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)

Il problema è che non voglio SOSTITUIRE i personaggi, basta segnalarli nell'elenco in modo da poterlo consegnare a qualcun altro. I nomi dei file sono creati da software di terze parti e devono essere modificati manualmente all'interno di quel programma ... Devo solo contrassegnare sì o no. Detto questo, penso di poter modificare il codice Sostituisci per contrassegnare la colonna. :)
dwwilson66,

per implementare questo ... è solo una questione di tagliare e incollare in un nuovo modulo e salvare, giusto? o devo fare qualcos'altro? la formula =RegExReplace(cell)non è riconosciuta .... e sono un po 'arrugginito nel creare nuove funzioni.
dwwilson66,

@ dwwilson66 Aggiornato!
nixda,

Enfasi sul trattino all'interno di RegEx (questo segno rompe il tuo schema se è nella posizione sbagliata)
Il pisello rosso

7

Usando qualcosa di simile al codice di nixda, ecco una funzione definita dall'utente che restituirà 1 se la cella ha caratteri speciali.

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

Le funzioni definite dall'utente (UDF) sono molto facili da installare e utilizzare:

  1. ALT-F11 visualizza la finestra VBE
  2. ALT-I ALT-M apre un nuovo modulo
  3. incollare il materiale e chiudere la finestra VBE

Se si salva la cartella di lavoro, l'UDF verrà salvato con essa. Se si utilizza una versione di Excel successiva al 2003, è necessario salvare il file come .xlsm anziché .xlsx

Per rimuovere l'UDF:

  1. visualizza la finestra VBE come sopra
  2. cancella il codice
  3. chiudere la finestra VBE

Per utilizzare l'UDF da Excel:

= IsSpecial (A1)

Per ulteriori informazioni sulle macro in generale, vedere:

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

e

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

e

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

per specifiche su UDF

Le macro devono essere abilitate affinché funzioni !


Perché hai usato "_" come un oggetto separato? Può essere incluso nello stesso gruppo []
jstuardo il

@jstuardo Solo per rendere evidente che il carattere di sottolineatura è un personaggio valido.
Gary's Student,

Il codice non dovrebbe essere aggiornato in If sCh Like "[0-9a-zA-Z ]" Or sCh = "_" Thenmodo che la macro presuma che gli spazi siano caratteri validi?
Ovaryraptor,

@Ovaryraptor Hai ragione! Lo aggiornerò domani.
Gary's Student,

2

Ecco una soluzione di formattazione condizionale che contrassegna i record con caratteri speciali.

Basta applicare una nuova regola di formattazione condizionale ai dati che utilizza la formula (estremamente lunga) di seguito, dove si A1trova il primo record nella colonna dei nomi dei file:

=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)

Questa formula controlla ogni carattere di ciascun nome file e determina se il suo codice ASCII è al di fuori dei valori dei caratteri consentiti. Sfortunatamente, i codici dei caratteri consentiti non sono tutti contigui, quindi è per questo che la formula deve usare somme di SUMPRODUCTs. La formula restituisce il numero di caratteri non validi presenti. Tutte le celle che restituiscono un valore maggiore di 0 sono contrassegnate.

Esempio: inserisci qui la descrizione dell'immagine


1

Ho usato un approccio diverso per trovare personaggi speciali. Ho creato nuove colonne per ciascuno dei caratteri consentiti, quindi ho usato una formula come questa per contare quante volte quel carattere consentito era presente in ogni riga (Z2):

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

Quindi ho sommato il numero di caratteri consentiti in ciascuna riga e poi l'ho confrontato con la lunghezza totale della voce della riga.

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

E infine, ho ordinato sull'ultima colonna (BF2) per trovare valori negativi, che mi hanno portato alle colonne che necessitavano di correzione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.