Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Удалить повторяющиеся символы и слова в ячейке - Мир MS Excel

Старая форма входа
  • Страница 1 из 2
  • 1
  • 2
  • »
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Удалить повторяющиеся символы и слова в ячейке (Макросы/Sub)
Удалить повторяющиеся символы и слова в ячейке
pashatank Дата: Четверг, 23.08.2018, 17:16 | Сообщение № 1
Группа: Пользователи
Ранг: Участник
Сообщений: 58
Репутация: 0 ±
Замечаний: 40% ±

Excel 2010
Добрый день! Уважаемые форумчане помогите решить, в одном столбце практически в каждой ячейке есть повторяющиеся слова и знаки, пример:

Фильтр воздушный для BMW X5 E70, BMW X5 E70, X5 E70
Фильтр для BMW 7 E65, , , , , , , , BMW 7 E65, , , , , , , , BMW 7 E65, , , , , , ,

есть вот такой макрос

[vba]
Код
Sub bb()
Dim c As Range, x, nbsp$
nbsp = Chr$(160)
With CreateObject("scripting.dictionary")
  For Each c In Selection
    .RemoveAll
    For Each x In Split(Application.Trim(Replace$(c, nbsp, " ")), ",")
      x = Trim(x)
      .Item(x) = 0
    Next
    c = Join(.keys, ", ")
  Next
End With
End Sub
[/vba]

но он все-таки удаляет не все дубли, помогите понять почему?
файл прицепил
К сообщению приложен файл: 578.xlsx (9.2 Kb)


Сообщение отредактировал pashatank - Четверг, 23.08.2018, 17:39
 
Ответить
СообщениеДобрый день! Уважаемые форумчане помогите решить, в одном столбце практически в каждой ячейке есть повторяющиеся слова и знаки, пример:

Фильтр воздушный для BMW X5 E70, BMW X5 E70, X5 E70
Фильтр для BMW 7 E65, , , , , , , , BMW 7 E65, , , , , , , , BMW 7 E65, , , , , , ,

есть вот такой макрос

[vba]
Код
Sub bb()
Dim c As Range, x, nbsp$
nbsp = Chr$(160)
With CreateObject("scripting.dictionary")
  For Each c In Selection
    .RemoveAll
    For Each x In Split(Application.Trim(Replace$(c, nbsp, " ")), ",")
      x = Trim(x)
      .Item(x) = 0
    Next
    c = Join(.keys, ", ")
  Next
End With
End Sub
[/vba]

но он все-таки удаляет не все дубли, помогите понять почему?
файл прицепил

Автор - pashatank
Дата добавления - 23.08.2018 в 17:16
RAN Дата: Четверг, 23.08.2018, 18:10 | Сообщение № 2
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
[vba]
Код
   For Each x In Split(Application.Trim(Replace$(Replace$(c, "для", "для,"), nbsp, " ")), ",")
[/vba]


Быть или не быть, вот в чем загвоздка!
 
Ответить
Сообщение[vba]
Код
   For Each x In Split(Application.Trim(Replace$(Replace$(c, "для", "для,"), nbsp, " ")), ",")
[/vba]

Автор - RAN
Дата добавления - 23.08.2018 в 18:10
pashatank Дата: Четверг, 23.08.2018, 18:29 | Сообщение № 3
Группа: Пользователи
Ранг: Участник
Сообщений: 58
Репутация: 0 ±
Замечаний: 40% ±

Excel 2010
Спасибо RAN, сейчас действительно с дублями справляется, но макрос ставит запятую там где ее быть не должно: Фильтр для, BMW 7 E65, можно попросить тогда без дублей символов, только слова?
А запятые я потом другим макросом почищу.


Сообщение отредактировал pashatank - Четверг, 23.08.2018, 18:38
 
Ответить
СообщениеСпасибо RAN, сейчас действительно с дублями справляется, но макрос ставит запятую там где ее быть не должно: Фильтр для, BMW 7 E65, можно попросить тогда без дублей символов, только слова?
А запятые я потом другим макросом почищу.

Автор - pashatank
Дата добавления - 23.08.2018 в 18:29
RAN Дата: Четверг, 23.08.2018, 18:59 | Сообщение № 4
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
[vba]
Код
        Dim spl
        For Each c In Selection
            .RemoveAll
            spl = Split(c, "для")
            For Each x In Split(Replace$(spl(1), nbsp, " "), ",")
                If x <> Chr(32) Then .Item(x) = 0
            Next
            c = spl(0) & " " & Join(.keys, ", ")
        Next
[/vba]


Быть или не быть, вот в чем загвоздка!
 
Ответить
Сообщение[vba]
Код
        Dim spl
        For Each c In Selection
            .RemoveAll
            spl = Split(c, "для")
            For Each x In Split(Replace$(spl(1), nbsp, " "), ",")
                If x <> Chr(32) Then .Item(x) = 0
            Next
            c = spl(0) & " " & Join(.keys, ", ")
        Next
[/vba]

Автор - RAN
Дата добавления - 23.08.2018 в 18:59
pashatank Дата: Четверг, 23.08.2018, 19:21 | Сообщение № 5
Группа: Пользователи
Ранг: Участник
Сообщений: 58
Репутация: 0 ±
Замечаний: 40% ±

Excel 2010
Вставил, но вот по такой конструкции

[vba]
Код
Sub bb()
Dim spl
        For Each c In Selection
            .RemoveAll
            spl = Split(c, "для")
            For Each x In Split(Replace$(spl(1), nbsp, " "), ",")
                If x <> Chr(32) Then .Item(x) = 0
            Next
            c = spl(0) & " " & Join(.keys, ", ")
        Next
    c = Join(.keys, ", ")
Next
End With
End Sub
[/vba]

ругается invalid or unqualified reference и отсылает на .RemoveAll, что не так сделал?
 
Ответить
СообщениеВставил, но вот по такой конструкции

[vba]
Код
Sub bb()
Dim spl
        For Each c In Selection
            .RemoveAll
            spl = Split(c, "для")
            For Each x In Split(Replace$(spl(1), nbsp, " "), ",")
                If x <> Chr(32) Then .Item(x) = 0
            Next
            c = spl(0) & " " & Join(.keys, ", ")
        Next
    c = Join(.keys, ", ")
Next
End With
End Sub
[/vba]

ругается invalid or unqualified reference и отсылает на .RemoveAll, что не так сделал?

Автор - pashatank
Дата добавления - 23.08.2018 в 19:21
RAN Дата: Четверг, 23.08.2018, 20:19 | Сообщение № 6
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
А чем словарь обидел? Зачем его надо было удалять? yes
[vba]
Код
Sub bb()
    Dim c As Range, x, nbsp$
    nbsp = Chr$(160)
    With CreateObject("scripting.dictionary")
        Dim spl
        For Each c In Selection
            .RemoveAll
            spl = Split(c, "для")
            For Each x In Split(Replace$(spl(1), nbsp, " "), ",")
                If x <> Chr(32) Then .Item(x) = 0
            Next
            c = spl(0) & " " & Join(.keys, ", ")
        Next
    End With
End Sub
[/vba]


Быть или не быть, вот в чем загвоздка!

Сообщение отредактировал RAN - Четверг, 23.08.2018, 20:21
 
Ответить
СообщениеА чем словарь обидел? Зачем его надо было удалять? yes
[vba]
Код
Sub bb()
    Dim c As Range, x, nbsp$
    nbsp = Chr$(160)
    With CreateObject("scripting.dictionary")
        Dim spl
        For Each c In Selection
            .RemoveAll
            spl = Split(c, "для")
            For Each x In Split(Replace$(spl(1), nbsp, " "), ",")
                If x <> Chr(32) Then .Item(x) = 0
            Next
            c = spl(0) & " " & Join(.keys, ", ")
        Next
    End With
End Sub
[/vba]

Автор - RAN
Дата добавления - 23.08.2018 в 20:19
pashatank Дата: Пятница, 24.08.2018, 05:22 | Сообщение № 7
Группа: Пользователи
Ранг: Участник
Сообщений: 58
Репутация: 0 ±
Замечаний: 40% ±

Excel 2010
Ну, это все в силу малограмотности )
Но теперь код удаляет "для" и вместо "Фильтр для BMW 7 E65", остается только "Фильтр воздушный BMW X5 E70".
И выдает Run-time error 9: Subscript out of range, а debag шлет сюда:

[vba]
Код
For Each x In Split(Replace$(spl(1), nbsp, " "), ",")
[/vba]

Может по другому попробовать решить, прицепил с удаленными лишними запятыми, осталось только дубли слов убрать, пример:
Фильтр воздушный для BMW X5 E70, BMW X5 E70
Фильтр для BMW 7 E65, BMW 7 E65, BMW 7 E65

чтобы осталось только
Фильтр воздушный для BMW X5 E70
Фильтр для BMW 7 E65, BMW 7 E65

Опять же похоже вернулся к первому коду, чтобы удалял все дубли в строчке, с условием что будут удалены все дубли между запятыми и с запятой на конце, но не могу понять почему код не срабатывает в моем случае...
К сообщению приложен файл: 578__.xlsx (9.2 Kb)


Сообщение отредактировал pashatank - Пятница, 24.08.2018, 05:27
 
Ответить
СообщениеНу, это все в силу малограмотности )
Но теперь код удаляет "для" и вместо "Фильтр для BMW 7 E65", остается только "Фильтр воздушный BMW X5 E70".
И выдает Run-time error 9: Subscript out of range, а debag шлет сюда:

[vba]
Код
For Each x In Split(Replace$(spl(1), nbsp, " "), ",")
[/vba]

Может по другому попробовать решить, прицепил с удаленными лишними запятыми, осталось только дубли слов убрать, пример:
Фильтр воздушный для BMW X5 E70, BMW X5 E70
Фильтр для BMW 7 E65, BMW 7 E65, BMW 7 E65

чтобы осталось только
Фильтр воздушный для BMW X5 E70
Фильтр для BMW 7 E65, BMW 7 E65

Опять же похоже вернулся к первому коду, чтобы удалял все дубли в строчке, с условием что будут удалены все дубли между запятыми и с запятой на конце, но не могу понять почему код не срабатывает в моем случае...

Автор - pashatank
Дата добавления - 24.08.2018 в 05:22
pashatank Дата: Пятница, 24.08.2018, 05:32 | Сообщение № 8
Группа: Пользователи
Ранг: Участник
Сообщений: 58
Репутация: 0 ±
Замечаний: 40% ±

Excel 2010
Понял почему :facepalm:
Нужно вот сюда
[vba]
Код
Sub bb()
Dim c As Range, x, nbsp$
nbsp = Chr$(160)
With CreateObject("scripting.dictionary")
For Each c In Selection
    .RemoveAll
    For Each x In Split(Application.Trim(Replace$(c, nbsp, " ")), ",")
    x = Trim(x)
    .Item(x) = 0
    Next
    c = Join(.keys, ", ")
Next
End With
End Sub
[/vba]
добавить условие, что дубли в ячейках будут удаляться после слова "для", как это прописать?


Сообщение отредактировал pashatank - Пятница, 24.08.2018, 05:36
 
Ответить
СообщениеПонял почему :facepalm:
Нужно вот сюда
[vba]
Код
Sub bb()
Dim c As Range, x, nbsp$
nbsp = Chr$(160)
With CreateObject("scripting.dictionary")
For Each c In Selection
    .RemoveAll
    For Each x In Split(Application.Trim(Replace$(c, nbsp, " ")), ",")
    x = Trim(x)
    .Item(x) = 0
    Next
    c = Join(.keys, ", ")
Next
End With
End Sub
[/vba]
добавить условие, что дубли в ячейках будут удаляться после слова "для", как это прописать?

Автор - pashatank
Дата добавления - 24.08.2018 в 05:32
pashatank Дата: Суббота, 25.08.2018, 06:45 | Сообщение № 9
Группа: Пользователи
Ранг: Участник
Сообщений: 58
Репутация: 0 ±
Замечаний: 40% ±

Excel 2010
Уважаемые форумчане, помогите с вопросом пожалуйста, необходимо удалить повторяющиеся слова в ячейке, пример:
Фильтр воздушный для BMW X5 E70, BMW X5 E70, BMW X5 E70, BMW X5 E70,
Фильтр для BMW 7 E65, BMW 7 E65, BMW 7 E65, BMW 7 E65, BMW 7 E65,
но, по условию, что удаляться дубли и последняя запятая будут после слова "для", вот в этот код надо условие вставить:
[vba]
Код
Sub bb()
Dim c As Range, x, nbsp$
nbsp = Chr$(160)
With CreateObject("scripting.dictionary")
  For Each c In Selection
    .RemoveAll
    For Each x In Split(Application.Trim(Replace$(c, nbsp, " ")), ",")
      x = Trim(x)
      .Item(x) = 0
    Next
    c = Join(.keys, ", ")
  Next
End With
End Sub
[/vba]
 
Ответить
СообщениеУважаемые форумчане, помогите с вопросом пожалуйста, необходимо удалить повторяющиеся слова в ячейке, пример:
Фильтр воздушный для BMW X5 E70, BMW X5 E70, BMW X5 E70, BMW X5 E70,
Фильтр для BMW 7 E65, BMW 7 E65, BMW 7 E65, BMW 7 E65, BMW 7 E65,
но, по условию, что удаляться дубли и последняя запятая будут после слова "для", вот в этот код надо условие вставить:
[vba]
Код
Sub bb()
Dim c As Range, x, nbsp$
nbsp = Chr$(160)
With CreateObject("scripting.dictionary")
  For Each c In Selection
    .RemoveAll
    For Each x In Split(Application.Trim(Replace$(c, nbsp, " ")), ",")
      x = Trim(x)
      .Item(x) = 0
    Next
    c = Join(.keys, ", ")
  Next
End With
End Sub
[/vba]

Автор - pashatank
Дата добавления - 25.08.2018 в 06:45
Pelena Дата: Суббота, 25.08.2018, 08:19 | Сообщение № 10
Группа: Админы
Ранг: Местный житель
Сообщений: 19174
Репутация: 4413 ±
Замечаний: ±

Excel 365 & Mac Excel
В макросе от RAN из поста 6 строчку для переменной с запишите так
[vba]
Код
c = spl(0) & "для " & Join(.keys, ", ")
[/vba]


"Черт возьми, Холмс! Но как??!!"
Ю-money 41001765434816
 
Ответить
СообщениеВ макросе от RAN из поста 6 строчку для переменной с запишите так
[vba]
Код
c = spl(0) & "для " & Join(.keys, ", ")
[/vba]

Автор - Pelena
Дата добавления - 25.08.2018 в 08:19
RAN Дата: Суббота, 25.08.2018, 08:54 | Сообщение № 11
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
Ну для... тех танков, которые в танке, нужно так
[vba]
Код
Sub bb()
    Dim c As Range, x, nbsp$
    nbsp = Chr$(160)
    With CreateObject("scripting.dictionary")
        Dim spl
        For Each c In Selection
            .RemoveAll
            If InStr(c, "для") Then
                spl = Split(c, "для")
                For Each x In Split(Replace$(spl(1), nbsp, " "), ",")
                    If x <> Chr(32) Then .Item(x) = 0
                Next
                c = spl(0) & "для " & Join(.keys, ", ") & ","
            Else
                For Each x In Split(Replace$(c, nbsp, " "), ",")
                    If x <> Chr(32) Then .Item(x) = 0
                Next
                c =  Join(.keys, ", ") & ","
            End If
        Next
    End With
End Sub
[/vba]


Быть или не быть, вот в чем загвоздка!
 
Ответить
СообщениеНу для... тех танков, которые в танке, нужно так
[vba]
Код
Sub bb()
    Dim c As Range, x, nbsp$
    nbsp = Chr$(160)
    With CreateObject("scripting.dictionary")
        Dim spl
        For Each c In Selection
            .RemoveAll
            If InStr(c, "для") Then
                spl = Split(c, "для")
                For Each x In Split(Replace$(spl(1), nbsp, " "), ",")
                    If x <> Chr(32) Then .Item(x) = 0
                Next
                c = spl(0) & "для " & Join(.keys, ", ") & ","
            Else
                For Each x In Split(Replace$(c, nbsp, " "), ",")
                    If x <> Chr(32) Then .Item(x) = 0
                Next
                c =  Join(.keys, ", ") & ","
            End If
        Next
    End With
End Sub
[/vba]

Автор - RAN
Дата добавления - 25.08.2018 в 08:54
pashatank Дата: Суббота, 25.08.2018, 14:53 | Сообщение № 12
Группа: Пользователи
Ранг: Участник
Сообщений: 58
Репутация: 0 ±
Замечаний: 40% ±

Excel 2010
Приогромнейше благодарю, уважаемые Pelena и RAN! То, что нужно.
 
Ответить
СообщениеПриогромнейше благодарю, уважаемые Pelena и RAN! То, что нужно.

Автор - pashatank
Дата добавления - 25.08.2018 в 14:53
krosav4ig Дата: Суббота, 25.08.2018, 15:43 | Сообщение № 13
Группа: Друзья
Ранг: Старожил
Сообщений: 2347
Репутация: 989 ±
Замечаний: 0% ±

Excel 2007,2010,2013
до кучи [vba]
Код
Sub bb()
    Dim arr() As Variant, i&
    With CreateObject("vbscript.regexp")
        .Pattern = "(?:([^,]+?),)(?=(?:.*?\1(?:,|$)))|(?:,\s*)+$|(?:(,)(\s)*){2,}"
        .Global = True: .MultiLine = True
        arr = Selection.Value
        For i = 1 To UBound(arr)
            If .test(arr(i, 1)) Then arr(i, 1) = .Replace(arr(i, 1), "$2$3")
        Next
        Selection.Value = arr
    End With
End Sub
[/vba]


email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460
 
Ответить
Сообщениедо кучи [vba]
Код
Sub bb()
    Dim arr() As Variant, i&
    With CreateObject("vbscript.regexp")
        .Pattern = "(?:([^,]+?),)(?=(?:.*?\1(?:,|$)))|(?:,\s*)+$|(?:(,)(\s)*){2,}"
        .Global = True: .MultiLine = True
        arr = Selection.Value
        For i = 1 To UBound(arr)
            If .test(arr(i, 1)) Then arr(i, 1) = .Replace(arr(i, 1), "$2$3")
        Next
        Selection.Value = arr
    End With
End Sub
[/vba]

Автор - krosav4ig
Дата добавления - 25.08.2018 в 15:43
pashatank Дата: Суббота, 25.08.2018, 15:47 | Сообщение № 14
Группа: Пользователи
Ранг: Участник
Сообщений: 58
Репутация: 0 ±
Замечаний: 40% ±

Excel 2010
krosav4ig, как вариант, тоже спасибо!
 
Ответить
Сообщениеkrosav4ig, как вариант, тоже спасибо!

Автор - pashatank
Дата добавления - 25.08.2018 в 15:47
RAN Дата: Суббота, 25.08.2018, 21:17 | Сообщение № 15
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
krosav4ig, ну ты и завернул! <_<
Глянул, и понял, что ответ на вопрос, что, где, почем, будет добираться минимум полчаса. yes


Быть или не быть, вот в чем загвоздка!
 
Ответить
Сообщениеkrosav4ig, ну ты и завернул! <_<
Глянул, и понял, что ответ на вопрос, что, где, почем, будет добираться минимум полчаса. yes

Автор - RAN
Дата добавления - 25.08.2018 в 21:17
krosav4ig Дата: Воскресенье, 26.08.2018, 02:12 | Сообщение № 16
Группа: Друзья
Ранг: Старожил
Сообщений: 2347
Репутация: 989 ±
Замечаний: 0% ±

Excel 2007,2010,2013
ну ты и завернул!
Ога, сам в шоке yes , сомневался, что в одну регулярку удастся запихнуть
[vba]
Код
(?:([^,]+?),)
[/vba]
Любое количество не запятых перед запятой. ? после + тут, в принципе, не нада. Удаляется при условии, что
[vba]
Код
(?=(?:.*?\1(?:,|$)))
[/vba]
находится перед любым количеством символов и таким же набором символов (обратная ссылка на захватываемую группу - \1 ), находящимся перед запятой или символом конца строки. да и тут одна вложенная незахватываемая группа лишняя
[vba]
Код
(?:,\s*)+$
[/vba]
Группа из запятой с последующим любым количеством пробельных символов повторяющаяся любое количество раз перед символом конца строки ($). Удаляются все
[vba]
Код
(?:(,)(\s)*){2,}
[/vba] группа из запятой с последующим любым количеством пробельных символов повторяющаяся от 2х раз. Удаляются все повторы кроме последнего (за это отвечают указатели на захватываемые группы в маске замены - $2$3), оставляя последний пробельный символ, если их было >1 (из-за того, что счетчик * вынесен за скобки)
Символ | между блоками - ИЛИ
с поправками регулярка получилась [vba]
Код
(?:([^,]+),)(?=.*?\1(?:,|$))|(?:,\s*)+$|(?:(,)(\s)*){2,}
[/vba]
Более развернуто можно тут посмотреть, справа Explanation, правда тока на англицком


email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460

Сообщение отредактировал krosav4ig - Воскресенье, 26.08.2018, 02:15
 
Ответить
Сообщение
ну ты и завернул!
Ога, сам в шоке yes , сомневался, что в одну регулярку удастся запихнуть
[vba]
Код
(?:([^,]+?),)
[/vba]
Любое количество не запятых перед запятой. ? после + тут, в принципе, не нада. Удаляется при условии, что
[vba]
Код
(?=(?:.*?\1(?:,|$)))
[/vba]
находится перед любым количеством символов и таким же набором символов (обратная ссылка на захватываемую группу - \1 ), находящимся перед запятой или символом конца строки. да и тут одна вложенная незахватываемая группа лишняя
[vba]
Код
(?:,\s*)+$
[/vba]
Группа из запятой с последующим любым количеством пробельных символов повторяющаяся любое количество раз перед символом конца строки ($). Удаляются все
[vba]
Код
(?:(,)(\s)*){2,}
[/vba] группа из запятой с последующим любым количеством пробельных символов повторяющаяся от 2х раз. Удаляются все повторы кроме последнего (за это отвечают указатели на захватываемые группы в маске замены - $2$3), оставляя последний пробельный символ, если их было >1 (из-за того, что счетчик * вынесен за скобки)
Символ | между блоками - ИЛИ
с поправками регулярка получилась [vba]
Код
(?:([^,]+),)(?=.*?\1(?:,|$))|(?:,\s*)+$|(?:(,)(\s)*){2,}
[/vba]
Более развернуто можно тут посмотреть, справа Explanation, правда тока на англицком

Автор - krosav4ig
Дата добавления - 26.08.2018 в 02:12
pashatank Дата: Среда, 29.08.2018, 04:12 | Сообщение № 17
Группа: Пользователи
Ранг: Участник
Сообщений: 58
Репутация: 0 ±
Замечаний: 40% ±

Excel 2010
krosav4ig, макрос шустрый, но не всегда верно обрабатывает, например: "Фильтр для AUDI 80," вышло как: "Фильтр для AUDI 8".
Прицепил пример, в первом листе, то что нужно обработать, а во втором, то что вышло.
К сообщению приложен файл: 578578.xls (28.0 Kb)


Сообщение отредактировал pashatank - Среда, 29.08.2018, 16:55
 
Ответить
Сообщениеkrosav4ig, макрос шустрый, но не всегда верно обрабатывает, например: "Фильтр для AUDI 80," вышло как: "Фильтр для AUDI 8".
Прицепил пример, в первом листе, то что нужно обработать, а во втором, то что вышло.

Автор - pashatank
Дата добавления - 29.08.2018 в 04:12
pashatank Дата: Среда, 29.08.2018, 16:56 | Сообщение № 18
Группа: Пользователи
Ранг: Участник
Сообщений: 58
Репутация: 0 ±
Замечаний: 40% ±

Excel 2010
или это у меня в танке только ошибки лезут?
 
Ответить
Сообщениеили это у меня в танке только ошибки лезут?

Автор - pashatank
Дата добавления - 29.08.2018 в 16:56
krosav4ig Дата: Среда, 29.08.2018, 22:39 | Сообщение № 19
Группа: Друзья
Ранг: Старожил
Сообщений: 2347
Репутация: 989 ±
Замечаний: 0% ±

Excel 2007,2010,2013
[vba]
Код
Sub bb()
    Dim arr() As Variant, i&
    With CreateObject("vbscript.regexp")
        .Pattern = "(?:([^,]+),)(?=(?:.*?,\1|\1)(?:,|$))|(?:,\s*)+$|(?:(,)(\s)*){2,}|\s+\K,\s*"
        .Global = True: .MultiLine = True
        arr = Selection.Value
        For i = 1 To UBound(arr)
           If .test(arr(i, 1)) Then arr(i, 1) = .Replace(arr(i, 1), "$2$3")
        Next
        Selection.Value = arr
    End With
End Sub
[/vba]
Одну запятую пока не удалось регуляркой отработать, сделал обычной заменой
исправил регулярку, должно работать, проверряйте


email:krosav4ig26@gmail.com WMR R207627035142 WMZ Z821145374535 ЯД 410012026478460

Сообщение отредактировал krosav4ig - Среда, 29.08.2018, 23:11
 
Ответить
Сообщение[vba]
Код
Sub bb()
    Dim arr() As Variant, i&
    With CreateObject("vbscript.regexp")
        .Pattern = "(?:([^,]+),)(?=(?:.*?,\1|\1)(?:,|$))|(?:,\s*)+$|(?:(,)(\s)*){2,}|\s+\K,\s*"
        .Global = True: .MultiLine = True
        arr = Selection.Value
        For i = 1 To UBound(arr)
           If .test(arr(i, 1)) Then arr(i, 1) = .Replace(arr(i, 1), "$2$3")
        Next
        Selection.Value = arr
    End With
End Sub
[/vba]
Одну запятую пока не удалось регуляркой отработать, сделал обычной заменой
исправил регулярку, должно работать, проверряйте

Автор - krosav4ig
Дата добавления - 29.08.2018 в 22:39
pashatank Дата: Четверг, 30.08.2018, 06:45 | Сообщение № 20
Группа: Пользователи
Ранг: Участник
Сообщений: 58
Репутация: 0 ±
Замечаний: 40% ±

Excel 2010
krosav4ig, все отлично работает, оставляет правда запятую после для и кое где еще, но это решаемо через замену, спасибо Вам огромное!
 
Ответить
Сообщениеkrosav4ig, все отлично работает, оставляет правда запятую после для и кое где еще, но это решаемо через замену, спасибо Вам огромное!

Автор - pashatank
Дата добавления - 30.08.2018 в 06:45
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Удалить повторяющиеся символы и слова в ячейке (Макросы/Sub)
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!