web-dev-qa-db-fra.com

Existe-t-il une formule Excel pour identifier les caractères spéciaux dans une cellule?

Nous avons environ 3 500 documents dont les noms de fichiers doivent être nettoyés manuellement pour supprimer les caractères spéciaux tels que les crochets, les deux points, les points-virgules, les virgules, etc.

J'ai sauvegardé un fichier texte dans Excel et j'essaie de créer une colonne indiquant le nom du fichier à modifier s'il contient des caractères spéciaux. La formule du pseudocode serait

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

pour marquer la ligne si elle contient des caractères autres que A-Z, 0-9, - ou _, quelle que soit la casse.

Quelqu'un sait quelque chose qui peut fonctionner pour moi? J'hésite à coder et à énoncer une déclaration if massive s'il y a quelque chose de rapide et facile.

13
dwwilson66

Pas de code? Mais c'est tellement court et facile et beau et ... :(

Votre modèle RegEx [^A-Za-z0-9_-] est utilisé pour supprimer tous les caractères spéciaux de toutes les cellules.

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

Modifier

Ceci est aussi proche que possible de votre question initiale.

enter image description here

Le second code est une fonction définie par l'utilisateur =RegExCheck(A1,"[^A-Za-z0-9_-]") avec 2 arguments. Le premier est la cellule à vérifier. Le second est le motif RegEx à vérifier. Si le motif correspond à l'un des caractères de votre cellule, il retournera 1 sinon 0.

Vous pouvez l'utiliser comme n'importe quelle autre formule Excel normale si vous ouvrez d'abord l'éditeur VBA avec ALT+F11, insérez un nouveau module (!) et collez le code ci-dessous.

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

Pour les nouveaux utilisateurs de RegEx, je vais expliquer votre modèle: [^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)
17
nixda

En utilisant quelque chose de similaire au code nixda, voici une fonction définie par l'utilisateur qui retournera 1 si la cellule a des caractères spéciaux.

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

Les fonctions définies par l'utilisateur (UDF) sont très faciles à installer et à utiliser:

  1. ALT-F11 ouvre la fenêtre VBE
  2. ALT-I ALT-M ouvre un nouveau module
  3. collez le contenu et fermez la fenêtre VBE

Si vous enregistrez le classeur, la fonction utilisateur est enregistrée avec celui-ci. Si vous utilisez une version d'Excel ultérieure à 2003, vous devez enregistrer le fichier au format .xlsm au lieu de .xlsx.

Pour supprimer le fichier UDF:

  1. afficher la fenêtre VBE comme ci-dessus
  2. effacer le code
  3. ferme la fenêtre VBE

Pour utiliser le fichier UDF d'Excel:

= IsSpecial (A1)

Pour en savoir plus sur les macros en général, voir:

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

et

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

et

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

pour plus de détails sur les FDU

Les macros doivent être activées pour que cela fonctionne !

6
Gary's Student

Voici une solution de mise en forme conditionnelle qui marquera les enregistrements avec des caractères spéciaux.

Appliquez simplement une nouvelle règle de mise en forme conditionnelle à vos données en utilisant la formule (extrêmement longue) ci-dessous, où A1 est le premier enregistrement de la colonne des noms de fichiers:

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

Cette formule vérifie chaque caractère de chaque nom de fichier et détermine si son code ASCII est en dehors des valeurs de caractère autorisées. Malheureusement, les codes de caractères autorisés ne sont pas tous contigus. C'est pourquoi la formule doit utiliser des sommes de SUMPRODUCTs. La formule retourne le nombre de caractères incorrects. Toutes les cellules qui renvoient une valeur supérieure à 0 sont marquées.

Exemple: enter image description here

2
Excellll

J'ai utilisé une approche différente pour trouver des caractères spéciaux. J'ai créé de nouvelles colonnes pour chacun des caractères autorisés, puis j'ai utilisé une formule comme celle-ci pour compter le nombre de fois que le caractère autorisé était dans chaque entrée de ligne (Z2):

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

Ensuite, j'ai résumé le nombre de caractères autorisés dans chaque ligne, puis je l'ai comparé à la longueur totale de l'entrée de la ligne.

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

Et enfin, j'ai trié sur la dernière colonne (BF2) pour trouver des valeurs négatives, ce qui m'a amené aux colonnes qui nécessitaient une correction.