[CDR 2017-2021] Научите пользоваться text.replace

tohaa

Участник
Топикстартер
Сообщения
229
Реакции
8
Добрый вечер. Пытаюсь разобраться как работает функция text.replace. Хочу чтобы критерием поиска было регулярное выражение . Макрос пробегает по тексту находит подходящие под регулярное выражение записи и меняет их на определенный текст. Возможно ли так сделать?
 

lev

Модератор
20 лет на форуме
Сообщения
2 142
Реакции
2 066
Примерно так:
Код:
Sub replace_txt()
  Dim s As Shape
  ActiveDocument.BeginCommandGroup "rep"
  from$ = InputBox("Чё меняем?")
  tto$ = InputBox("На чё меняем?")
  For Each s In ActiveLayer.Shapes.FindShapes(, cdrTextShape)
    s.Text.Story = rep(s.Text.Story, from, tto)
  Next s
  ActiveDocument.EndCommandGroup
End Sub

Private Function rep(s As String, pat As String, reptxt As String) As String
  rep = s
  Set re = CreateObject("VBScript.RegExp")
  re.Global = True
  re.IgnoreCase = True
  're.MultiLine = True
  re.MultiLine = False
  re.Pattern = pat
  If re.Test(s) Then
    rep = re.replace(s, reptxt)
  End If
End Function
 
  • Спасибо
Реакции: tohaa

tohaa

Участник
Топикстартер
Сообщения
229
Реакции
8
Примерно так:
Код:
Sub replace_txt()
  Dim s As Shape
  ActiveDocument.BeginCommandGroup "rep"
  from$ = InputBox("Чё меняем?")
  tto$ = InputBox("На чё меняем?")
  For Each s In ActiveLayer.Shapes.FindShapes(, cdrTextShape)
    s.Text.Story = rep(s.Text.Story, from, tto)
  Next s
  ActiveDocument.EndCommandGroup
End Sub

Private Function rep(s As String, pat As String, reptxt As String) As String
  rep = s
  Set re = CreateObject("VBScript.RegExp")
  re.Global = True
  re.IgnoreCase = True
  're.MultiLine = True
  re.MultiLine = False
  re.Pattern = pat
  If re.Test(s) Then
    rep = re.replace(s, reptxt)
  End If
End Function
Спасибо. Буду разбираться. Я надеялся на конструкции по-короче)
что-то типа:
Код:
Set re = CreateObject("VBScript.RegExp")
re.Pattern = "class=""fil\d+\sstr\d+"""
 
s2.Text.Replace re, "main", False, ReplaceAll:=True
 

tohaa

Участник
Топикстартер
Сообщения
229
Реакции
8
Работает. Но крайне медленно. Как-то возможно обрабатывать весь текст сразу? Обычная поиск и замена корела работает в разы быстрее.
 

DukereD

макрософил
Сообщения
459
Реакции
111
Работает. Но крайне медленно. Как-то возможно обрабатывать весь текст сразу? Обычная поиск и замена корела работает в разы быстрее.
VBA не тот язык чтобы еще и с регуляркой работать вмиг. а сам корел работает на уровне ядра а не скриптовым языком вот и быстрее работает.

ну и как минимум для ускорения application.optimization включить будет быстрей работать.
 

_MBK_

Пикирующий бомбардировщик
15 лет на форуме
Сообщения
33 138
Реакции
10 835
Работает. Но крайне медленно. Как-то возможно обрабатывать весь текст сразу? Обычная поиск и замена корела работает в разы быстрее.
А вы хотели макросом ускорить поиск? Так такое по определению медленнее будет ибо в цепочку добавляется новое звено, причем, отнюдь не самое сильное
 

tohaa

Участник
Топикстартер
Сообщения
229
Реакции
8
А вы хотели макросом ускорить поиск? Так такое по определению медленнее будет ибо в цепочку добавляется новое звено, причем, отнюдь не самое сильное
Надеялся использовать встроенный поиск с регулярками.
 

DukereD

макрософил
Сообщения
459
Реакции
111
Надеялся использовать встроенный поиск с регулярками.
судя по тому как и какие функции внедряет корел программисты сами не знаю что такое регулярка )
 
  • Спасибо
Реакции: eugeny