Поиск в Writer макросом

Автор Сергей ISV, 27 сентября 2022, 20:24

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

Сергей ISV

Здравствуйте!
Может кто подскажет как зациклить поиск в макросе с конструкцией
dispatcher.executeDispatch(document, ".uno:ExecuteSearch", "", 0, args1()).
Ведь эта команда выполняет поиск до первого совпадения, а как сделать, чтобы поиск "просматривал" файл до конца и останавливался?

bigor

Здравствуйте.

Напишите чего вы хотите получить, может и не нужно ничего зацикливать
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

Сергей ISV

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

sokol92

Прочитайте, пожалуйста, раздел "14.7. Search and replace" книги А.Питоньяка OOME_4_0.odt.
Владимир.

Сергей ISV

Если я пытаюсь сделать поиск через дескрипторы, то ошибка
"Ошибка времени выполнения Basic.
'423'
Свойство или метод не найдены: createSearchDescriptor".
Может это потому, что макрос находится в файле не в "Stanard", а в ветке "VBAProject/ модули"?
У меня там и код VBA присутсвует с опцией Option VBASupport 1.
Поэтому и начал копать в сторону dispatcher.executeDispatch(document, ".uno:ExecuteSearch", "", 0, args1()).

bigor

я думаю, что один файл-пример будет гораздо информативнее многих слов описания ошибок.
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

economist

Цитата: Сергей ISV от 28 сентября 2022, 18:41В текстовой таблице нужно найти ячейку с определённым текстом, а затем через две ячейки правее изменить дату и номер документа.

Для этого напишите формулу с функцией ВПР/VLOOKUP. Автоматизация поиска не решает две другие ваши задачи.
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

bigor

Цитата: economist от 29 сентября 2022, 11:09формулу с функцией ВПР/VLOOKUP.
таблица как понял во writer
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

economist

Точно, 8-) Тогда можно скопировать таблицу/столбец в Calc, осуществить хирургию, и вставить обратно во Writer. Особенно это имеет смысл, если задача одноразовая.

Судя по вопросу, дата и номер документа, подлежащие изменению содержатся в столбце поиска. В этом случае м.б. достаточно замены с регуляркой. 
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

Сергей ISV

А как определить, что dispatcher.executeDispatch(document, ".uno:ExecuteSearch", "", 0, args1()) вообще что-то нашла (например, искомого текста нет)?

sokol92

Ждем файл-пример (см. #5).
Цитата: Сергей ISV от 28 сентября 2022, 23:19У меня там и код VBA присутсвует с опцией Option VBASupport 1.
Наличие опции Option VBASupport 1 не препятствует выполнению методов UNO.
Владимир.

Сергей ISV

В данном случае речь идёт не о методах UNO, а об ошибке при вызове createSearchDescriptor

sokol92

Цитата: Сергей ISV от 28 сентября 2022, 23:19Свойство или метод не найдены: createSearchDescriptor".
Вы обращаетесь к объекту, у которого нет метода createSearchDescriptor.

Еще раз: без файла - примера поставить диагноз невозможно.
Владимир.

Сергей ISV

#13
Вот часть кода, запускаемого из CALC:

Sub Obnovlenie_Daty()

Dim fName As String
Dim OpenDoc As Object, docProperties()
Dim document   as object
Dim vDescriptor, vFound
Dim dispatcher as object

  fName = open_file()

  if fName="" THEN
  Exit Sub
  End If
'открываем файл *.ods
OpenDoc = StarDesktop.LoadComponentFromURL(fName, "_default", 0, docProperties)
 
document = OpenDoc.CurrentController.Frame

vDescriptor = ThisComponent.createSearchDescriptor()  'Здесь происходит ошибка Свойство или метод не найдены: createSearchDescriptor

With vDescriptor
.SearchString = "hello"
' These all default to false
.SearchWords = true
.SearchCaseSensitive = False
End With
' Find the first one
vFound = ThisComponent.findFirst(vDescriptor)
Do While Not IsNull(vFound)
Print vFound.getString()
vFound.CharWeight = com.sun.star.awt.FontWeight.BOLD
vFound = ThisComponent.findNext( vFound.End, vDescriptor)
Loop

End Sub


Function open_file() as String

   Dim file_dialog as Object
   Dim status as Integer
   Dim file_path as String
   Dim init_path as String
   Dim ucb as object
   Dim filterNames(2) as String

   filterNames(0) = "*.odt"
   filterNames(1) = "*.*"
..........................
   .......................
   file_dialog.Dispose()

End Function

bigor

Приложите файл в котором ищите, и укажите в нем, что нужно с найденным делать
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут