Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

15 Декабрь 2018, 15:28 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Часто задаваемые вопросы по LibreOffice и Apache OpenOffice.org
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1   Вниз
  Печать  
Автор Тема: Какая функция возвращает дважды встречающееся в ячейке слово?  (Прочитано 394 раз)
0 Пользователей и 1 Гость смотрят эту тему.
radius
Участник
**
Offline Offline

Сообщений: 26


« Стартовое сообщение: 28 Ноябрь 2018, 22:07 »

Какая функция (формула) возвращает дважды встречающееся в ячейке слово?
Записан
mikekaganski
Мастер
*****
Offline Offline

Пол: Мужской
Расположение: Хабаровск -> Москва
Сообщений: 1 162


« Ответ #1: 28 Ноябрь 2018, 22:09 »

=A1&A1

или... вопрос не о том, чтобы возвратить слово из ячейки, повторив его дважды? (Что-то мне подсказывает, что чёткая формулировка задачи может помочь получить помощь быстрее и лучше Подмигивающий )
Записан

С уважением,
Михаил Каганский
mikekaganski
Мастер
*****
Offline Offline

Пол: Мужской
Расположение: Хабаровск -> Москва
Сообщений: 1 162


« Ответ #2: 28 Ноябрь 2018, 22:25 »

Например, если мы ищем первое слово, дважды встречающееся в ячейке A1, можно в A2 поместить формулу
Код:
=SEARCH("\b(\w+)\b.*\b\1\b";A1)
а в A3 -
Код:
=MID(A1;A2;SEARCH("[^\w]";A1;A2+1)-A2)

при условии включённого использования регулярных выражений в формулах
« Последнее редактирование: 28 Ноябрь 2018, 22:31 от mikekaganski » Записан

С уважением,
Михаил Каганский
radius
Участник
**
Offline Offline

Сообщений: 26


« Ответ #3: 28 Ноябрь 2018, 22:26 »

Есть ячейка А1 с произвольным набором слов (в сумме не более 200 символов). Некоторые слова могут встретиться в этой ячейке дважды. Нужна формула, которая покажет только те слова, которые встречаются дважды в ячейке А1.
Записан
mikekaganski
Мастер
*****
Offline Offline

Пол: Мужской
Расположение: Хабаровск -> Москва
Сообщений: 1 162


« Ответ #4: 28 Ноябрь 2018, 22:29 »

А вот если в результате должен получиться текст из слов, встречающихся дважды (только дважды? а если трижды?), разделённых пробелами, то боюсь, понадобится пользовательская функция (макрос).
Записан

С уважением,
Михаил Каганский
radius
Участник
**
Offline Offline

Сообщений: 26


« Ответ #5: 28 Ноябрь 2018, 22:33 »

Нет, не первое слово в ячейке. Произвольное слово в произвольном месте. Например из "ООО лучший форум лучший" формула должна вернуть "лучший", из "три четыре пять четыре семь" должна вернуть "четыре" и т.д.
Записан
radius
Участник
**
Offline Offline

Сообщений: 26


« Ответ #6: 28 Ноябрь 2018, 22:35 »

Да, именно дважды. Трижды слов не будет. Макрос слишком сложно для меня, не осилю.
Записан
mikekaganski
Мастер
*****
Offline Offline

Пол: Мужской
Расположение: Хабаровск -> Москва
Сообщений: 1 162


« Ответ #7: 28 Ноябрь 2018, 22:43 »

Моя формула делает то, что Вы описали (из Ваших примеров). А вот что будет, если текст "два один три один четыре два"? и "два", и "один" встретились дважды.
Записан

С уважением,
Михаил Каганский
JohnSUN
Капитана в тот день называли на "ты"
Гуру
*******
Offline Offline

Пол: Мужской
Расположение: Киев
Сообщений: 2 636


Помогаю людям и компьютерам понимать друг друга


WWW
« Ответ #8: 28 Ноябрь 2018, 22:53 »

Тогда вернуть первого по алфавиту  Смеющийся

* ExtractWord.ods (11.89 Кб - загружено 8 раз.)
Записан

Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне
mikekaganski
Мастер
*****
Offline Offline

Пол: Мужской
Расположение: Хабаровск -> Москва
Сообщений: 1 162


« Ответ #9: 28 Ноябрь 2018, 22:54 »

Код:
Function OnlyDuplicates(s As String) As String
  GlobalScope.BasicLibraries.LoadLibrary("Tools")
  Dim ts As Object, so As New com.sun.star.util.SearchOptions
  ts = createUnoService("com.sun.star.util.TextSearch")
  so.searchString = "(?-i)\b(\w+)\b.*\b\1\b"
  so.algorithmType = com.sun.star.util.SearchAlgorithms.REGEXP
  so.searchFlag = com.sun.star.util.SearchFlags.REG_EXTENDED ' deprecated
  ts.setOptions(so)
  Dim pos As Long, sr As Object, result() As String, this As String, i As Long
  While (pos<Len(s))
    sr = ts.searchForward(s, pos, Len(s))
    If (sr.subRegExpressions = 2) Then
      this = Mid(s, sr.startOffset(1)+1, sr.endOffset(1)-sr.startOffset(1))
      If (Not FieldInList(this, result)) Then
        i = UBound(result)+1
        ReDim Preserve result(LBound(result) To i)
        result(i) = this
      End If
      pos = sr.endOffset(1) ' no "+1": can a word boundary be without a non-word char in between?
    Else
      pos = Len(s) ' end
    End If
  Wend
  OnlyDuplicates = Join(result)
End Function
« Последнее редактирование: 29 Ноябрь 2018, 10:17 от mikekaganski » Записан

С уважением,
Михаил Каганский
radius
Участник
**
Offline Offline

Сообщений: 26


« Ответ #10: 28 Ноябрь 2018, 22:58 »

Спасибо, пытаюсь разобраться.
Записан
mikekaganski
Мастер
*****
Offline Offline

Пол: Мужской
Расположение: Хабаровск -> Москва
Сообщений: 1 162


« Ответ #11: 28 Ноябрь 2018, 23:07 »

Поправил функцию, чтобы каждый дубль встречался в результате только однажды.
Этот поиск регистрочувствителен. Слова "Один" и "один" - разные.
« Последнее редактирование: 29 Ноябрь 2018, 08:30 от mikekaganski » Записан

С уважением,
Михаил Каганский
radius
Участник
**
Offline Offline

Сообщений: 26


« Ответ #12: 28 Ноябрь 2018, 23:12 »

Михаил и JohnSUN огромное спасибо. Файл JohnSUN решил мою задачу.
Записан
Страниц: 1   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!