1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
Sub
GenEQ()
If
Selection.start <> Selection.
End
Then
Dim
objRange
As
Range
Dim
objEq
As
OMath
Set
objRange = Selection.Range
'不能加入下面这行注释掉的代码,否则在日文版Word 2007和2010上将不能实现下面的灵活字体控制
'objRange.Text = Selection.Range.Text
Set
objRange = objRange.OMaths.Add(objRange)
'灵活控制哪类字符加斜体
For
i = 1
To
objRange.Characters.count
If
objRange.Characters(i).Text
Like
"[a-zA-Z]"
Then
objRange.Characters(i).Italic =
True
Else
objRange.Characters(i).Italic =
False
End
If
Next
i
Set
objEq = objRange.OMaths(1)
objEq.BuildUp
'加入下面这行代码,会使日文版Word 2007和2010的行为正常,否则将出现下面的怪异现象,中文版Word 2013没有这种现象:
'在Word中,在第一行输入x=3,选择x=3,使用本函数生成公式(x是斜体,=3不是斜体),回车换行,当前光标将停留在居中位置(进行相同操作,中文版word 2013光标将停在左对齐位置),
'再输入y=x+1,选择y=x+1,使用本函数生成公式(y=x+1都不是斜体)
objEq.ParentOMath.Type = wdOMathInline
End
If
End
Sub
|
如果在Word中输入“y=x”, 把“y=x”这3个字符加黑体,选择这3个字符,执行上面的宏GenEQ(),结果,x和y都不会加斜体。
因为 objRange.Characters(3).Text 返回的值并不是一个ASCII码的字符x,而是黑体x(MATHEMATICAL BOLD SMALL X) ,即Unicode字符U+1D431,UTF-16编码为: D835 DC31。
这样,If objRange.Characters(i).Text Like "[a-zA-Z]" Then 这个判断就总是失效的了。
也就是说,把字符串“y=x”转变为公式后,如果“y=x”不带字体,公式的Text就是“y=x”三个字符; 如果“y=x”带有黑体,公式的Text就变成了“U+1D432”“=”“U+1D431”三个字符。
公式中的一个字符x,加了不同的字体,其实就变成了不同的Unicode字符了,就像上面看到的,对于字符x:
不加任何字体,那么他就是ASCII的x字符,
如果加了黑体就变成了字符U+1D431 (MATHEMATICAL BOLD SMALL X)
如果加了斜体,就变成了字符U+1D465 (MATHEMATICAL ITALIC SMALL X)
如果加了黑体斜体,就变成了字符U+1D499 (MATHEMATICAL BOLD ITALIC SMALL X)
可以使用下面VBA语句查看字符串的16进制值:
1
2
3
4
5
6
7
8
|
Dim
s
As
String
, hexStr
As
String
s =
"北京beijing"
For
i = 1
To
Len(s)
hexStr = hexStr + Hex(AscW(Right(s, Len(s) - i + 1))) +
";"
Next
i
MsgBox hexStr
|
本文转自 h2appy 51CTO博客,原文链接:http://blog.51cto.com/h2appy/1604040,如需转载请自行联系原作者