Выделение определенного слова, состояние ячеек

Автор W1nterdreams, 21 января 2021, 00:15

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

W1nterdreams

Можно ли как то решить такие задачи
1.если в тексте появляется определённое слово, его шрифт автоматически меняет цвет?
2. Информация в ячейке на момент открытия документа скажем а1 - 10 и на текущее время - что бы к концу дня отслеживать изменения в количестве

eeigor

#1
1. Найти слово несложно, но если это часть строки, то изменить цвет можно только макросом обработав набор символов. В Excel я так делал: выделялось только то, что было задано шаблоном регулярного выражения.
2. Посмотрите в меню: Edit → Track Changes → Record|Manage...|Show...
Запись изменений (Record) добавляет комментарий к ячейке и информацию об изменении. Сама ячейка помещается в красную рамку.
Manage Changes позволяет перемещаться по соответствующим ячейкам. В принципе, удобно.
Отключение записи изменений приведет к сбрасыванию всей информации (рамки и комментарии будут удалены).
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

W1nterdreams

Да, это лишь часть строки, слово будет относить человека к определенной категории, нужно что бы оно выделялось из всего объема данных

eeigor

#3
Вот зд. показано, как работать, на C++, правда:
https://wiki.openoffice.org/wiki/Documentation/DevGuide/Text/Editing_Text

TextRange, TextCursor objects
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

bigor

#4
Здесь выделение символов из текста в ячейке. Осталось найти "координаты" нужных символов в тексте
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

eeigor

#5
Давайте попробуем решить эту задачу сообща.

Цитата: eeigor от 21 января 2021, 00:21В Excel я так делал: выделялось только то, что было задано шаблоном регулярного выражения.
Демокод. sPattern и oCellRange передаются в качестве параметров процедуры. Всё очень просто. Однако надо сделать и здесь. Это хорошая задача.
Property Characters ([Start], [Length]) As Characters

Dim re, sPattern$, cell, oCellRange, i%
Dim matches  'match collection
<...>
Set re = CreateObject("VBScript.RegExp")  'uses the external lib
re.Pattern = sPattern
For Each cell in oCellRange
   Set matches = re.Execute(cell)
   ' Highlight all matches in the current cell in red.
   For i = 0 To matches.Count - 1
       If matches(i).Length > 0 Then
           With cell.Characters(matches(i).FirstIndex + 1, matches(i).Length)
               .Font.Color = vbRed
           End With
       End If
   Next i
Next cell


UPD:
В Excel библиотека примитивная, но и её хватает. А что и как есть здесь? Как перебирать символы, мы, вроде, знаем, но нужен объект типа RegExp... Нужна информация о совпадениях и их размещении в строке.
Цитата: Bigor от 21 января 2021, 21:52Осталось найти "координаты" нужных символов в тексте
Чем искать будем?
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

bigor

Формулировка задачи слишком расплывчата, что бы что-то решать. "VBScript.RegExp" в линуксах не заработает и  cell.Characters скорее всего тоже.
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

eeigor

#7
Предполагаю, да. Код выше приведён только для примера. Пусть выскажутся гуру и другие мастера и специалисты. Я пока не знаю...
Искать, вроде, тоже умеем... Однако, количество совпадений в одной ячейке может быть больше одного. Регэксы здесь очень помогают. Искать с помощью InStr() в цикле с сохранением последней позиции, что ли? Абсурд.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

bigor

Я думаю InStr(). Напрягает
Цитата: W1nterdreams от 21 января 2021, 00:15если в тексте появляется определённое слово
, т.е. подразумевается поиск не по подготовленному тексту, а отследить ввод.
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

eeigor

#9
@Bigor, у автора частный случай. Надо обобщить задачу, что я и сделал в своём примере на Excel, и реализовать функцию, например
Function REGEX_SELECT(TextRange, Pattern, Flags) As Integer
которая выполнит задачу выделения цветом по умолчанию (красным) в выбранном диапазоне ячеек всех совпадений (matches) и вернёт их количество, за вычетом количества пустых совпадений (zero length strings). Как-то так... Тогда и нам самим это будет полезным.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

bigor

Ну тогда вот еще из Питоньяка
Листинг 307. SearchSheet может быть найдена в модуле Calc в файле исходных текстов
этой главы SC14.sxc.
Sub SearchSheet
Dim oSheet
'Лист для замены
Dim oReplace 'Дескриптор замены
Dim nCount
'Выполненное количество замен
oSheet = ThisComponent.Sheets(3)
oReplace = oSheet.createReplaceDescriptor()
oReplace.setSearchString("Xyzzy")
oReplace.setReplaceString("Что-то еще")
oReplace.SearchWords = False
nCount = oSheet.replaceAll(oReplace)
MsgBox "Количество замен " & nCount
End Sub

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

eeigor

#11
Так ведь нам нужны позиции совпадений (если их несколько) в одной строке, чтобы выделить вхождения цветом (индекс начала вхождения, длина).
Excel: >>> cell.Characters(matches(i).FirstIndex + 1, matches(i).Length)


Ищем sometext в строке "Sometext goes here and sometext once more."
Вызываем функцию REGEX_SELECT() в ячейке на листе, передав ей тестируемый диапазон, и получаем: результат поиска выделен красным, а в ячейке с функцией - количество совпадений (выделений) без учета пустых строк (If matches(i).Length > 0 Then).

Я не знаю: если объекта типа RegExp нет, то можно и в лоб реализовать, только будет не так компактно и красиво.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

eeigor

#12
Конечно же, если бы у автора темы данные в ячейках были атомарными - а они должны такими и быть (то есть неделимыми), то всех этих проблем бы не было. Но сама процедура очень полезна для визуализации работы регулярного выражения и анализа сырых данных. Плюс для меня это восстановление нарушенной функциональности в связи с переходом на LO.  :)

Цитата: Bigor от 21 января 2021, 22:41Я думаю InStr().
Это существенная потеря производительности.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

eeigor

#13
Одно из известных мне заранее решений подоспело с другого форума:
"You can use Python or Java instead of silly Basic".

Да, я знаю Python и с модулем re работал тоже, но зд. на Python не переходил. Так как? Никак?

Странно, что Excel не реализует регэспы, но с помощью внешней библиотеки задача решается. В LO всё реализовано изначально, но доступа к модели regex нет.
Ubuntu 18.04 LTS • LibreOffice 7.5.1.2 Community

bigor

Цитата: eeigor от 21 января 2021, 23:08Это существенная потеря производительности.
для выделения результата поиска нужно найти его начало в строке, и кроме InStr() я не знаю, что может его вернуть.
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут