2008-11-04 7 views
1

J'ai récemment hérité d'une macro VBA qui nécessite l'ajout d'une logique de validation. Je dois pouvoir déterminer si des caractères dans une cellule basée sur du texte sont des caractères non ASCII (c'est-à-dire avoir une valeur binaire> 0x7F). Les cellules peuvent contenir certaines valeurs de contrôle de chariot (en particulier les sauts de ligne) qui doivent être conservées (ainsi la fonction CLEAN ne fonctionne pas pour cette validation). J'ai essayé la fonction IsText, mais j'ai trouvé qu'elle interpréterait les séquences de caractères UTF-8 comme du texte valide (ce que je ne veux pas).Identifier les caractères non valides dans la cellule basée sur le texte

Je n'ai pas besoin de manipuler réellement la chaîne, je veux juste afficher une erreur à l'utilisateur qui exécute la macro pour lui dire qu'il y a des caractères invalides (non-ASCII) dans une cellule spécifique.

Répondre

2

La commande asc (character) convertira un caractère en sa valeur ASCII. Hex (asc (character)) convertira le caractère à sa valeur HEX. Une fois que vous avez fait cela, vous pouvez facilement faire des comparaisons pour déterminer si les données sont mauvaises et lancer les erreurs si nécessaire.

Voici quelques exemples de code: http://www.freevbcode.com/ShowCode.asp?ID=4486

4

Si vous voulez une approche techniquement pur vous pouvez essayer une expression régulière. Ajoutez une référence dans VBA à la bibliothèque Microsoft Scripting et essayez ce code. Cela semble un peu complexe, mais vous serez époustouflé par ce que les expressions régulières peuvent faire, et vous aurez un outil précieux pour une utilisation future.

Function IsTooHigh(c As String) As Boolean 

Dim RegEx As Object 
Set RegEx = CreateObject("vbscript.regexp") 
With RegEx 
.Global = True 
.MultiLine = True 
.Pattern = "[^\x00-\x7F]" 
End With 

IsTooHigh = RegEx.Test(c) 

End Function 

Cette fonction donne VRAI si un caractère de la chaîne c est pas (^) dans la plage de 0 (x00) à 127 (x7F).

Vous pouvez utiliser Google pour «l'expression régulière» et tout ce dont vous avez besoin, et obtenir la réponse de presque toutes les langues, car comme le langage SQL, les modèles d'expressions régulières semblent être agnostiques.

+0

C'est une bonne réponse, avec mon upvoting pleinement mérité. J'ai utilisé des expressions rationnelles dans le passé, et je les ai trouvées utiles, puissantes et l'exemple parfait d'un morceau de code en écriture seule: Dieu a du mal à parser le troisième correspondant imbriqué. Donc, ça fonctionne, c'est efficace, mais don Ne vous attendez pas à ce que les futurs développeurs de code gardent vos expressions rationnelles ... – jpinto3912

0
Function IsGoodAscii(aString as String) as Boolean 
Dim i as Long 
Dim iLim as Long 
i=1 
iLim=Len(aString) 

While i<=iLim 
    If Asc(Mid(aString,i,1))>127 then 
     IsGoodAscii=False 
     Exit Function 
    EndIf 
    i=i+1 
Wend 

IsGoodAscii=True 
End Function 
+0

Merci 'IsGoodAcii' est mal orthographié. Mais ça marche toujours! – Gutzofter

+0

ça va un long chemin à regarder chaque caractère unique quand une seule regex fera l'affaire - d'autant plus lorsque vous utilisez une variante Mid plutôt que le beaucoup plus efficace Mid $ – brettdj