Печать символов UTF32 в макросах Word

Я играю с VBA для Word, и я работаю над проектом, чтобы сделать пакетный поиск / замену в текстовом документе. Я импортировал список условий поиска / замены из.csv.

Проблема, с которой я сталкиваюсь, заключается в том, что я хочу заменить слова символами, которые представляют слова. Например, если я использую слово "хлеб", я хочу заменить его на символ UTF-32 для хлеба (десятичный код Unicode 127838/ hex 0x1f35e). Когда я делал это вручную, используя встроенную функцию поиска / замены в MS-Word, это работало нормально, я просто набрал alt+127838 в поле замены, и это работало бы без проблем, но выполняя поиск / замену в UTF-32 партия, кажется, доставляет мне неприятности.

Если я использую ChrW(), он будет вне диапазона, потому что ChrW принимает значения только до 65 535. Он не может справиться с 17-м битом. Это дает мне ошибку времени выполнения, если я пытаюсь подключить это.

Я попытался использовать escape-символ \U, но затем он буквально заменил его на \U127838, что не очень полезно. Не уверен, что VBA даже поддерживает escape-символ Unicode. Если я не помещаю это в кавычки, это дает мне синтаксическую ошибку.

Хотя я не новичок в программировании, я новичок в VBA и VB. Я проверил онлайн, и кажется, что класс UTF32Encoding для VB не работает с VBA

https://msdn.microsoft.com/en-us/library/system.text.utf32encoding(v=vs.90).aspx

Может быть, я не знаком с нюансами между VB и VBA, но когда я попробовал инициализатор:

Dim u32LE как новое кодирование UTF32 (False, True)

Это дало мне синтаксическую ошибку в моем коде VBA.

Я попытался использовать оператор Imports, но это также смутило мой компилятор. Я не уверен, что делаю что-то не так или VBA не поддерживает этот класс.

Дайте мне знать, если VBA просто не поддерживает печать символов UTF32, и я должен попробовать использовать что-то вроде Python или Java. Ваша помощь очень ценится!

Вот посмотрите на функцию, которую я пишу. Я закомментировал строку "Импорт", потому что она выдала мне ошибку (она говорит, что метод или элемент не найден, выделяя ".Text")

Sub findReplaceUnicode(ByVal findItem As String, unicode As Long)

'Imports System.Text
Dim u32LE As New UTF32Encoding(False, True)



Selection.find.ClearFormatting
Selection.find.Replacement.ClearFormatting
With Selection.find
    .Text = findItem
    .Replacement.Text = ChrW(unicode)
    .Replacement.font.Name = "Segoe UI Symbol"
    .Forward = True
    .Wrap = wdFindContinue
    .Format = False
    .MatchCase = False
    .MatchWholeWord = False
    .MatchWildcards = False
    .MatchSoundsLike = False
    .MatchAllWordForms = False
End With
Selection.find.Execute replace:=wdReplaceAll

End Sub

1 ответ

Ну, для начала вы не можете использовать пространства имен.NET в своем коде VBA. Это ложное руководство для использования класса VB в программе VBA. Там нет совместимости.

Способ решить эту проблему - не использовать UTF32. Однако многие из этих символов также имеют двойное кодирование UTF-16. Например, символ хлеба (UTF-32 0x1f35e) также может быть набран двумя записями UTF-16: 0xD83C 0xDF5E (d83cdf5e).

http://www.fileformat.info/info/unicode/char/1f35e/index.htm

Файл Format.info - полезный сайт для поиска этого перевода. Чтобы заменить символ более 17 битами, введите:

.Replacement.Text = ChrW(первый) и ChrW(второй)

Где первая - это первая половина составной записи UTF-16, а вторая - вторая половина составной записи UTF-16.

Хорошее эмпирическое правило, когда вы сомневаетесь, запишите макрос вручную, а затем проанализируйте результаты.

Другие вопросы по тегам