Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.63/8: Рейтинг темы: голосов - 8, средняя оценка - 4.63
1 / 1 / 0
Регистрация: 28.09.2013
Сообщений: 83
1

Выполнить замену слова в выделенных фрагментах текста

17.11.2016, 11:38. Показов 1566. Ответов 3
Метки vba, word (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток.
На основе тем:
Выделение фрагмента текста в Word, заключенного между заданными словами
и
Замена текста в выделенном фрагменте
пытаюсь реализовать требуемый функционал.
Задача.
Есть текст
Собачка...ля-ля-ля...Кошка
Кошка...ля-ля-ля...Лягушка
Лягушка...ля-ля-ля...Лев

Нужно вот эти ля-ля-ля заменить на другой текст, в зависимости от контекста в целом, тоесть:
если внутри Собачка-Кошка, то ля-ля-ля меняем на гав-гав, если внутри чуастка Кошка-Лягушка, то ля-ля-ля меняем на Мяу-мяу.. и т.д. Причем фрагмент Собачка-Кошка может встречаться несколько раз в документе.
Собственно код:
участок текста вроде как выделяется, но вот потом замена происходит не в одном участке, а по всему файлу.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
Dim r
Dim s
Set r = wordApp.ActiveDocument.Range
With r.Find
    .ClearFormatting
    .Text = "Собачка*Кошка"
    .Forward = True
    .Wrap = 1
    .Format = False
    .MatchCase = False
    .MatchWholeWord = False
    .MatchAllWordForms = False
    .MatchSoundsLike = False
    .MatchWildcards = True
    If .Execute Then
       wordApp.ActiveDocument.Range(r.Start, r.End).Select
       Set s = wordApp.Selection.Range'пытался передать выделение,но это вообще не работает
        With s.Find
            .ClearFormatting
            .Text = "ля-ля-ля"
            .Replacement.Text = "Гав-гав-гав"
            .Forward = True
            .Wrap = 1
            .Format = False
            .MatchCase = False
            .MatchWholeWord = False
            .MatchAllWordForms = False
            .MatchSoundsLike = False
            .MatchWildcards = True
        End With
        s.Find.Execute Replace:=1
 
    Else
        MsgBox "Не нашли выделение", vbExclamation
    End If
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.11.2016, 11:38
Ответы с готовыми решениями:

Выполнить замену в выделенном фрагменте
Здравствуйте. Вот моя задача. Выполнить замену в выделенном фрагменте текста всех...

Выполнить замену первого символа на второй символ во всей строке текста
1. Ввести множество, запись или строку с помощью клавиатуры. 2. Вывести на экран монитора исходную...

Выполнить замену первого символа на второй символ во всей строке текста
привет , помогите с лабой , мне нужно что бы не нужно было задавать первый символ и второй , а что...

Можно ли менять цвет шрифта в TextBox лишь в определённых фрагментах текста
Доброго времени суток. Меня интересует вопрос - можно ли менять цвет шрифта в TextBox лишь в...

3
5562 / 1368 / 150
Регистрация: 08.02.2009
Сообщений: 4,109
Записей в блоге: 30
17.11.2016, 16:29 2
Взял из темы Pavel6025 и погонял вот такой вариант:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Option Base 1
Option Compare Text 'это чтобы не учитывать регистр букв найденного слова
 
Sub ВначалеКОШКА_мяу()
Dim abz As paragraph, N As Long 'переменная для работы с абзацем и его номер
Dim СЛОВО, i 'переменные для массива искомых слов и их индексации (пока - без неё)
Dim k As Long  'счётчик изменённых строк (абзацев, где вначале стоит СЛОВО (i))
СЛОВО = Array("Кошка", "Собачка", "Лягушка")
 
'Для надёжности сначала заменим разрывы строк (код 11) на символы абзаца (код 13)
ActiveDocument.Range.Text = Replace(ActiveDocument.Range.Text, Chr(11), Chr(13))
'Теперь каждая строка (в т. ч. пустая) - это отдельный абзац.
 
For N = 1 To ActiveDocument.Paragraphs.Count 'перебор всех абзацев
    Set abz = ActiveDocument.Paragraphs(N)
    With abz.Range 'работаем с очередным абзацем
        While .Characters(1) = " ": abz.Range.Characters(1).Delete: Wend
        'выше это был убор начальных пробелов
        If MsgBox("Возможно, замена: " & .Words(1), vbOKCancel) = vbOK Then Else Exit Sub
            Select Case .Words(1)
            Case СЛОВО(1)
                .Text = Replace(.Text, "ля-ля-ля", "мяу-мяу"): k = k + 1
            Case СЛОВО(2)
                .Text = Replace(.Text, "ля-ля-ля", "гав-гав"): k = k + 1
            Case СЛОВО(3)
                .Text = Replace(.Text, "ля-ля-ля", "ква-ква"): k = k + 1
            End Select
    End With
Next
End Sub
Хотя в таком виде толку с него и мало, но перестройка и ускорение ждут своего часа.
1
1 / 1 / 0
Регистрация: 28.09.2013
Сообщений: 83
17.11.2016, 17:00  [ТС] 3
Спасибо, за внимание к моему вопросу. Рассматривал вариант через параграфы, но в реальности может быть, так, что текст между флагами состоит из большого объема строк, и тогда такой вариант не подходит((

Реально, все написано и работает, вот только как заставить работать Find исключительно в выделенном диапазоне? неужели никак...
0
5562 / 1368 / 150
Регистрация: 08.02.2009
Сообщений: 4,109
Записей в блоге: 30
05.12.2016, 00:47 4
Ещё как как!
Цитата Сообщение от Sasha_Smirnov Посмотреть сообщение
Visual Basic
1
Selection.Range.Find.Execute ",", Wrap:=wdFindStop, replacewith:="."
0
05.12.2016, 00:47
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
05.12.2016, 00:47
Помогаю со студенческими работами здесь

Как выполнить замену?
Подскажите если корень из X = t ,то чему равен кубический корень из X ?????????

Как выполнить замену в надписях (Word)?
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data;...

В строке выполнить замену всех символов
в строке выполнить замену всех символов ‘!’, расположенных перед первым вхождением символа ‘$’ в...

Выполнить замену элементов матрицы строк на столбцы
Выполнить замену строк на соответствующие столбики, если сумма элементов главной диагонали больше...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru