Замена символов в выделенном фрагменте текста - макрос

Автор snik100, 16 декабря 2021, 14:51

0 Пользователи и 1 гость просматривают эту тему.

mikekaganski

Цитата: eeigor от 16 декабря 2021, 19:01А есть другие предложения


Sub ReplaceAllInSelection()
Dim document As Object, dispatcher As Object
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

Dim args(3) As New com.sun.star.beans.PropertyValue
args(0).Name = "SearchItem.SearchString"
args(0).Value = "a"
args(1).Name = "SearchItem.ReplaceString"
args(1).Value = "b"
args(2).Name = "SearchItem.SearchFlags"
args(2).Value = 2048 ' <= Здесь задаётся замена в выделении!
args(3).Name = "SearchItem.Command"
args(3).Value = 3

dispatcher.executeDispatch(document, ".uno:ExecuteSearch", "", 0, args())
End Sub
С уважением,
Михаил Каганский

sokol92

Цитата: eeigor от 16 декабря 2021, 19:05а где Ваши предложения
Удалил свое сообщение, так как оно относилось к поиску, а не замене.
Пока UNO-методы не доработаны, приходится пользоваться "Диспетчером". Что тут можно предложить?

Владимир.

eeigor

#17
Вероятно, мы ответили на вопрос автора.
   args(3).Name = "SearchItem.Command"
   args(3).Value = 3  '3 -> заменить все вхождения

.uno:ExecuteSearch с ограниченным набором параметров из приведенного Михаилом ответа даже короче.

UPDATED:
Та же процедура (с аргументами)... Беру себе в "копилку".
Sub ReplaceAllInSelection(sSearch$, sReplace$, Optional SearchRegularExpression)
Dim document As Object, dispatcher As Object
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

Dim nAlgorithmType2%  '1=ABSOLUTE|2=REGEXP|3=APPROXIMATE|4=WILDCARD
nAlgorithmType2 = com.sun.star.util.SearchAlgorithms2.ABSOLUTE

If IsMissing(SearchRegularExpression) Then SearchRegularExpression = False
If SearchRegularExpression Then
nAlgorithmType2 = com.sun.star.util.SearchAlgorithms2.REGEXP
End If

Dim args(4) As New com.sun.star.beans.PropertyValue
args(0).Name = "SearchItem.SearchString"
args(0).Value = sSearch
args(1).Name = "SearchItem.ReplaceString"
args(1).Value = sReplace
args(2).Name = "SearchItem.SearchFlags"
args(2).Value = 2048  'search only the selected text ranges
args(3).Name = "SearchItem.Command"
args(3).Value = 3  'replace all the occurrences
args(4).Name = "SearchItem.AlgorithmType2"
args(4).Value = nAlgorithmType2

dispatcher.executeDispatch(document, ".uno:ExecuteSearch", "", 0, args())
End Sub

Sub TestReplaceAllInSelection()
Call ReplaceAllInSelection("$", ", ", True)
End Sub


UPDATED:
Процедура обновлена с учётом использования регулярных выражений.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

snik100

Спасибо!
Воспользовался пока вариантом из этого - https://forumooo.ru/index.php/topic,8943.msg60666.html#msg60666 сообщения.

Замена в выделенном фрагменте происходит.
Но не работает замена символа "$", так как мне надо из многих строчек списка сделать список через запятую.

ЦитироватьSub ReplaceAllInSelection()
   Dim document As Object, dispatcher As Object
   document = ThisComponent.CurrentController.Frame
   dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
   
   Dim args(3) As New com.sun.star.beans.PropertyValue
   args(0).Name = "SearchItem.SearchString"
   args(0).Value = "$"
   args(1).Name = "SearchItem.ReplaceString"
   args(1).Value = ", "
   args(2).Name = "SearchItem.SearchFlags"
   args(2).Value = 2048 ' <= Здесь задаётся замена в выделении!
   args(3).Name = "SearchItem.Command"
   args(3).Value = 3

   dispatcher.executeDispatch(document, ".uno:ExecuteSearch", "", 0, args())
End Sub
Мой последний вопрос в этом) Заранее благодарю!

eeigor

#19
Ну, у меня в Ubuntu всё заменяет без особенностей.
Пардон, заменяется сам символ $, а не конец абзаца...
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

sokol92

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

snik100

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

1
2
3
4
5
6
7

Должно стать -
1,2,3,4,5,6,7

sokol92

#22
Можно так:

Sub ReplaceAllInSelection()
  Dim document As Object, dispatcher As Object
  document = ThisComponent.CurrentController.Frame
  dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
 
  Dim args(4) As New com.sun.star.beans.PropertyValue
  args(0).Name = "SearchItem.SearchString"
  args(0).Value = "\u000A"
  args(1).Name = "SearchItem.ReplaceString"
  args(1).Value = ", "
  args(2).Name = "SearchItem.SearchFlags"
  args(2).Value = 2048 ' <= Здесь задаётся замена в выделении!
  args(3).Name = "SearchItem.Command"
  args(3).Value = 3
  args(4).Name = "SearchItem.AlgorithmType2"
  args(4).Value = 2

  dispatcher.executeDispatch(document, ".uno:ExecuteSearch", "", 0, args())
End Sub


Просто меняем знак перевода строки. Добавлен также тип поиска/замены (AlgorithmType2) - регулярные выражения.
Владимир.

eeigor

Сейчас времени нет, но похоже надо включить регулярные выражения
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

snik100


snik100

#25
Цитата: sokol92 от 16 декабря 2021, 20:22
Можно так:

Sub ReplaceAllInSelection()
  Dim document As Object, dispatcher As Object
  document = ThisComponent.CurrentController.Frame
  dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
 
  Dim args(4) As New com.sun.star.beans.PropertyValue
  args(0).Name = "SearchItem.SearchString"
  args(0).Value = "\u000A"
  args(1).Name = "SearchItem.ReplaceString"
  args(1).Value = ", "
  args(2).Name = "SearchItem.SearchFlags"
  args(2).Value = 2048 ' <= Здесь задаётся замена в выделении!
  args(3).Name = "SearchItem.Command"
  args(3).Value = 3
  args(4).Name = "SearchItem.AlgorithmType2"
  args(4).Value = 2

  dispatcher.executeDispatch(document, ".uno:ExecuteSearch", "", 0, args())
End Sub


Просто меняем знак перевода строки. Добавлен также тип поиска/замены (AlgorithmType2) - регулярные выражения.
К сожалению, не работает. Строки так и остаются строками. Замена другого символа в тексте работает.

sokol92

#26
1. Скопировал Ваш текст из #21 в новый текстовый документ
2. Выделил вставленный текст
3. Применил макрос из #22
4. Результат:
1, 2, 3, 4, 5, 6, 7

Не цитируйте сообщения целиком, выделите нужный фрагмент и потом нажимайте на кнопку "Цитировать".
Владимир.

snik100

#27
Хм, не получается. При этом например цифру 1, если ее поставить вместо \u000A, заменяет
На картинке 2 варианта переноса строк, честно не помню, какой используется в моем случае, так как это все осталось на работе, но сейчас дома не заменяет ни один из вариантов.
Возможно, лучше оставить проверку способа до завтра на рабочем компьютере с реальным текстом. Еще раз благодарю за предложенную помощь.

mikekaganski

Цитата: snik100 от 16 декабря 2021, 19:45Но не работает замена символа "$", так как мне надо из многих строчек списка сделать список через запятую.

Так Вы и попробуйте замену символа $ (а не "\u000A") с помощью скрипта из #22.
С уважением,
Михаил Каганский

eeigor

#29
Процедура обновлена с учётом использования регулярных выражений (см. ответ #17). Всё, как сказал выше Михаил.

Вот только при записи макроса флагам SearchItem.SearchFlags было присвоено другое значение: Value = 6144

UPDATED:
Первый вариант процедуры также обновлён (см. ответ #11).
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community