Excel VBA для поиска/замены текста в документе Word (ограничение в 255 символов)

Я пытаюсь открыть документ Word, а затем выполнить поиск/замену, чтобы заменить текст в квадратных скобках []. По большей части этот код работает. Но когда я хочу поменять местами длинное предложение, я сталкиваюсь с ограничением символов для «.Replacement.Text».

Каков самый простой способ обойти это ограничение? Я рассмотрел решения, включающие копирование в буфер обмена, замену текста пустым «» и последующую вставку текста. Но я не разбираюсь в документах Word в VB (активный документ, выборки, диапазоны историй...) и не смог их реализовать.

'Open Word App
Dim wordApp As Object
Dim wordDoc As Object
Dim myStoryRange As Object

Set wordApp = CreateObject("Word.Application")
wordApp.Visible = False

'Open Table2.doc
Set wordDoc = wordApp.Documents.Open(WIN_Path & "memo\table2_" & L_Effectivity & "_" & DEL_AIL & ".doc")

'Find/Replace using change_words
Dim myDict: Set myDict = CreateObject("Scripting.Dictionary")
myDict("[TABLE2_AUTHOR]") = Table2_Author
myDict("[JOB_NUMBER]") = Job_Number
myDict("[REGISTRATION]") = Registration
myDict("[EFFECTIVITY]") = Effectivity

For Each myStoryRange In wordDoc.StoryRanges
    For myLoop = 0 To myDict.Count - 1
        change_words myStoryRange, myDict.Keys()(myLoop), myDict.Items()(myLoop)
    Next
Next myStoryRange


Sub change_words(ByRef myStoryRange, ByVal findWord, ByVal replaceWord)
    With myStoryRange.Find
        .Text = findWord
        .Replacement.Text = replaceWord   '<<<<<<<CHARACTER LIMIT
        .Execute Replace:=2
    End With
End Sub
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
0
0
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
  • Замените совпадающую строку одну за другой
Sub change_words(ByRef myStoryRange, ByVal findWord, ByVal replaceWord)
    With myStoryRange.Find
        .Text = findWord
'        .Replacement.Text = replaceWord   '<<<<<<<CHARACTER LIMIT
        Dim i As Long
        Do While .Execute And i < 2
            .Parent.Text = replaceWord
            .Parent.Collapse 0 ' Word.wdCollapseEnd
            i = i + 1
        Loop
    End With
End Sub
Dim destRange As Object
For Each myStoryRange In wordDoc.StoryRanges
    For myLoop = 0 To myDict.Count - 1
        Set destRange = myStoryRange.Duplicate
        change_words destRange, myDict.Keys()(myLoop), myDict.Items()(myLoop)
    Next
Next myStoryRange

Слепо используя этот код, я получаю ошибку в строке ".Parent.Collapse Word.wdCollapseEnd". Ошибка 424, Требуется объект.

Ryan MacDicken 08.06.2024 04:29

Если вы используете код с поздней привязкой в ​​Excel VBA, измените его на 0. Я обновил код.

taller 08.06.2024 04:31

Как ни странно, хотя заполняются одна замена в заголовке и одна замена в нижнем колонтитуле, заменяется только первая замена в основной части документа. Я пробовал перетасовать порядок словаря, но это всегда первая замена в основной части, а остальные не заменяются.

Ryan MacDicken 08.06.2024 04:50
ByRef myStoryRange указывает, что аргумент передается по ссылке. Любые изменения, сделанные в подпроцедуре (change_words), повлияют на myStoryRange в вызывающей подпрограмме. Попробуйте код обновления.
taller 08.06.2024 04:57

При установке destRange = myStoryRange.Duplate я получаю сообщение об ошибке. Ошибка времени выполнения «13», несоответствие типов.

Ryan MacDicken 08.06.2024 05:02

Я забыл, что код запускается в Excel VBA. Попробуйте Dim destRange As Object.

taller 08.06.2024 05:07

Цените помощь. Это почти там. Некоторые ключевые слова встречаются по несколько раз. Например, несколько полей «[JOB_NUMBER]», которые необходимо заменить. Заменяется только первый экземпляр.

Ryan MacDicken 08.06.2024 06:22
i используется как счетчик замены. i<2 означает, что он заменяет 2 экземпляра (i=0 и i=1).
taller 08.06.2024 07:51

Вот и все! Спасибо "выше"! Я заметил, что он запускался дважды, так что это имеет смысл. Я запускал его с i=1 и с i=10, и он работал так быстро, что на производительность почти не повлияло.

Ryan MacDicken 08.06.2024 13:11

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