<code>Sub</code> <code>GenEQ()</code>
<code> </code><code>If</code> <code>Selection.start <> 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,如需轉載請自行聯系原作者