Здравствуйте. У меня возникла проблема при замене текста в кодах полей Word. Возникает она только при замене во вложенных полях. Прикладываю файлы. помогите пожалуйста разобраться в чем ошибка и как исправить.
Здравствуйте. У меня возникла проблема при замене текста в кодах полей Word. Возникает она только при замене во вложенных полях. Прикладываю файлы. помогите пожалуйста разобраться в чем ошибка и как исправить.krosav4ig
Rioran, здравствуйте, спасибо, что отозвались, но к сожалению предложенный вами код не решит мою проблему. дело в том, что в примере поля с таким кодом
,т.е. состоят из нескольких полей, вложенных друг в друга. Эти поля будут использоваться для формирования документов по шаблону. Необходимо во всех полях заменить имя атрибута на его значение. В рабочем шаблоне таких полей может быть очень много, атрибутов еще больше, и уровней вложенности может быть больше. Есть даже поле, в котором есть 2 надписи, одна из которых должна выводиться при совпадении определеного условия (в каждой из этих надписей находится таблица в которой так же есть вычисляемые поля). как я ни пытался, произвести замену во всех полях без потери работоспособности формул в полях у меня не получается. В примере нужно заменить "Первый" на "Третий". Текст заменяется, но скобки полей, которые внутри поля заменяются на ^0019 и ^0021 и поле перестает правильно вычисяться.
Rioran, здравствуйте, спасибо, что отозвались, но к сожалению предложенный вами код не решит мою проблему. дело в том, что в примере поля с таким кодом
,т.е. состоят из нескольких полей, вложенных друг в друга. Эти поля будут использоваться для формирования документов по шаблону. Необходимо во всех полях заменить имя атрибута на его значение. В рабочем шаблоне таких полей может быть очень много, атрибутов еще больше, и уровней вложенности может быть больше. Есть даже поле, в котором есть 2 надписи, одна из которых должна выводиться при совпадении определеного условия (в каждой из этих надписей находится таблица в которой так же есть вычисляемые поля). как я ни пытался, произвести замену во всех полях без потери работоспособности формул в полях у меня не получается. В примере нужно заменить "Первый" на "Третий". Текст заменяется, но скобки полей, которые внутри поля заменяются на ^0019 и ^0021 и поле перестает правильно вычисяться.krosav4ig
Есть даже поле, в котором есть 2 надписи, одна из которых должна выводиться при совпадении определеного условия
Неужели речь о вычислениях внутри Word? What a shame. В таком случае простой вариант, наверно, не подойдёт:
[vba]
Код
For each object in ActiveDocument.Shapes ...
[/vba] Если вывести все изменяемые тексты за пределы коллекции .shapes (а НЕ изменяемые наоборот - загнать туда), то можно жахнуть ядерной бомбой:
[vba]
Код
With Selection.Find .Text = "1500 нет" .Replacement.Text = "1200 да" .Wrap = wdFindContinue .Execute Replace:=wdReplaceAll End With
[/vba] Если бы всё было загнано в таблицы, можно было бы пользоваться логическими проверками. Подсказку, как это реализовать, можно найти здесь. С поиском значений по строкам и столбцам всех таблиц документа Word с помощью обращений к документу типа:
[vba]
Код
.tables(1).Rows(4).Cells(2).Range.Text
[/vba] Что-то из перечисленного наводит Вас на праведную мысль?
Есть даже поле, в котором есть 2 надписи, одна из которых должна выводиться при совпадении определеного условия
Неужели речь о вычислениях внутри Word? What a shame. В таком случае простой вариант, наверно, не подойдёт:
[vba]
Код
For each object in ActiveDocument.Shapes ...
[/vba] Если вывести все изменяемые тексты за пределы коллекции .shapes (а НЕ изменяемые наоборот - загнать туда), то можно жахнуть ядерной бомбой:
[vba]
Код
With Selection.Find .Text = "1500 нет" .Replacement.Text = "1200 да" .Wrap = wdFindContinue .Execute Replace:=wdReplaceAll End With
[/vba] Если бы всё было загнано в таблицы, можно было бы пользоваться логическими проверками. Подсказку, как это реализовать, можно найти здесь. С поиском значений по строкам и столбцам всех таблиц документа Word с помощью обращений к документу типа:
[vba]
Код
.tables(1).Rows(4).Cells(2).Range.Text
[/vba] Что-то из перечисленного наводит Вас на праведную мысль?Rioran
Роман, Москва, voronov_rv@mail.ru Яндекс-Деньги: 41001312674279
Сообщение отредактировал Rioran - Вторник, 24.06.2014, 10:57
.Find.Execute If .Find.Found Then .Find.Execute Replace:=2 End If End With
With appWord.Documents(FName).Shapes If .Count Then For zz = 1 To .Count If .Item(zz).TextFrame.HasText Then With .Item(zz).TextFrame.TextRange If InStr(1, .Text, s1, 1) Then .Find.Text = s1: .Find.Replacement.Text = s2 .Find.Execute Replace:=2 .Fields.Update End If End With End If Next End If End With
appWord.Documents(FName).Windows(1).View.ShowFieldCodes = 0 appWord.Documents(FName).Fields.Update appWord.Visible = 1 appWord.ScreenUpdating = 1 End Sub
[/vba]
остался 1 вопрос хотелось бы избавиться от строки [vba]
Код
.Fields.Update
[/vba] в цикле, но если ее убрать, то поля в надписях не обновляются. Как с этим бороться?
Rioran, спасибо, пока все это навело меня на такую мысль [vba]
Код
Sub replace_() Dim appWord As Object, docWord As Object Dim OfficeApp As Object, ReadOnly As Boolean Dim path$, FName$, docpath$
path = ThisWorkbook.path: FName = "replace.doc" docpath = path & "\" & FName: ReadOnly = True Set OfficeApp = CreateObject("Word.Application") Set docWord = OfficeApp.Documents.Open(Filename:=docpath, _ ReadOnly:=ReadOnly) If docWord Is Nothing Then Exit Sub Set appWord = docWord.Application
.Find.Execute If .Find.Found Then .Find.Execute Replace:=2 End If End With
With appWord.Documents(FName).Shapes If .Count Then For zz = 1 To .Count If .Item(zz).TextFrame.HasText Then With .Item(zz).TextFrame.TextRange If InStr(1, .Text, s1, 1) Then .Find.Text = s1: .Find.Replacement.Text = s2 .Find.Execute Replace:=2 .Fields.Update End If End With End If Next End If End With
appWord.Documents(FName).Windows(1).View.ShowFieldCodes = 0 appWord.Documents(FName).Fields.Update appWord.Visible = 1 appWord.ScreenUpdating = 1 End Sub
[/vba]
остался 1 вопрос хотелось бы избавиться от строки [vba]
Код
.Fields.Update
[/vba] в цикле, но если ее убрать, то поля в надписях не обновляются. Как с этим бороться?krosav4ig