Профессиональные приемы работы в Microsoft Excel

Обмен опытом => Microsoft Excel => Тема начата: spono от 20.07.2015, 12:29

Название: Нужно удалять дубликаты слов по строкам внутри каждой ячейки.
Отправлено: spono от 20.07.2015, 12:29
Здравствуйте, помогите пжл:
Нужно реализовать макрос, который будет удалять дубликаты слов по строкам внутри каждой ячейки, при этом слова из разных ячеек сравниваться не будут.
Пример дубля слово: canon ir-3225<br> в файле double-20.07.2015.xlsx Ячейка D5
Название: Re: Нужно удалять дубликаты слов по строкам внутри каждой ячейки.
Отправлено: Serge 007 от 20.07.2015, 19:38
Здравствуйте

Почему canon ir-3225<br> является дублем, если сравнивать макрос должен построчно?
Ведь в пятой строке нет ещё хотя бы одного "слова" canon ir-3225<br>
Название: Re: Нужно удалять дубликаты слов по строкам внутри каждой ячейки.
Отправлено: spono от 20.07.2015, 19:50
Макрос должен сравнивать слова построчно внутри каждой ячейки.
А в ячейке D5 слово canon ir-3225<br> повторяется дважды.

содержание ячейки D5:
canon ir-2230<br>
canon ir-2270<br>
canon ir-2270i<br>
canon ir-2830<br>
canon ir-2870<br>
canon ir-2870f<br>
canon ir-2870i<br>
canon ir-3025<br>
canon ir-3025n<br>
canon ir-3025ne<br>
canon ir-3030<br>
canon ir-3230<br>
canon ir-3225<br>
canon ir-3225<br>
canon ir-3225n<br>
canon ir-3235<br>
canon ir-3235i<br>
canon ir-3235n<br>
canon ir-3245<br>
canon ir-3245i<br>
canon ir-3245n<br>
Canon IR-3225e<br>
Canon IR-3225Ne<br>
Canon IR-3245e<br>
Canon IR-3245Ne<br>
Название: Re: Нужно удалять дубликаты слов по строкам внутри каждой ячейки.
Отправлено: cheshiki1 от 21.07.2015, 08:34
макрос проходится по столбцу D (4 столбец) и в каждой ячейке удаляет дубли.
Sub vvv()
Dim n, i#, sd As Object
For i = 7 To Cells(Rows.Count, 4).End(xlUp).Row
Set sd = CreateObject("Scripting.Dictionary")
    For Each n In Split(Cells(i, 4), Chr(10))
     sd.Item(n) = ""
    Next
Cells(i, 4) = Join(sd.keys, Chr(10))
Next
End Sub
Название: Re: Нужно удалять дубликаты слов по строкам внутри каждой ячейки.
Отправлено: spono от 21.07.2015, 22:35
Я нажал Alt+F11 - Эта книга - Insert - Module затем Сохранился.
Выбрал стиль ссылок R1C1
Лента Разработчик - Макросы - vvv - Выполнить
Ничего не происходит - дубли строк в ячейках макрос не удаляет.
Название: Re: Нужно удалять дубликаты слов по строкам внутри каждой ячейки.
Отправлено: Serge 007 от 21.07.2015, 23:37
spono, зачем Вы процитировали пост целиком?
Вам предупреждение за оверквотинг
Пока просто предупреждение
Название: Re: Нужно удалять дубликаты слов по строкам внутри каждой ячейки.
Отправлено: cheshiki1 от 22.07.2015, 10:05
баловался с макросом менял начало цикла и назад не вернул :).
исправьте i=7 на, вроде (по памяти), i=4 (т.е. первую проверяемую строку столбца D)
Название: Re: Нужно удалять дубликаты слов по строкам внутри каждой ячейки.
Отправлено: spono от 22.07.2015, 10:47
Заработало )) спасибо.
Скажие пжл, а как сделать так, чтобы макрос удалял дубли слов вне зависимости от их регистра?

Например:
AAA
BBB
CCC
aaa
DDD
Название: Re: Нужно удалять дубликаты слов по строкам внутри каждой ячейки.
Отправлено: cheshiki1 от 22.07.2015, 11:37
вариант
sd.Item(UCase(n))= ""
Название: Re: Нужно удалять дубликаты слов по строкам внутри каждой ячейки.
Отправлено: spono от 22.07.2015, 12:16
Я вставил код: sd.Item(UCase(n))= "" в макрос, он удалил дубли, но при этом заменил регистр у букв ((
А как сделать так, чтобы регистр букв не менялся, а дубли удалялись в не зависимости от регистра букв?
Название: Re: Нужно удалять дубликаты слов по строкам внутри каждой ячейки.
Отправлено: cheshiki1 от 27.07.2015, 10:22
проверяйте
Sub vvv()
Dim n, i#, sd As Object, mas(), ii#
For i = 4 To Cells(Rows.Count, 4).End(xlUp).Row
Set sd = CreateObject("Scripting.Dictionary")
    For Each n In Split(Cells(i, 4), Chr(10))
      If Not sd.Exists(UCase(n)) Then
         sd.Item(UCase(n)) = ""
         ReDim Preserve mas(ii)
         mas(ii) = n
         ii = ii + 1
      End If
    Next
Cells(i, 4) = Join(mas, Chr(10))
Next
End Sub
Название: Re: Нужно удалять дубликаты слов по строкам внутри каждой ячейки.
Отправлено: spono от 27.07.2015, 12:35
При выполнении данный макрос копирует содержание первой и второй ячейки 4 столбца на все остальные ячейки 4 столбца.
Название: Re: Нужно удалять дубликаты слов по строкам внутри каждой ячейки.
Отправлено: cheshiki1 от 27.07.2015, 13:31
УПС. забыл обнулить массив.
Sub vvv()
Dim n, i#, sd As Object, mas(), ii#
For i = 4 To Cells(Rows.Count, 4).End(xlUp).Row
Set sd = CreateObject("Scripting.Dictionary")
    For Each n In Split(Cells(i, 4), Chr(10))
      If Not sd.Exists(UCase(n)) Then
         sd.Item(UCase(n)) = ""
         ReDim Preserve mas(ii)
         mas(ii) = n
         ii = ii + 1
      End If
    Next
Cells(i, 4) = Join(mas, Chr(10))
ii = 0
Erase mas
Next
End Sub
Название: Re: Нужно удалять дубликаты слов по строкам внутри каждой ячейки.
Отправлено: spono от 27.07.2015, 13:55
Да, макрос превосходно работает, удаляет дубли строк вне зависимости от регистра символов!!!
;D Спасибо  ;D
Название: Re: Нужно удалять дубликаты слов по строкам внутри каждой ячейки.
Отправлено: RAN от 01.08.2015, 19:36
Не знаю, как далеко поезд ушел, но танец с бубном покороче так
sd.CompareMode = vbTextCompare