MS Word: получение фактического ASCII-кода вставленного символа

#vba #ms-word

#vba #ms-word

Вопрос:

Я пытаюсь написать код VBA для MS-Word, чтобы удалить строки с не отмеченным символом из таблицы. Для этого мне нужно, чтобы 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) amp; "  " amp; Selection.Text 'Ask for ASCII
    Selection.Collapse 0
    Selection.InsertSymbol 82, "Wingdings 2", True 'Insert ticked
    Selection.MoveRight Unit:=wdCharacter, Count:=-1, Extend:=wdExtend 'Select it
    Debug.Print AscW(Selection.Text) amp; "  " amp; Selection.Text 'Ask for ASCII
End Sub
  

Вывод:

 40  (
40  (
  

Я бы ожидал, что это будет:

 163  ?
82  ?
  

Я также попробовал ?Selection.Characters(1) = Selection.Characters(2) в немедленном окне при выборе их обоих, и я получил True

Любая помощь будет оценена.

Распознаваемые символы

Ответ №1:

Насколько я знаю

  • не существует простого способа получить кодовую точку символа или имя шрифта напрямую, используя любое из свойств выделения или диапазона

  • В этой ситуации Word всегда использует кодовую точку 40 («)»), а внутри он сохраняет имя указанного вами шрифта и кодовую точку Unicode (например, U F052 для отмеченного флажка).

Вы можете сделать две вещи. Если символ не равен 40, предположим, что он уже имеет правильную кодовую точку (хотя я не уверен в этом). Но если нет,

  • извлеките .XML или .wordоткройте xmlвыбора или диапазона и найдите соответствующий элемент, например ><w:sym w:font="Wingdings 2" w:char="F052"/> , в обоих вариантах старого стиля .XMLand новее .WordOpenXML. Вы можете либо выполнить поиск текста <w:sym и найти шрифт и кодовую точку в следующем тексте, либо «сделать это правильно» с помощью синтаксического анализатора XML. В этом случае может быть полезно знать, что F052 это либо означает «символ Юникода с кодовой точкой F052, либо означает «это F000 кодовая точка в исходном наборе символов», т. Е. Wingdings 2 в данном случае.

например, одним из способов было бы создать ссылку в инструментах редактора 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
  
  • или, если вам нужна только кодовая точка, скопируйте символ и используйте paste special, чтобы вставить его, используя 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