Я пытаюсь открыть документ 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
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
Если вы используете код с поздней привязкой в Excel VBA, измените его на 0
. Я обновил код.
Как ни странно, хотя заполняются одна замена в заголовке и одна замена в нижнем колонтитуле, заменяется только первая замена в основной части документа. Я пробовал перетасовать порядок словаря, но это всегда первая замена в основной части, а остальные не заменяются.
ByRef myStoryRange
указывает, что аргумент передается по ссылке. Любые изменения, сделанные в подпроцедуре (change_words
), повлияют на myStoryRange
в вызывающей подпрограмме. Попробуйте код обновления.
При установке destRange = myStoryRange.Duplate я получаю сообщение об ошибке. Ошибка времени выполнения «13», несоответствие типов.
Я забыл, что код запускается в Excel VBA. Попробуйте Dim destRange As Object
.
Цените помощь. Это почти там. Некоторые ключевые слова встречаются по несколько раз. Например, несколько полей «[JOB_NUMBER]», которые необходимо заменить. Заменяется только первый экземпляр.
i
используется как счетчик замены. i<2
означает, что он заменяет 2 экземпляра (i=0 и i=1).
Вот и все! Спасибо "выше"! Я заметил, что он запускался дважды, так что это имеет смысл. Я запускал его с i=1 и с i=10, и он работал так быстро, что на производительность почти не повлияло.
Слепо используя этот код, я получаю ошибку в строке ".Parent.Collapse Word.wdCollapseEnd". Ошибка 424, Требуется объект.