天天看点

Word中使用VBA自动生成公式时的注意事项

<code>Sub</code> <code>GenEQ()</code>

<code>    </code><code>If</code> <code>Selection.start &lt;&gt; Selection.</code><code>End</code> <code>Then</code>

<code>        </code><code>Dim</code> <code>objRange </code><code>As</code> <code>Range</code>

<code>        </code><code>Dim</code> <code>objEq </code><code>As</code> <code>OMath</code>

<code>    </code> 

<code>        </code><code>Set</code> <code>objRange = Selection.Range</code>

<code>        </code><code>'不能加入下面这行注释掉的代码,否则在日文版Word 2007和2010上将不能实现下面的灵活字体控制</code>

<code>        </code><code>'objRange.Text = Selection.Range.Text</code>

<code>        </code><code>Set</code> <code>objRange = objRange.OMaths.Add(objRange)</code>

<code>        </code><code>'灵活控制哪类字符加斜体</code>

<code>        </code><code>For</code> <code>i = 1 </code><code>To</code> <code>objRange.Characters.count</code>

<code>            </code><code>If</code> <code>objRange.Characters(i).Text </code><code>Like</code> <code>"[a-zA-Z]"</code> <code>Then</code>

<code>                </code><code>objRange.Characters(i).Italic = </code><code>True</code>

<code>            </code><code>Else</code>

<code>                </code><code>objRange.Characters(i).Italic = </code><code>False</code>

<code>            </code><code>End</code> <code>If</code>

<code>        </code><code>Next</code> <code>i</code>

<code>        </code><code>Set</code> <code>objEq = objRange.OMaths(1)</code>

<code>        </code><code>objEq.BuildUp</code>

<code>        </code><code>'加入下面这行代码,会使日文版Word 2007和2010的行为正常,否则将出现下面的怪异现象,中文版Word 2013没有这种现象:</code>

<code>        </code><code>'在Word中,在第一行输入x=3,选择x=3,使用本函数生成公式(x是斜体,=3不是斜体),回车换行,当前光标将停留在居中位置(进行相同操作,中文版word 2013光标将停在左对齐位置),</code>

<code>        </code><code>'再输入y=x+1,选择y=x+1,使用本函数生成公式(y=x+1都不是斜体)</code>

<code>        </code><code>objEq.ParentOMath.Type = wdOMathInline</code>

<code>    </code><code>End</code> <code>If</code>

<code>End</code> <code>Sub</code>

如果在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进制值:

<code>        </code><code>Dim</code> <code>s </code><code>As</code> <code>String</code><code>, hexStr </code><code>As</code> <code>String</code>

<code>        </code> 

<code>        </code><code>s = </code><code>"北京beijing"</code>

<code>        </code><code>For</code> <code>i = 1 </code><code>To</code> <code>Len(s)</code>

<code>            </code><code>hexStr = hexStr + Hex(AscW(Right(s, Len(s) - i + 1))) + </code><code>";"</code>

<code>        </code><code>MsgBox hexStr</code>

本文转自 h2appy  51CTO博客,原文链接:http://blog.51cto.com/h2appy/1604040,如需转载请自行联系原作者