Форум программистов, компьютерный форум, киберфорум
Наши страницы
VBA
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
Bolbine84455
5 / 5 / 3
Регистрация: 12.03.2014
Сообщений: 339
1

Замена текста по регулярному выражению (Макрос для Word)

29.06.2017, 22:34. Просмотров 1987. Ответов 11
Метки нет (Все метки)

В регулярках новичок.
В документе имеются следующие строки:
[[QWE1|Текст 1]]
[[DS3f|Текст 2]]
[[f7j1|Текст 3]]
Их необходимо найти и заменить гипперссылкой (источник для замены - отдельная история).
Написал макрос, надеясь, что смогу для начала текст подменить, но что-то пошло не так.
Visual Basic
1
2
3
4
5
6
7
Dim regExp As Object
Set regExp = CreateObject("vbscript.regexp")
With regExp
    .Pattern = "\[\[+(.*)+\]\]"
    .Global = True
    Selection.Text = .Replace(Selection.Text, "==> LinkIsHere")
End With
Пытался в паттерне учесть вертикальную черту, но тесты в онлайн сервисах "говорят", что я ничего в этом не понимаю...
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.06.2017, 22:34
Ответы с готовыми решениями:

Поиск замена по регулярному выражению в word
Добрый день. Пишу макрос для автоматической замены и расстановки меток. Требуется следующее: 1)...

Замена текста по регулярному выражению
В файле имеется ряд строк, среди которых есть следующая строка: starts3d4s4end Необходимо найти...

Поиск и замена текста на другой макрос
Добрый вечер всем!! Не могли бы вы подсказать решение проблемы Текст состоящий из множеств...

Макрос для форматирования текста word
как написать макрос, который будет переходить по абзацам текста и при этом если абзац в стиле...

Макрос на дублирование текста после каждых 5 строк для MS Word
Здравствуйте! Срочно понадобился такой вот макрос, сам в этом деле я "зелен" да и специальность у...

11
Sasha_Smirnov
5494 / 1322 / 144
Регистрация: 08.02.2009
Сообщений: 4,042
Записей в блоге: 29
29.06.2017, 22:45 2
Тогда, может, как oleg526, путём поиска-замены лучше сделать: (тема Выполнить замену слова в выделенных фрагментах текста)?
1
Bolbine84455
5 / 5 / 3
Регистрация: 12.03.2014
Сообщений: 339
29.06.2017, 23:27  [ТС] 3
Цитата Сообщение от Sasha_Smirnov Посмотреть сообщение
Тогда, может, как oleg526, путём поиска-замены лучше сделать: (тема Выполнить замену слова в выделенных фрагментах текста)?
Извините. Не знаю, как принято у разработчиков макросов на VBA, но выглядит такой пример для меня не очень
0
Dragokas
Эксперт WindowsАвтор FAQ
17112 / 7167 / 863
Регистрация: 25.12.2011
Сообщений: 10,964
Записей в блоге: 16
30.06.2017, 08:20 4
Bolbine84455, напишите более подробный 1 пример, что было, и что в результате должно получиться.
1
30.06.2017, 08:20
Bolbine84455
5 / 5 / 3
Регистрация: 12.03.2014
Сообщений: 339
30.06.2017, 21:22  [ТС] 5
Цитата Сообщение от Dragokas Посмотреть сообщение
Bolbine84455, напишите более подробный 1 пример, что было, и что в результате должно получиться.
Входные данные.docx
Выходные данные.docx
0
Dragokas
Эксперт WindowsАвтор FAQ
17112 / 7167 / 863
Регистрация: 25.12.2011
Сообщений: 10,964
Записей в блоге: 16
30.06.2017, 21:47 6
Bolbine84455, как то всё сильно сложно. Вы можете просто написать две строки - исходная, конечная?
1
Bolbine84455
5 / 5 / 3
Регистрация: 12.03.2014
Сообщений: 339
30.06.2017, 21:57  [ТС] 7
Цитата Сообщение от Dragokas Посмотреть сообщение
Bolbine84455, как то всё сильно сложно. Вы можете просто написать две строки - исходная, конечная?
Исходная:
[[DF45|Ссылка 1]]
Конечная:
Ссылка 1
0
Dragokas
Эксперт WindowsАвтор FAQ
17112 / 7167 / 863
Регистрация: 25.12.2011
Сообщений: 10,964
Записей в блоге: 16
30.06.2017, 22:27 8
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Option Explicit
 
Private Sub Form_Load()
    Dim regExp As Object
    Set regExp = CreateObject("vbscript.regexp")
    
    Dim sText As String
    sText = "[[DF45|Ссылка 1]] [[DF46|Ссылка 2]]" & vbCrLf & _
        "[[DF47|Ссылка 3]]"
        
    With regExp
        .Pattern = "\[\[(\w+)\|([A-Za-zА-Яа-я0-9_ ]+)\]\]"
        .Global = True
        .MultiLine = True
        Debug.Print .Replace(sText, "[URL=""http://myservice.ru/linkId?id=$1""]$2[/URL]")
    End With
End Sub
Добавлено через 10 минут
Ну или так, более универсальней:
Visual Basic
1
.Pattern = "\[\[(\w+)\|([^\]]+)\]\]"
2
Bolbine84455
5 / 5 / 3
Регистрация: 12.03.2014
Сообщений: 339
01.07.2017, 19:34  [ТС] 9
За скрипт спасибо. Как в самом документе менять значение?
Макрос запускаю с содержимым этой функции, но никаких изменений не вижу
0
Dragokas
Эксперт WindowsАвтор FAQ
17112 / 7167 / 863
Регистрация: 25.12.2011
Сообщений: 10,964
Записей в блоге: 16
01.07.2017, 19:42 10
Цитата Сообщение от Dragokas Посмотреть сообщение
Debug.Print
пишет в консоль отладки.

Поменяйте на нужное.
2
Bolbine84455
5 / 5 / 3
Регистрация: 12.03.2014
Сообщений: 339
01.07.2017, 21:19  [ТС] 11
Цитата Сообщение от Dragokas Посмотреть сообщение
пишет в консоль отладки.
Проблема в том, что мне надо заменять старое значение на новое.
Я взял текст и заменил его. Я получил результат в переменной, но содержимое документа как поменять не знаю
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Dim sel As Object
Dim selText As String
Dim i As Integer
 
Set sel = ActiveDocument.Sections(1)
selText = sel.Range.Text
 
Dim regExp As Object
Set regExp = CreateObject("vbscript.regexp")
   
Dim res As String
   
With regExp
    .Pattern = "\[\[(\w+)\|([^\]]+)\]\]"
    .Global = True
    .MultiLine = True
    selText = .Replace(selText, "[URL=""http://myservice.ru/linkId?id=$1""]$2[/URL]")
End With
0
Dragokas
Эксперт WindowsАвтор FAQ
17112 / 7167 / 863
Регистрация: 25.12.2011
Сообщений: 10,964
Записей в блоге: 16
01.07.2017, 21:33 12
Лучший ответ Сообщение было отмечено Bolbine84455 как решение

Решение

Visual Basic
1
sel.Range.Text = .Replace(selText, "[URL=""http://myservice.ru/linkId?id=$1""]$2[/URL]")
или так:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Dim selText As String
Dim RA as Range
 
set RA = ActiveDocument.Sections(1).Range
selText = RA.text
 
Dim regExp As Object
Set regExp = CreateObject("vbscript.regexp")
  
With regExp
    .Pattern = "\[\[(\w+)\|([^\]]+)\]\]"
    .Global = True
    .MultiLine = True
    RA.text = .Replace(selText, "[URL=""http://myservice.ru/linkId?id=$1""]$2[/URL]")
End With
 
set RA = nothing
set regExp = nothing
2
01.07.2017, 21:33
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.07.2017, 21:33

Как выдернуть из строки подстроку по регулярному выражению?
У меня есть колонка такого вида: (3466) 6124132 gray3412@gray-nv.ru То есть в ней почти всегда...

Как сделать Макрос для переноса частей текста из Word в Excel?
Здравствуйте, как сделать макрос который должен определять текст и переносить его в Excel. Текст в...

Макрос Word. замена абзацев не трогая таблицы
макрос написал выделив весь текст, как сделать что бы таблицы отдельно обрабатывались или...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.