Страницы: 1
RSS
удаление повторяющихся ячеек с разной последовательностью одинаковых текстовых значений, очень прошу помочь
 
Здравствуйте, уважаемые знатоки Excel!
не смогла разобраться сама, гугл не помог. буду крайне благодарна, если подскажете!

есть ячейки с текстом со смысловым одинаковым значением, задача их повторение удалить.
к примеру, "Х1 Х2" и "Х2 Х1" - мне  нужно что-то одно оставить, а второе удалить. что именно оставить или  удалить значения не имеет.

также есть ячейки с большем количеством слов, и также дублируются слова в разном порядке.
к примеру содержание ячеек,
"у1 у2 у3",  
"у1 у3 у2",
"у3 у1 у2"
"у3 у2 у1"
"у2 у3 у1"
"у2 у1 у3"
мне нужно оставить один любой вариант, остальные найти  и удалить.  

Если возможно, помогите пожалуйста.
 
Цитата
elementarnost написал:
есть ячейки с текстом
ГДЕ эти ячейки?
 
ячейки в эксели, в одном столбце
 
elementarnost, никто этого столбца не видит. Только у Вас он есть. Из Правил:
Цитата
2.3. Приложите файл(ы) с примером (общим весом не более 100 Кб) в реальной структуре и форматах данных того, что есть сейчас и того, что хотелось бы на выходе.
 
Цитата
Юрий М написал:
никто этого столбца не видит.
ох.. Вы правы!!
Вложила файл. ищу способ удалить ячейки, которые не точь-в-точь идентичны, но в которых встречаются одинаковые слова в перемешанном порядке. В файле пример с 3мя словами, в целом же доходит до 15 слов в ячейке.
(поставила "удален" напротив повторяющейся по смыслу текстовой ячейки. в результате наличие слова "удален" не нужно.)
 
Код
Sub asd()
    Dim k&, i&, j&
    
    For i = Cells(Rows.Count, 1).End(xlUp).Row To 3 Step -1
        For j = i - 1 To 3 Step -1
            k = 0
            If UBound(Split(Cells(i, 1), " ")) = UBound(Split(Cells(j, 1), " ")) Then
                For Each word In Split(Cells(i, 1), " ")
                    If InStr(LCase(Cells(j, 1)), LCase(word)) > 0 Then
                        k = k + 1
                        If k = UBound(Split(Cells(i, 1), " ")) + 1 Then Rows(j).Delete
                    Else
                        Exit For
                    End If
                Next word
            End If
        Next j
    Next i
End Sub
 
kavaka, Вы знаете, это чудесно!! оно работает!!!!
сначала скормила большому файлу и завис на долго, попробовала на маленьком - все отлично!!
Спасибо Вам огромное!!!!!!!!!!
 
Доброе время суток.
Цитата
elementarnost написал:
начала скормила большому файлу и завис на долго,
Версия на Power Query. Думаю, будет по шустрее, у коллеги судя по коду N^2, в предлагаемом N*log(N).
Успехов.
Изменено: Андрей VG - 08.07.2017 18:02:28
 
Цитата
Андрей VG написал: Версия на Power Query. Думаю, будет по шустрее
спасибо, что также откликнулись.  установила эту надстройку.

Цитата
Андрей VG написал: у коллеги судя по коду N^2, в предлагаемом N*log(N).
вот тут ничего не поняла...  в Power Query тот же код вставлять?
Изменено: elementarnost - 08.07.2017 21:57:56
 
Пробуйте, вроде работает не  долго :)
Код
Sub test()
Dim dic As Object, cnt
Dim arr$(), allarr(), i&, j&, z$, x&
Set dic = CreateObject("Scripting.Dictionary")
allarr = Range("a3:a" & Cells(Rows.Count, 1).End(xlUp).Row)
Range("a3:a" & Cells(Rows.Count, 1).End(xlUp).Row).ClearContents
ReDim Preserve allarr(LBound(allarr) To UBound(allarr), 1 To 2)
For x = LBound(allarr) To UBound(allarr)
    allarr(x, 2) = allarr(x, 1)
    arr = Split(allarr(x, 1))
    For i = LBound(arr) To UBound(arr)
        For j = i + 1 To UBound(arr)
            If arr(i) > arr(j) Then z = arr(i): arr(i) = arr(j): arr(j) = z
        Next j
    Next i
    allarr(x, 1) = Join(arr)
    dic.Item(CStr(allarr(x, 1))) = allarr(x, 2)
Next x
Range("a3").Resize(dic.Count) = Application.Transpose(dic.items)
End Sub
"Все гениальное просто, а все простое гениально!!!"
 
Цитата
elementarnost написал:
от тут ничего не поняла...  в Power Query тот же код вставлять?
Не понял, какой код? Он уже есть в прилагаемой книге. Если речь о переносе кода в свою книгу, то да. Только не забудьте, что источником данных выступает таблица sentences со столбцом название, следовательно в этой книге это должно быть.
Цитата
Nordheim написал:
Пробуйте, вроде работает не  долго
Ну, так да. Сортировка слов и словарь - наше всё! Только поаккуратнее с Application.Transpose на больших массивах не работает.
 
Кнопка цитирования не для ответа [МОДЕРАТОР]

Nordheim, молнеиносно!!!!!! за 5 секунд превратил из 54 тыщ строк 39! спасибо огромное!!!!
 
Цитата
Андрей VG написал: Не понял, какой код? Он уже есть в прилагаемой книге.
признаюсь честно, я не работала с этой надстройкой. для меня в ней все в новинку и не понятно. понимаю, что Вы что-то дельное советуете, для меня все как иностранный язык. также понимаю, что Вы не обязаны заниматься обучением. и очень благодарна людям здесь за помощь.
 
Цитата
Андрей VG написал: Сортировка слов и словарь...
Если будет более 62000 строк необходима доработка. которая переносит данные из словаря в массив, и далее из массива на лист.
Если нужно будет могу написать.
Изменено: Nordheim - 10.07.2017 01:29:17
"Все гениальное просто, а все простое гениально!!!"
 
Цитата
Nordheim написал:
Если нужно будет могу написать.
спасибо огромное!
 
Убрал  
Код
Application.Transpose
во избежание недоразумений.
Код
Sub test111()
Dim dic As Object, cnt
Dim arr$(), allarr(), i&, j&, z$, x&
Set dic = CreateObject("Scripting.Dictionary")
allarr = Range("a3:a" & Cells(Rows.Count, 1).End(xlUp).Row)
Range("a3:a" & Cells(Rows.Count, 1).End(xlUp).Row).ClearContents
ReDim Preserve allarr(LBound(allarr) To UBound(allarr), 1 To 2)
For x = LBound(allarr) To UBound(allarr)
    allarr(x, 2) = allarr(x, 1)
    arr = Split(allarr(x, 1))
    For i = LBound(arr) To UBound(arr)
        For j = i + 1 To UBound(arr)
            If arr(i) > arr(j) Then z = arr(i): arr(i) = arr(j): arr(j) = z
        Next j
    Next i
    allarr(x, 1) = Join(arr)
    dic.Item(CStr(allarr(x, 1))) = allarr(x, 2)
Next x
x = 0
ReDim arr(1 To dic.Count, 1 To 2)
For Each cnt In dic.items
    x = x + 1
    arr(x, 1) = cnt
Next cnt
Range("a3").Resize(dic.Count) = arr
End Sub

Попробовал скорость та же :)
Изменено: Nordheim - 09.07.2017 11:56:46
"Все гениальное просто, а все простое гениально!!!"
 
Цитата
Nordheim написал:
Попробовал скорость та же
супер!!!!!!!! у меня нет слов, чтобы передать восторг!!! громаднейшее спасибо Вам!!!
 
Вариант для Mac с коллекцией вместо словаря.
Код
Sub test111()
Dim dic As New Collection, cnt
Dim arr$(), allarr(), i&, j&, z$, x&
allarr = Range("a3:a" & Cells(Rows.Count, 1).End(xlUp).Row)
Range("a3:a" & Cells(Rows.Count, 1).End(xlUp).Row).ClearContents
ReDim Preserve allarr(LBound(allarr) To UBound(allarr), 1 To 2)
On Error Resume Next
For x = LBound(allarr) To UBound(allarr)
    allarr(x, 2) = allarr(x, 1)
    arr = Split(allarr(x, 1))
    For i = LBound(arr) To UBound(arr)
        For j = i + 1 To UBound(arr)
            If UCase(arr(i)) > UCase(arr(j)) Then z = arr(i): arr(i) = arr(j): arr(j) = z
        Next j
    Next i
    allarr(x, 1) = Join(arr)
    dic.Add allarr(x, 2), CStr(allarr(x, 1))
Next x
On Error GoTo 0
x = 0
ReDim arr(1 To dic.Count, 1 To 2)
For Each cnt In dic
    x = x + 1
    arr(x, 1) = cnt
Next cnt
Range("a3").Resize(dic.Count) = arr
End Sub
Изменено: Nordheim - 09.07.2017 15:05:07
"Все гениальное просто, а все простое гениально!!!"
 
Цитата
elementarnost написал:
то Вы не обязаны заниматься обучением. и очень благодарна людям здесь за помощь.
Так есть же уже уроки по Power Query и на этом сайте и на сайте Дмитрия, например. ;)  К чему повторяться?
К тому же варианты Nordheim вам вполне подошли.
 
Цитата
elementarnost написал: понимаю, что Вы что-то дельное советуете,
и всегда интересное  :) ...
off:
но вот до сих пор не могу проникнуться идеей Power Query - центральная идея - ООП? или центральная идея - Entity-Relations?... чтобы Pro-et-Contra взвесить... (перспективы использования и свои предпочтения)... просто очередной язык (со своим словарным запасом)... с виду достаточно компактен...
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Цитата
JeyCi написал:
Power Query - центральная идея - ООП? или центральная идея - Entity-Relations?
Центральная идея - функциональный язык программирования, точно также как формулы Excel. Да, есть набор встроенных функций, поддерживающих модель отношений - связывания таблиц по ключу, но, повторюсь, прежде всего функциональный язык программирования.
Страницы: 1
Читают тему
Наверх