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

        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


参考:

http://www.w3.org/TR/xml-entity-names/italic.html

http://www.w3.org/TR/xml-entity-names/bold.html

http://www.w3.org/TR/xml-entity-names/bold-italic.html

http://www.eki.ee/letter/chardata.cgi?ucode=1D431