#vba #ms-word #autocorrect
#vba #ms-word #автозамена
Вопрос:
Я пытаюсь добавить форматированные записи из таблицы в документе MSWord 2016 в библиотеку автозамены (которая хранится в normal.dotx, как обычно, для форматированных записей).
В документе у меня есть таблица, содержащая два столбца, в левом столбце указан короткий текст, а в правом столбце — форматированный длинный текст для записей автозамены.
У меня есть рабочий макрос для хранения неформатированного текста с использованием строки AutoCorrect.Entries.Add Name:=ShortText, Value:=LongText
.
Я пытаюсь изменить его, чтобы использовать AutoCorrect.Entries.AddRichText ShortText, longtext
функцию, которая затем должна выбирать свойства шрифта и курсива в таблице.
Я попробовал два метода.
ПЕРВЫЙ — testAddRichText1
Вот код (удалены некоторые косметические средства)
Sub testAddRichText1()
Set oDoc = ActiveDocument
For i = 1 To oDoc.Tables(2).Rows.Count
If oDoc.Tables(2).Rows(i).Cells(1).Range.Characters.Count > 1 Then
ShortText = oDoc.Tables(2).Cell(Row:=i, Column:=1)
ShortText = Left(ShortText, Len(ShortText) - 2) 'remove the trailing CR and LF
longtext = oDoc.Tables(2).Cell(Row:=i, Column:=2)
StatusBar = "Adding " amp; ShortText amp; " = " amp; longtext.Text
AutoCorrect.Entries.AddRichText ShortText, longtext
End If
Next i
MsgBox "done"
End Sub
При использовании этого кода в конце текста, извлеченного из ячейки, есть несколько непечатаемых символов, в основном Chr (13). Я попытался запустить очиститель над строкой, чтобы удалить все непечатаемые символы, но там есть что-то, что просто не исчезает и вызывает черный ящик в конце исправленного текста при использовании автозамены. Я предполагаю, что это какой-то секретный код слова, который находится в ячейке таблицы. Попытка напечатать значение ASC для него возвращает 13, но его удаление не имеет никакого эффекта (просто удаляет символы перед символом черного ящика).
ВТОРОЙ тестAddRichText2
Я попытался добавить курсив к моей текстовой строке в моей рабочей модели, а затем использовать ее с помощью метода AddRichText. AddRichText ожидает диапазон, и я не смог преобразовать текстовую строку в диапазон.
Вот этот код
Sub testAddRichText2()
Set oDoc = ActiveDocument
Dim LongTextrng As Range
For i = 1 To oDoc.Tables(2).Rows.Count
If oDoc.Tables(2).Rows(i).Cells(1).Range.Characters.Count > 1 Then
ShortText = oDoc.Tables(2).Cell(Row:=i, Column:=1)
ShortText = Left(ShortText, Len(ShortText) - 2)
longtext = oDoc.Tables(2).Cell(Row:=i, Column:=2).Range
longtext = Left(longtext, Len(longtext) - 2)
LongTextrng.Text = longtext 'Fails
LongTextrng.Italic = True
StatusBar = "Adding " amp; ShortText amp; " = " amp; longtextrng.Text
AutoCorrect.Entries.Add Name:=ShortText, Value:=LongTextrng
End If
Next i
MsgBox "done"
End Sub
Комментарии:
1. Вы изобретаете велосипед заново, поскольку для этого есть два бесплатных предложения MVP. Джей Фридман AutoCorrect2007.zip jay-freedman.info и менеджер утилиты автоматического резервного копирования Грега Макси. gregmaxey.com/word_tip_pages/autocorrect_utility_manager.html —- Если нет какой-либо причины не использовать один из них, я бы использовал их вместо того, чтобы пытаться писать ваш собственный код. Код Джея не скрыт.
2. Эти утилиты использовались в тысячах систем.
3. Спасибо, Чарльз. Можно было бы сделать это в 2016 году, когда я изо всех сил пытался заставить это работать 🙂
4. Тем не менее, посмотрите на код в утилите Jay. Это может быть полезно. Он работает над этим более 15 лет и начал с Microsoft code. Я полагаю, что у него были тысячи пользователей, и он несколько раз изменял его, чтобы убедиться, что он работает на всех системах.
Ответ №1:
Ваш первый пример, testAddRichText1, почти правильный. Это не удается, потому что, хотя вы осознали необходимость удаления завершающих символов из короткого текста, вы не сделали то же самое для длинного текста.
Чтобы сократить диапазон, вы перемещаете конец диапазона с помощью метода MoveEnd . В этом случае вам нужно переместить конец диапазона на один символ назад, чтобы удалить маркер конца ячейки.
Во втором примере, testAddRichText2, код завершается с ошибкой, потому что вы неправильно присвоили диапазон переменной LongTextrng. При присвоении значения объектной переменной вам необходимо использовать команду Set, например:
Set objVar = object
Это не сработало с первой попытки, потому что LongText не был объявлен и поэтому считается вариантом.
Приведенный ниже код будет работать для вас:
Sub AddRichTextAutoCorrectEntries()
Dim LongText As Range
Dim oRow As Row
Dim ShortText As String
For Each oRow In ActiveDocument.Tables(2).Rows
If oRow.Cells(1).Range.Characters.Count > 1 Then
ShortText = oRow.Cells(1).Range.Text
ShortText = Left(ShortText, Len(ShortText) - 2)
'assign the range to the variable
Set LongText = oRow.Cells(2).Range
'move the end of the range back by 1 character
LongText.MoveEnd wdCharacter, -1
StatusBar = "Adding " amp; ShortText amp; " = " amp; LongText.Text
AutoCorrect.Entries.AddRichText Name:=ShortText, Range:=LongText
End If
Next oRow
End Sub
Комментарии:
1. Спасибо, Тим. Это потрясающе и отлично работает! Спасибо за объяснение и гораздо более элегантное кодирование! Приветствия… Стив