OVH Cloud OVH Cloud

reconnaitre avec VBA un "symbole inséré" .

7 réponses
Avatar
bayosky
bonjour,

J'ai personnalisé mon clavier afin que certaines séquences de touche
donnent des caractères particuliers...
( Alt-a donne la lettre alpha minuscule, etc ...)

Si je sélectionne un "symbole" ainsi inséré,
sélection.font.name donne "times new roman"
ce qui est (presque tout le temps) faux
et
ascw(selection.characters.first) donne 40
ce qui est assez lamentable ...

Cela est très gênant car j'utilise par ailleurs une macro
qui analyse un "bout de texte saisi"
et ne doit pas confondre un "symbole" avec "("
La parenthèse ouvrante est une caractère ayant un rôle important ...

j'ai cherché dans les propriétés des characters(xxx) mais je n'ai rien
trouvé en rapport.

merci par avance,

H.B

7 réponses

Avatar
Circé
Bonjour,

Es-tu certain d'avoir utilisé la police "Symbol" ?....

Moi, je pencherai plutôt pour de l'unicode... Pour le savoir,
sélectionne ton alpha par exemple et regarde le nom de la police. Si tu
vois Times New Roman, c'est de l'unicode et pas du symbol.

Circé
http://faqword.free.fr

bayosky a exprimé avec précision :
bonjour,

J'ai personnalisé mon clavier afin que certaines séquences de touche
donnent des caractères particuliers...
( Alt-a donne la lettre alpha minuscule, etc ...)

Si je sélectionne un "symbole" ainsi inséré,
sélection.font.name donne "times new roman"
ce qui est (presque tout le temps) faux
et
ascw(selection.characters.first) donne 40
ce qui est assez lamentable ...

Cela est très gênant car j'utilise par ailleurs une macro
qui analyse un "bout de texte saisi"
et ne doit pas confondre un "symbole" avec "("
La parenthèse ouvrante est une caractère ayant un rôle important ...

j'ai cherché dans les propriétés des characters(xxx) mais je n'ai rien trouvé
en rapport.

merci par avance,

H.B


Avatar
bayosky
Circé wrote:
Bonjour,

Es-tu certain d'avoir utilisé la police "Symbol" ?....

oui , entre autres


Je n'utilise pas que la police symbol mais aussi une police spéciale de mon

cru.

Il n'est pas illogique que Word "masque" la police véritable dans de tels
cas.
Lorsque l'on sélectionne un texte contenant de symboles
pour en changer la police "en bloc"
les symboles n'en sont pas affectés et c'est bien.

Après avoir constaté des "bugs" j'ai pensé à ce pb d'identification
et j'ai fait un petite macro que j'appelle après avoir sélectionné un
caractère :

MsgBox "Police : " & Selection.Font.Name & vbCrLf & " Code : " &
Str(AscW(Selection.Characters.First))

Et j'ai pu vérifié que la police et le code retournés sont mauvais pour les
"symboles"
Le code retourné est toujours "40", celui de la parenthèse ouvrante.
la police retournée peut changer... :
Si je sélectionne dans le texte un symbole et change la police de ce
caractère seul,
le symbole n'est pas affecté mais c'est le nom de la police choisie qui sera
retourné par la macro.

l'info véritable n'est donc pas accessible ainsi...
ma question est donc ... comment ?

Fais des tests, tu verras, c'est assez curieux...

HB

Avatar
Jean-Guy Marcil
bayosky was telling us:
bayosky nous racontait que :

Circé wrote:
Bonjour,

Es-tu certain d'avoir utilisé la police "Symbol" ?....

oui , entre autres


Je n'utilise pas que la police symbol mais aussi une police spéciale

de mon cru.

Il n'est pas illogique que Word "masque" la police véritable dans de
tels cas.
Lorsque l'on sélectionne un texte contenant de symboles
pour en changer la police "en bloc"
les symboles n'en sont pas affectés et c'est bien.

Après avoir constaté des "bugs" j'ai pensé à ce pb d'identification
et j'ai fait un petite macro que j'appelle après avoir sélectionné un
caractère :

MsgBox "Police : " & Selection.Font.Name & vbCrLf & " Code : " &
Str(AscW(Selection.Characters.First))

Et j'ai pu vérifié que la police et le code retournés sont mauvais
pour les "symboles"
Le code retourné est toujours "40", celui de la parenthèse ouvrante.
la police retournée peut changer... :


Un collège MVP, KLaus Linke, est un vrai spécialiste des polices. Il a écrit
une petite macro pour les cas de AscW qui retourne toujours 40:

Sub SymbolsUnprotect()
'
Dim SelFont, SelCharNum

Selection.Collapse (wdCollapseStart)
Selection.Find.ClearFormatting
With Selection.Find
.Text = "[" & ChrW(61472) & "-" & ChrW(61695) & "]"
.Replacement.Text = ""
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchWildcards = True
End With
While Selection.Find.Execute
With Dialogs(wdDialogInsertSymbol)
SelFont = .Font
SelCharNum = .CharNum
End With

Selection.Font.Name = SelFont
Selection.TypeText Text:=ChrW(SelCharNum)

' replace the last 2 lines with the following to
' protect symbols from decorative fonts:
' Selection.InsertSymbol _
' Font:=SelFont, _
' CharacterNumber:=SelCharNum, _
' Unicode:=True

Wend
End Sub


Si je sélectionne dans le texte un symbole et change la police de ce
caractère seul,
le symbole n'est pas affecté mais c'est le nom de la police choisie
qui sera retourné par la macro.

l'info véritable n'est donc pas accessible ainsi...
ma question est donc ... comment ?



Avec la plupart de polices il n'y a pas de problème.
Chaque symbole a un code spécifique, indépendant de la police.

Par exemple 263A, Alt+X (ou avec le code décimal: Alt+9786) produit le
carctère Unicode "bonhomme sourire blanc", ou :-) (mème si la plupart des
polices ne contiennent pas ce symbole spécial, Word le génère quand même).
AscW(Selection.Text) avec ce caractère retourne 9786, ou
Hex(AscW(Selection.Text)) donne 263A.

Par contre il y a un problème avec les polices décoratives comme Wingdings
ou Symbole. Word ne peut pas savoir quels "caractères" une telle police à
symboles peut contenir. Ces symboles ne sont pas nécéssairement définis avec
le standard Unicode.

Alors, pour ces symboles, Word utilise des codes de la page de code U+F000
(décimal 61440) for them.

Prend le "sourire" de Wingdings par exemple;
-- Il est produit avec la touche "J" (laquelle a le code hex 4A, ou décimal
74);
-- ce qui corresponds à U+F04A (= F000+4A) ou en décimal 61514 (61440+74)

Tu peux insére ce carctère avec ChrW(61514) or ChrW(&HF04A) dans une macro
(ou F04A, Alt+X, or Alt+61514, dans le texte), et appliquer la police
Wingdings.
Dans ce cas, contrairement au premier example, tu as besoin du code et de la
police pour obtenir le symbole.
Avec Hex(AscW(Selection.Text)) tu obtiens F04A, ce qui ne correpond pas au
code Unicode du sourire qui est 263A.

Maintenant, si tu travilles avec une police de ton cru en plus...alors il
faut que tu fasses la conversion toi-même. Pour les polices décoratives, tu
dois comparer le code obtenu avec la table de code publié par le producteur
de la police. Voici un example Klaus, qunad je te dis qu'il est un As des
polices!
http://www.google.com/groups?selm§bvbk%24dm%2402%241%40news.t-online.com&rnum=4
Dans cet exemple, il a écrit une macro qui converti les caractères
décoratifs de la police Symbole en vrais symbole Unicode, lesquels ne sont
pas dépendant de la police.

--
Salut!
_______________________________________
Jean-Guy Marcil - Word MVP

Word MVP site: http://www.word.mvps.org


Avatar
bayosky
Jean-Guy Marcil tapota :
bayosky was telling us :
bayosky nous racontait que :
(...)


oulala ... tout cela m'a l'air bien compliqué pour ma petite tête :o(

Je vais essayer de comprendre et voir si avec ça je peux m'en sortir ...

En fait je me fiche de pouvoir retrouver en VBA
quel symbole se trouve où.
Je veux juste faire en sorte que VBA fasse la différence entre
un symbole et la parenthèse ouvrante...
( parce que, stratégiquement, ce choix tombe très mal !)

HB

Avatar
Jean-Guy Marcil
bayosky was telling us:
bayosky nous racontait que :

Jean-Guy Marcil tapota :
bayosky was telling us :
bayosky nous racontait que :
(...)


oulala ... tout cela m'a l'air bien compliqué pour ma petite tête :o(

Je vais essayer de comprendre et voir si avec ça je peux m'en sortir
...
En fait je me fiche de pouvoir retrouver en VBA
quel symbole se trouve où.
Je veux juste faire en sorte que VBA fasse la différence entre
un symbole et la parenthèse ouvrante...
( parce que, stratégiquement, ce choix tombe très mal !)



Voici une solution que j'ai concoté avec l'aide d'un collègue MVP , Helmut
Weber:

La première, Test1, qui appelle une function (CheckIfSymbol) qui apelle une
Sub (ClearFindAndReplaceParameters) devrait fonctionner avec n'importe
quelle police décorative, comme Symbole. La deuxième solution - Test2, plus
courte en terme de code, est limitée à la police Symbole.

Aussi, Test1 ne fonctionne pas avec les cas où le premier caractère du
document est un caractère mis en fome avec la police Symbole. Si tu avais
besoin de traiter un tel cas, il faut ajouter du code qui ajouterait un
caractère Arial temporaire au début du document et qui l'enlèverait ensuite.
Par contre, si tu es certain de n'avoir qu'a traiter la police Symbole,
utilise Test2.


'_______________________________________
Sub Test1()

Dim MyRange As Range
Dim CheckCar As Range

Set MyRange = Selection.Range

For Each CheckCar In MyRange.Characters
If AscW(CheckCar) = 40 Then
If CheckIfSymbol(CheckCar) Then
MsgBox "Ne pas traiter ce caractère."
Else
MsgBox "Traiter cette parenthèse."
End If
End If
Next

End Sub
'_______________________________________

'_______________________________________
Function CheckIfSymbol(MyCar As Range) As Boolean

CheckIfSymbol = False

ClearFindAndReplaceParameters

MyCar.MoveStart wdCharacter, -1

With MyCar.Find
.Text = "[" & ChrW(61472) & "-" & ChrW(61695) & "]"
.Forward = True
.Wrap = wdFindStop
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchWildcards = True
.Execute
If .Found Then
MsgBox "Ce n'est pas un parenthèse ouvrante"
.Parent.Select
CheckIfSymbol = True
End If
End With

ClearFindAndReplaceParameters

End Function
'_______________________________________

'_______________________________________
Sub ClearFindAndReplaceParameters()

With Selection.Find
.ClearFormatting
.Replacement.ClearFormatting
.Text = ""
.Replacement.Text = ""
.Forward = True
.Wrap = wdFindStop
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With

End Sub
'_______________________________________

'_______________________________________
Sub Test2()

Dim MyRange As Range
Dim CheckCar As Range
Dim rChr As Range

Set MyRange = Selection.Range

Dim oDlg As Dialog

For Each rChr In MyRange.Characters
If rChr = "(" Then
rChr.Select
Set oDlg = Dialogs(wdDialogInsertSymbol)
If oDlg.Font = "Symbol" Then
rChr.HighlightColorIndex = wdYellow
MsgBox "Ne pas traiter ce caractère."
Else
MsgBox "Traiter cette parenthèse."
End If
End If
Next

MyRange.Select

End Sub
'_______________________________________

--
Salut!
_______________________________________
Jean-Guy Marcil - Word MVP

Word MVP site: http://www.word.mvps.org


Avatar
bayosky
Jean-Guy Marcil wrote:
Voici une solution que j'ai concoté avec l'aide d'un collègue MVP ,
Helmut Weber:


( jr vais tester tout cela et ausi, ( on peut rêver ) essayer de

comprendre. )
Je pense que je me servirais de test2( )
en ajoutant un "or" avec l'autre police ( la perso)
qui me sert.

Merci beaucoup beaucoup !

Bien coedialement,

HB


Avatar
bayosky
Bonsoir,

je viens de faire des tests et je crois que c'est bon !

j'ai été obligé de modifier un peu la macro dans laquelle j'ai inséré un
morceau
inspiré de Test2 pour que le changement de "selection" ne mette pas la
zone
mais tout a l'air OK désormais....

Merci beaucoup !

A+

HB