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.
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
Ceci est aussi proche que possible de votre question initiale.
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)
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:
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:
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 !
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 SUMPRODUCT
s. La formule retourne le nombre de caractères incorrects. Toutes les cellules qui renvoient une valeur supérieure à 0 sont marquées.
Exemple:
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.