Какая функция возвращает дважды встречающееся в ячейке слово?

Автор radius, 28 ноября 2018, 22:07

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

radius

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

mikekaganski

=A1&A1

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

mikekaganski

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

при условии включённого использования регулярных выражений в формулах
С уважением,
Михаил Каганский

radius

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

mikekaganski

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

radius

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

radius

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

mikekaganski

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

JohnSUN

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

mikekaganski

#9

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
С уважением,
Михаил Каганский

radius


mikekaganski

#11
Поправил функцию, чтобы каждый дубль встречался в результате только однажды.
Этот поиск регистрочувствителен. Слова "Один" и "один" - разные.
С уважением,
Михаил Каганский

radius

Михаил и JohnSUN огромное спасибо. Файл JohnSUN решил мою задачу.