Циклический поиск с заменой

Программирование на Visual Basic for Applications
krez0n
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 16.02.2007 (Пт) 10:51

Циклический поиск с заменой

Сообщение krez0n » 16.02.2007 (Пт) 11:30

Нужно сделать поиск/замену с использование верхнего и нижнего индесов. Ищется обычное слова и меняется на слово, которое содержит верхние и нижние индексы. Обычная замена не подходит. Написал следующий код

Код: Выделить всё
With Selection.Find
    .ClearFormatting
    .MatchWholeWord = True
    .MatchCase = False
    .Execute FindText:="k2в"
    .Replacement.ParagraphFormat
    .Wrap = wdFindContinue
    Selection.TypeText Text:="k"
    Selection.Font.Subscript = wdToggle
    Selection.TypeText Text:="2"
    Selection.Font.Superscript = wdToggle
    Selection.Font.Superscript = wdToggle
    Selection.TypeText Text:="в"
    End With

но меняется первое вхождение. как сделать чтобы изменились все совпадения?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 16.02.2007 (Пт) 12:41

Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

krez0n
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 16.02.2007 (Пт) 10:51

Сообщение krez0n » 16.02.2007 (Пт) 13:59

GSerg писал(а):http://bbs.vbstreets.ru/viewtopic.php?p=6642208#6642208

спасибо за пример, только я ведь не могу работать с полностью выделенным текстом. мне же нужно считать, мне нужно заменить, а т.к. весь текст выделен, то и менять могу только весь текст. Может еще какое-нибудь решение подскажите?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 16.02.2007 (Пт) 14:04

Почему бы не взять пример и не подправить 1% из оного? :roll:
Не надо selection - не делай selection исходным range, а делай им, например, thisdocument.range(1,1000).
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

krez0n
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 16.02.2007 (Пт) 10:51

Сообщение krez0n » 16.02.2007 (Пт) 14:12

Теперь остались вопросы:
как определить общее количество символов в документе?
как вставлять текст в нужной позиции? (у меня от вставляется на месте курсора)
Получился вот такой код:
Код: Выделить всё
Dim r As Word.Range
 
  Set r = ThisDocument.Range(1, 800)
 
  With r.Duplicate.Find
    .ClearFormatting
   
    Do While .Execute("k2в", False, False, Wrap:=wdFindStop)
      If .Parent.Start > r.End Then Exit Do
      Selection.TypeText Text:="k"
    Selection.Font.Subscript = wdToggle
    Selection.TypeText Text:="2"
    Selection.Font.Superscript = wdToggle
    Selection.Font.Superscript = wdToggle
    Selection.TypeText Text:="в"
    Loop
  End With

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 16.02.2007 (Пт) 14:31

krez0n писал(а):как определить общее количество символов в документе?

Прочитать документацию, чтобы узнать, что весь документ - это просто thisdocument.range.

krez0n писал(а):как вставлять текст в нужной позиции? (у меня от вставляется на месте курсора)

Прочитать документацию на предмет методов класса range, который в данном случае .Parent.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

krez0n
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 16.02.2007 (Пт) 10:51

Сообщение krez0n » 16.02.2007 (Пт) 14:46

а зная позицию, как вставить текст в эту позицию?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 16.02.2007 (Пт) 15:00

Прочитать (в последний раз...) документацию и узнать, что у объекта range есть много интересных методов, названных простыми английскими словами, например InsertAfter.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

krez0n
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 16.02.2007 (Пт) 10:51

Сообщение krez0n » 16.02.2007 (Пт) 15:35

в том то и дело, что я нашел InsertAfter и InsertBefor, но они вставляют до и после всего моего текста. Мне же нужно вставить в конкретную позицию. По той справке что у меня с офисом, я никак не могу найти как это сделать. Я понимаю что вы знаете решение, но отправляете читать документацию.

krez0n
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 16.02.2007 (Пт) 10:51

Сообщение krez0n » 16.02.2007 (Пт) 15:48

то что мне подсказали на другом форуме

Код: Выделить всё
Dim v_Rng As Range
  Set v_Rng = ActiveDocument.Range
 
  Do While v_Rng.Find.Execute("k2в")
    v_Rng.Characters(2).Font.Subscript = True
    v_Rng.Characters(3).Font.Superscript = True
  Loop


работает так как мне нужно.
спасибо что отвечали на мои вопросы

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 16.02.2007 (Пт) 15:55

krez0n писал(а):По той справке что у меня с офисом, я никак не могу найти как это сделать.

:neutral:
Вышедшая вчера замуж дочь в ужасе звонит матери:
- Мама, мама! Он попросил поставить чайник, а в поваренной книге об этом ни слова!



r.characters(2).insertbefore "foo" - неужто сложно? :roll:
r.parent.range(r.start+2,r.end).insertbefore "foo" - тоже можно догадаться...
r.text = left$(r.text, 2) & "foo" & mid$(r.text, 3) - ы?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

krez0n
Начинающий
Начинающий
 
Сообщения: 17
Зарегистрирован: 16.02.2007 (Пт) 10:51

Сообщение krez0n » 16.02.2007 (Пт) 16:59

r.characters(2).insertbefore "foo" - неужто сложно? :roll:
r.parent.range(r.start+2,r.end).insertbefore "foo" - тоже можно догадаться...
r.text = left$(r.text, 2) & "foo" & mid$(r.text, 3) - ы?


да. для меня это сложно. я до сих пор не пойму что вы тут написали.

Krasnaja Shapka
Обычный пользователь
Обычный пользователь
Аватара пользователя
 
Сообщения: 87
Зарегистрирован: 26.10.2006 (Чт) 12:13
Откуда: Киев

Сообщение Krasnaja Shapka » 16.02.2007 (Пт) 17:04

это он написал три варианта того что вам хотелось сделать... :)
Если ясность вашего объяснения исключает ложное толкование, все равно кто-то поймет вас неправильно.


Вернуться в VBA

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 108

    TopList