Lu76Fer
XLDnaute Occasionnel
Bonjour,
I - Illustration du problème
Résultat de la macro 'AfficherCarEtendu' : Low Byte=32, High Byte=33
Pour pouvoir lister tous les symboles concernés par ce problème voici 2 fonctions utilisateurs permettant de simplifier la recherche de cette liste :
Liste des symboles posant problème :
Question : qui aurait une explication de cette anomalie qui affecte ces 27 symboles ?
II - Solution proposée
Enfin, il est aussi possible d'utiliser les symboles étendus des 255 autres tables de caractère à partir de fonction du même genre que celles écrites ci-dessus ...
Il est possible d'afficher les 255 caractères ASCII dans des cellules Excel sans aucune erreur, indépendamment de la police de caractère utilisée. Par contre, si on utilise certains symboles ASCII dans des formes (Dessin ou Contrôle de formulaire), il arrive que le symbole affiché dans la forme ne corresponde pas au symbole qu'on a affecté via la propriété 'Texte' de l'objet.
J'avais déjà essayé de passer par un copié-collé pour reprendre le symbole à partir d'une cellule mais cela ne change rien, c'est l'encodage du symbole en mémoire qui est anormal. Il faut savoir que dans une variable de type 'String', les caractères sont stockées sous forme de caractère étendu sur 16 bits soit 2 octets (Byte).
I - Illustration du problème
VB:
Sub ReadExtCar(c As String)
Dim yIn() As Byte
yIn = c 'Charge le caractère c dans un tableau de 'Byte'
Debug.Print "Low Byte=" & yIn(1)
Debug.Print "High Byte=" & yIn(0)
End Sub
Sub AfficherCarEtendu()
Dim s As String
s = Chr(135)
ReadExtCar s
End Sub
On voit ici que le symbole 135 est converti en symbole 33 du Charset 32 au lieu d'avoir le symbole 135 du Charset 0 !
VB:
Function HBchr(c As String) As Byte
Dim yIn() As Byte
yIn = c 'Charge s dans un tableau de 'Byte'
HBchr = yIn(0)
End Function
Function LBchr(c As String) As Byte
Dim yIn() As Byte
yIn = c 'Charge s dans un tableau de 'Byte'
LBchr = yIn(1)
End Function
Question : qui aurait une explication de cette anomalie qui affecte ces 27 symboles ?
II - Solution proposée
La fonction Chr(n°) qui date des débuts du Basic permet d'affecter un symbole dans une chaîne à partir d'une seule table des caractères, la Zéro. Je ne pense pas qu'il existe une fonction qui permette d'affecter un caractère étendu à une chaîne, je propose donc de l'écrire ainsi :
VB:
Function ExtChr(code As Byte, Optional charset As Byte = 0) As String
Dim yIn(1) As Byte
yIn(0) = code: yIn(1) = charset
ExtChr = yIn
End Function
'Voici la fonction qui permet d'établir une chaîne de caractère à partir d'un
'tableau de variant dans le Jeu de caractère 'charset'
Function ExtStr(codes As Variant, Optional charset As Byte = 0) As String
Dim yIn() As Byte, v As Variant, pos As Integer
ReDim yIn(UBound(codes) * 2 + 1)
For Each v In codes
yIn(pos) = v: yIn(pos + 1) = charset
pos = pos + 2
Next v
ExtStr = yIn
End Function
'Ex. d'utilisation de la fonction précédente pour une forme du menu Dessin 'MyShape'
Sub DisplayExtStr()
Dim shp As Shape, s as String
Set shp = Me.Shapes("MyShape")
s = ExtStr(Array(135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146))
shp.TextFrame2.TextRange.Text = s
Debug.Print s
End Sub
En utilisant la fonction ExtChr ou ExtStr, les 27 symboles s'affichent comme attendu sur la partie texte d'une forme ainsi que tous les autres symboles ASCII. J'ai noté cependant que ces symboles problèmatiques n'ont pas leur espace d'occupation adapté en largeur et hauteur.
Enfin, il est aussi possible d'utiliser les symboles étendus des 255 autres tables de caractère à partir de fonction du même genre que celles écrites ci-dessus ...
Dernière édition: