2016-08-26 5 views
2

Так вот что я хочу сделать:Заменить строку и оставшуюся часть строки с другой строкой

У меня есть строка origStr, которая в начале строки в документе Word. После того, как origStr является неизвестным значением (например, 23 или 2,6)

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

Пример в моем документе Word:

Diam. diastole, mm: 53 

[Запуск VBA Makro, где пользовательский ввод 54,3]

Ожидаемый результат:

Diam. diastole, mm: 54,3 

Фактический результат:

Diam. diastole, mm: 54,3 53 

So вот что я получил:

origStr = LArray(i, j - 1).Caption & ": *" 
replStr = LArray(i, j - 1).Caption & ": " & TBArray(i, j).Text 

With ActiveDocument.Content.Find 
    .MatchWildcards = True 
    .ClearFormatting 
    .Text = origStr 
    .Replacement.ClearFormatting 
    .Replacement.Text = replStr 
    .Execute Replace:=wdReplaceAll, Forward:=True, Wrap:=wdFindStop 
End With 

Почему моя старая ценность не удаляется?

Заранее благодарен!

ответ

2

Слова использует «ленивое» соответствие шаблона, который хорошо в этом случае, потому что в противном случае было бы просто заменить остальную часть всего документа. Винсент Г дал решение для одного слова (не более одного места в остальной части строки), вот что-то более общее:

Чтобы заставить Word заменить все до конца строки, вам нужно включить конец строки в строку поиска. ^l или ^11 - это код управления для new line (shift + enter), ^12 is page or section break, ^13 is carriage return. This - самый «последний» список, который я нашел.

So "yourtext*^11" будет соответствовать всем требованиям от "yourtext" до следующего new line и так далее.

В зависимости от вашего форматирования это может быть либо одно из указанных выше, поэтому вы должны быть осторожны. Если вы замените "*^12", но ваши строки заканчиваются на new line, вы замените весь абзац.

Чтобы поймать их всех, вы можете сгруппировать их: yourtext*[^11^12^13] будет соответствовать всем до следующего new line или carriage return. Однако, если мы заменим это, конец строки также будет заменен, поэтому мы должны включить его в текст замены. Откуда мы знаем, что это было?

Мы можем использовать () определить submatch и \1, \2 и т.д., чтобы использовать эти submatches в тексте замены:

origStr = LArray(i, j - 1).Caption & ": *([^11^12^13])" 
replStr = LArray(i, j - 1).Caption & ": " & TBArray(i, j).Text & "\1" 

Пример:

до:
before

после замены с origStr = "yourtext*([^11^12^13])" и replStr = "yourtext newtext\1": after


Примечание: Эти выражения также работают с Find и Replace диалога, просто убедитесь, что «Использовать Wildcards» включено

+0

Работал как шарм! Спасибо за ваши усилия! – user2059738

0

Это не проблема VBA, то же самое происходит в диалоговом окне «Найти и заменить».

Заменить оригинальную строку с:

origStr = LArray(i, j - 1).Caption & ": <*>" 
+0

Спасибо, не решить, хотя. Теперь результат Diam. диастола, мм: 54,33 (Он просто удалил первый символ в исходном значении) – user2059738

Смежные вопросы