Домашняя страница Undo Do Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/замена текста в кодах полей Word - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: _Boroda_, китин  
замена текста в кодах полей Word
krosav4ig Дата: Вторник, 03.06.2014, 00:31 | Сообщение № 1
Группа: Друзья
Ранг: Старожил
Сообщений: 2347
Репутация: 997 ±
Замечаний: 0% ±

Excel 2007,2010,2013
Здравствуйте. У меня возникла проблема при замене текста в кодах полей Word. Возникает она только при замене во вложенных полях. Прикладываю файлы. помогите пожалуйста разобраться в чем ошибка и как исправить.
К сообщению приложен файл: replace.doc (38.5 Kb) · replace.xls (41.5 Kb)


email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460

Сообщение отредактировал krosav4ig - Вторник, 03.06.2014, 00:49
 
Ответить
СообщениеЗдравствуйте. У меня возникла проблема при замене текста в кодах полей Word. Возникает она только при замене во вложенных полях. Прикладываю файлы. помогите пожалуйста разобраться в чем ошибка и как исправить.

Автор - krosav4ig
Дата добавления - 03.06.2014 в 00:31
Rioran Дата: Понедельник, 23.06.2014, 17:51 | Сообщение № 2
Группа: Авторы
Ранг: Ветеран
Сообщений: 903
Репутация: 290 ±
Замечаний: 0% ±

Excel 2013
krosav4ig, здравствуйте.

А почему бы не обратиться к полю по имени? Почему бы посреди кода не сделать так:

[vba]
Код
ActiveDocument.Shapes("Text Box 2").Select
'У активной книги Word, которую только что открыли, обращаемся к конкретному полю

Selection.WholeStory: Selection.Delete
'Выделяем и удаляем всё, что в этом поле есть.

Selection.TypeText Text:="Новый Текст"
'Вставляем в поле текст, какой душе угодно
[/vba]


Роман, Москва, voronov_rv@mail.ru
Яндекс-Деньги: 41001312674279
 
Ответить
Сообщениеkrosav4ig, здравствуйте.

А почему бы не обратиться к полю по имени? Почему бы посреди кода не сделать так:

[vba]
Код
ActiveDocument.Shapes("Text Box 2").Select
'У активной книги Word, которую только что открыли, обращаемся к конкретному полю

Selection.WholeStory: Selection.Delete
'Выделяем и удаляем всё, что в этом поле есть.

Selection.TypeText Text:="Новый Текст"
'Вставляем в поле текст, какой душе угодно
[/vba]

Автор - Rioran
Дата добавления - 23.06.2014 в 17:51
krosav4ig Дата: Вторник, 24.06.2014, 04:40 | Сообщение № 3
Группа: Друзья
Ранг: Старожил
Сообщений: 2347
Репутация: 997 ±
Замечаний: 0% ±

Excel 2007,2010,2013
Rioran, здравствуйте, спасибо, что отозвались, но к сожалению предложенный вами код не решит мою проблему. дело в том, что в примере поля с таким кодом
Код
{IF "Первый" = "Второй" "Да" "{IF "Первый" = "Третий" "Да" "{IF "Первый" = "Четвертый" "Да" "{IF "Первый" = "Пятый" "Да" "Нет"}"}"}"}
,т.е. состоят из нескольких полей, вложенных друг в друга. Эти поля будут использоваться для формирования документов по шаблону. Необходимо во всех полях заменить имя атрибута на его значение. В рабочем шаблоне таких полей может быть очень много, атрибутов еще больше, и уровней вложенности может быть больше. Есть даже поле, в котором есть 2 надписи, одна из которых должна выводиться при совпадении определеного условия (в каждой из этих надписей находится таблица в которой так же есть вычисляемые поля).
как я ни пытался, произвести замену во всех полях без потери работоспособности формул в полях у меня не получается. В примере нужно заменить "Первый" на "Третий". Текст заменяется, но скобки полей, которые внутри поля заменяются на ^0019 и ^0021 и поле перестает правильно вычисяться.


email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460
 
Ответить
СообщениеRioran, здравствуйте, спасибо, что отозвались, но к сожалению предложенный вами код не решит мою проблему. дело в том, что в примере поля с таким кодом
Код
{IF "Первый" = "Второй" "Да" "{IF "Первый" = "Третий" "Да" "{IF "Первый" = "Четвертый" "Да" "{IF "Первый" = "Пятый" "Да" "Нет"}"}"}"}
,т.е. состоят из нескольких полей, вложенных друг в друга. Эти поля будут использоваться для формирования документов по шаблону. Необходимо во всех полях заменить имя атрибута на его значение. В рабочем шаблоне таких полей может быть очень много, атрибутов еще больше, и уровней вложенности может быть больше. Есть даже поле, в котором есть 2 надписи, одна из которых должна выводиться при совпадении определеного условия (в каждой из этих надписей находится таблица в которой так же есть вычисляемые поля).
как я ни пытался, произвести замену во всех полях без потери работоспособности формул в полях у меня не получается. В примере нужно заменить "Первый" на "Третий". Текст заменяется, но скобки полей, которые внутри поля заменяются на ^0019 и ^0021 и поле перестает правильно вычисяться.

Автор - krosav4ig
Дата добавления - 24.06.2014 в 04:40
Rioran Дата: Вторник, 24.06.2014, 09:36 | Сообщение № 4
Группа: Авторы
Ранг: Ветеран
Сообщений: 903
Репутация: 290 ±
Замечаний: 0% ±

Excel 2013
Есть даже поле, в котором есть 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]
Что-то из перечисленного наводит Вас на праведную мысль?


Роман, Москва, voronov_rv@mail.ru
Яндекс-Деньги: 41001312674279


Сообщение отредактировал Rioran - Вторник, 24.06.2014, 10:57
 
Ответить
Сообщение
Есть даже поле, в котором есть 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
Дата добавления - 24.06.2014 в 09:36
krosav4ig Дата: Вторник, 24.06.2014, 12:36 | Сообщение № 5
Группа: Друзья
Ранг: Старожил
Сообщений: 2347
Репутация: 997 ±
Замечаний: 0% ±

Excel 2007,2010,2013
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
      
     Dim i&, s$, s1$, s2$, zz&
      
     s1 = "Первый"
     s2 = "Третий"
      
     appWord.Documents(FName).Windows(1).View.ShowFieldCodes = 1
      
     With appWord.Documents(FName).Range
         .Find.Text = s1: .Find.Replacement.Text = s2
         .Find.Forward = True
           
         .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] в цикле, но если ее убрать, то поля в надписях не обновляются. Как с этим бороться?


email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460

Сообщение отредактировал krosav4ig - Вторник, 24.06.2014, 12:57
 
Ответить
Сообщение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
      
     Dim i&, s$, s1$, s2$, zz&
      
     s1 = "Первый"
     s2 = "Третий"
      
     appWord.Documents(FName).Windows(1).View.ShowFieldCodes = 1
      
     With appWord.Documents(FName).Range
         .Find.Text = s1: .Find.Replacement.Text = s2
         .Find.Forward = True
           
         .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
Дата добавления - 24.06.2014 в 12:36
Rioran Дата: Вторник, 24.06.2014, 13:43 | Сообщение № 6
Группа: Авторы
Ранг: Ветеран
Сообщений: 903
Репутация: 290 ±
Замечаний: 0% ±

Excel 2013
хотелось бы избавиться

А чем она не устраивает? Безобидная вроде команда. И, кстати, интересно, почему в конце одним ударом по всему файлу не работает. Что-то явно лишнее =)



Роман, Москва, voronov_rv@mail.ru
Яндекс-Деньги: 41001312674279


Сообщение отредактировал Rioran - Вторник, 24.06.2014, 13:44
 
Ответить
Сообщение
хотелось бы избавиться

А чем она не устраивает? Безобидная вроде команда. И, кстати, интересно, почему в конце одним ударом по всему файлу не работает. Что-то явно лишнее =)


Автор - Rioran
Дата добавления - 24.06.2014 в 13:43
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!