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

13

Nous avons environ 3500 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 un fichier texte que j'ai vidé dans Excel, et j'essaie de créer une colonne qui marque le nom du fichier pour modification s'il comprend 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 AZ, 0-9, - ou _, quelle que soit la casse.

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

dwwilson66
la source
Y a-t-il une raison particulière pour laquelle vous effectuez cette tâche de traitement de texte dans Excel? Même en se limitant aux outils Microsoft Office, c'est une recherche et un remplacement assez simple dans Word. Tableau avec deux colonnes, nom de fichier d'origine et nom de fichier traité.
mpez0
Ce sont des entrées d'index d'un logiciel tiers. Ce logiciel génère des noms de fichiers comprenant des deux-points, des crochets, des esperluettes, etc., provoquant des exceptions dans les programmes de conversion. Nous devons nettoyer les données dans le logiciel tiers avant la conversion; le fournisseur ne fournit pas d'API pour automatiser cette tâche. J'ai une liste de noms de fichiers dans un fichier texte. J'utilise Excel pour créer un indicateur basé sur la présence de caractères spéciaux dans un nom de fichier. Powershell, c # et Java renvoient des résultats inexacts car les caractères spéciaux sont interprétés comme des opérateurs.
dwwilson66
1
Je tiens à souligner que vous utilisez probablement le mauvais outil pour cela. Je peux penser à quelques façons de le faire assez rapidement dans Notepad ++, par exemple. Vous pouvez même importer les résultats dans Excel à la fin et avoir une colonne de 1 et de 0.
Dane
@Dane Bon à savoir sur NP ++. Je vais devoir explorer cela. J'ai l'outil installé, mais pas beaucoup d'expérience avec lui. Merci pour le conseil.
dwwilson66

Réponses:

19

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

Éditer

C'est aussi proche que possible de votre question initiale.

entrez la description de l'image ici

Le deuxième 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 modèle RegEx à vérifier. Si le motif correspond à l'un des caractères de votre cellule, il renverra 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 utilisateurs novices 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)
nixda
la source
Le problème est que je ne veux PAS REMPLACER les caractères, juste les signaler sur la liste pour que je puisse les remettre à quelqu'un d'autre. Les noms de fichiers sont créés par des logiciels tiers et doivent être modifiés manuellement dans ce programme ... J'ai juste besoin de marquer oui ou non. Cela étant dit, je pense que je peux modifier votre code de remplacement pour marquer la colonne à la place. :)
dwwilson66
pour l'implémenter ... c'est juste une question de couper et coller dans un nouveau module et d'économiser, non? ou dois-je faire autre chose? la formule =RegExReplace(cell)n'est pas reconnue .... et je suis un peu rouillé sur la création de nouvelles fonctions.
dwwilson66
@ dwwilson66 Mis à jour!
nixda
Accent sur le trait d'union à l'intérieur de RegEx (ce signe casse votre modèle s'il est à la mauvaise position)
The Red Pea
7

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 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, l'UDF sera enregistré avec. Si vous utilisez une version d'Excel postérieure à 2003, vous devez enregistrer le fichier sous .xlsm plutôt que .xlsx

Pour supprimer l'UDF:

  1. afficher la fenêtre VBE comme ci-dessus
  2. effacer le code
  3. fermez 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 des détails sur les FDU

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

L'élève de Gary
la source
Pourquoi avez-vous utilisé "_" comme élément Or distinct? Il peut être inclus dans le même groupe []
jstuardo
@jstuardo Uniquement pour montrer que le trait de soulignement est un caractère valide.
Gary's Student
Le code ne doit-il pas être mis à jour pour If sCh Like "[0-9a-zA-Z ]" Or sCh = "_" Thenque la macro suppose que les espaces sont des caractères valides?
Ovaryraptor
@Ovaryraptor Vous avez raison! Je mettrai cela à jour demain.
Gary's Student
2

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 qui utilise la formule (extrêmement longue) ci-dessous, où se A1trouve 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. Toutes les cellules qui renvoient une valeur supérieure à 0 sont marquées.

Exemple: entrez la description de l'image ici

Excellll
la source
1

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 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 trié sur la dernière colonne (BF2) pour trouver des valeurs négatives, ce qui m'a conduit aux colonnes à corriger.

Lampe chez InfoSec Institute
la source