Добавление форматированных записей из таблицы в документе в библиотеку автозамены

#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. Спасибо, Тим. Это потрясающе и отлично работает! Спасибо за объяснение и гораздо более элегантное кодирование! Приветствия… Стив