#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