问题描述
我正在尝试为MS-Word编写VBA代码,以从表中删除带有未打勾符号的行。 为此,我需要MS-Word来识别它并区分它和打勾的符号。但是与Excel不同的是,MS-Word似乎对此很不好。
为了解决这个问题,我插入了符号,但是我无法获得刚刚插入的字符的正确ASCII码。
这是我尝试过的:
Sub Symbolstest()
Selection.InsertSymbol 163,"Wingdings 2",True 'Insert unticked
Selection.MoveRight Unit:=wdCharacter,Count:=-1,Extend:=wdExtend 'Select it
Debug.Print AscW(Selection.Text) & " " & Selection.Text 'Ask for ASCII
Selection.Collapse 0
Selection.InsertSymbol 82,True 'Insert ticked
Selection.MoveRight Unit:=wdCharacter,Extend:=wdExtend 'Select it
Debug.Print AscW(Selection.Text) & " " & Selection.Text 'Ask for ASCII
End Sub
输出为:
40 (
40 (
我希望它是:
163 ?
82 ?
我同时选择了?Selection.Characters(1) = Selection.Characters(2)
并在即时窗口中尝试了True
任何帮助将不胜感激。
解决方法
据我所知
-
没有简单的方法可以直接使用Selection或Range的任何属性直接获取字符的代码点或字体名称
-
在这种情况下,Word始终使用代码点40(“)”),并且在内部,它确实存储您指定的字体的名称和Unicode代码点(例如,复选框为U + F052) )。
您可以做两件事。如果字符不是40,则假定它已经具有正确的代码点(尽管我不确定)。但是如果没有,
- 检索Selection或Range的.XML或.WordOpenXML并查找相关元素,例如旧式.XML和较新的.WordOpenXML中的
><w:sym w:font="Wingdings 2" w:char="F052"/>
。您可以搜索文本<w:sym
并在以下文本中查找字体和代码点,也可以使用XML解析器“正确执行”。在这种情况下,知道F052
的意思是“代码点为F052的Unicode字符,或者它的意思是” F000 +原始字符集中的代码点”,在这种情况下可能是有用的。 。
例如一种方法是在VB编辑器的“工具-参考”中对Microsoft XML库(在本例中为6.0)进行引用,并按以下方式使用代码:
Sub getCharFontAndCodepoint()
Dim xdoc As MSXML2.DOMDocument60
Dim xSymNodes As MSXML2.IXMLDOMNodeList
Set xdoc = New MSXML2.DOMDocument60
xdoc.async = False
If xdoc.LoadXML(Selection.XML) Then
xdoc.SetProperty _
"SelectionNamespaces",_
"xmlns:w='http://schemas.microsoft.com/office/word/2003/wordml'"
Set xSymNodes = xdoc.SelectNodes("//w:sym/@w:font")
If xSymNodes.Length > 0 Then
Debug.Print xSymNodes(0).NodeValue
End If
Set xSymNodes = xdoc.SelectNodes("//w:sym/@w:char")
If xSymNodes.Length > 0 Then
Debug.Print xSymNodes(0).NodeValue
End If
End If
Set xSymNodes = Nothing
Set xdoc = Nothing
End Sub
-
,或者,如果仅需要代码点,则复制字符并使用特殊粘贴以
Unformatted Unicode Text
格式粘贴,例如Selection.Copy Selection.PasteSpecial link:=False,DataType:=22 ' There does not seem to be a named enum for this particular format Selection.MoveLeft Unit:=WdUnits.wdCharacter,Count:=1,Extend:=WdMovementType.wdExtend Debug.Print Hex(AscW(Selection)) Selection.Document.Undo