2013-10-16 13:34:39 +0000 2013-10-16 13:34:39 +0000
13
13

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

Nous avons environ 3500 documents dont les noms de fichiers doivent être effacés manuellement pour supprimer les caractères spéciaux comme les parenthèses, les deux-points, les points-virgules, les virgules, etc.

J'ai un fichier texte que j'ai téléchargé dans excel, et j'essaie de créer une colonne qui signale le nom du fichier pour modification s'il comporte des caractères spéciaux. La formule du pseudo-code serait

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

pour signaler la ligne si elle contient des caractères autres que A-Z, 0-9, - ou _, quel que soit le cas.

Quelqu'un sait-il quelque chose qui pourrait me convenir ? J'hésite à coder et à déclarer massivement if s'il y a quelque chose de rapide et de facile.

Réponses (4)

19
19
19
2013-10-16 14:26:04 +0000

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

Votre modèle RegEx [^A-Za-z0-9_-] est utilisé pour supprimer tous les caractères spéciaux dans 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

Edit

C'est le plus proche que je puisse obtenir de votre question originale.

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

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

Vous pouvez l'utiliser comme toute 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.

[] 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)
  • *

Pour les nouveaux utilisateurs de RegEx, je vais vous expliquer votre modèle : [^A-Za-z0-9_-]

7
7
7
2013-10-16 15:31:19 +0000

En utilisant quelque chose de similaire au code de 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 fait apparaître la fenêtre VBE
  2. ALT-I ALT-M ouvre un nouveau module
  3. collez le tout et fermez la fenêtre VBE

Si vous enregistrez le classeur, l'UDF sera enregistré avec lui. Si vous utilisez une version d'Excel postérieure à 2003, vous devez enregistrer le fichier au format .xlsm plutôt que .xlsx

Pour supprimer l'UDF :

  1. faire apparaître la fenêtre VBE comme ci-dessus
  2. effacer le code
  3. fermer la fenêtre VBE

Pour utiliser l'UDF à partir 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 les spécificités des UDF

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

2
2
2
2013-10-16 21:05:57 +0000

Voici une solution de formatage conditionnel qui permet de marquer les enregistrements avec des caractères spéciaux.

Il suffit d'appliquer une nouvelle règle de formatage conditionnel à vos données qui utilise la formule (extrêmement longue) ci-dessous, où A1 est le premier enregistrement dans 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ères 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 renvoie le nombre de mauvais caractères qu'il y a. Toutes les cellules qui renvoient une valeur supérieure à 0 sont signalées.

Exemple :

1
1
1
2016-06-20 21:36:00 +0000

J'ai utilisé une approche différente pour trouver des personnages 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 combien de fois le caractère autorisé se trouvait 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 additionné le nombre de caractères autorisés dans chaque ligne, puis je l'ai comparé à la longueur totale de l'entrée de ligne.

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

Et enfin, j'ai fait un tri sur la dernière colonne (BF2) pour trouver des valeurs négatives, ce qui m'a conduit aux colonnes qui avaient besoin d'être corrigées.