Страницы: 1
RSS
Удаление повторов значений в ячейке
 
Здравствуйте, уважаемые форумчане!

Подскажите, как можно убрать из ячейки ненужные повторы?
Лучше смотреть на примере (приложила), т.к. я даже не знаю как точно описать эту задачу :)
 
А как у Вас получилось 'Так надо'? Что-то там не только уникальные значения
UDF
Код
Function ЯЧЕЙКАУНИК(cl As Range, Optional dlm As String = "-")
Dim iStr, iTemp, I&
iStr = Split(Trim(cl.Value), dlm)
With CreateObject("Scripting.Dictionary")
    For I = 0 To UBound(iStr)
        iTemp = .Item(iStr(I))
    Next
    ЯЧЕЙКАУНИК = Join(.Keys, dlm)
End With
End Function
Изменено: Sanja - 11.10.2017 17:50:39
Согласие есть продукт при полном непротивлении сторон
 
еще вариант
Код
Function zzz(t$)
 With CreateObject("Scripting.Dictionary"): .CompareMode = 1
    For Each t1 In Split(t, "-"): .Item(Trim(t1)) = 0: Next
    zzz = Left(Join(.Keys, "-"), Len(Join(.Keys, "-")) - 1)
 End With
End Function
Изменено: sv2013 - 11.10.2017 18:06:11
 
Код
Function WithUotCouple(s$)
  Dim re:  Set re = CreateObject("vbscript.RegExp"): re.Global = True: re.Pattern = "(\d+-)\1+"
  if re.test(s) then WithUotCouple = re.Replace(s, "$1") else WithUotCouple = s
End Function
Изменено: Ігор Гончаренко - 12.10.2017 05:00:15
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Sanja написал:
А как у Вас получилось 'Так надо'? Что-то там не только уникальные значения
Это просто был пример как должно получиться. Да, там не совсем уникальные значения, неправильно написала..

Спасибо всем за помощь, но надо именно так, чтобы просто соседние повторяющиеся числа удалялись. Т.е. если 344-344-255-344-344-05-05-05-05-292-05-05-03, то должно остаться 344-255-344-05-292-05-03
Изменено: MilaP - 12.10.2017 10:05:16
 
Код
Sub qqq()
Dim i As Long, Stroka As String, Arr
    Arr = Split(Cells(1, 2), "-")
    For i = 0 To UBound(Arr) - 2
        If Stroka = "" Then
            Stroka = Arr(i)
        Else
            If Arr(i + 1) <> Arr(i) Then Stroka = Stroka & "-" & Arr(i + 1)
        End If
    Next
    Cells(2, 2) = Stroka
End Sub
 
Код
Function Tak_nado(sStr As String)
Dim arr() As String, uniq As New Collection, i As Long
arr = Split(sStr, "-")
For i = 0 To UBound(arr)
    On Error Resume Next
    uniq.Add arr(i), arr(i)
Next i
For i = 1 To uniq.Count
     Tak_nado = Tak_nado & " " & uniq(i)
Next i
Tak_nado = Replace(Trim(Tak_nado), " ", "-")
End Function
Изменено: Dmitriy XM - 12.10.2017 11:23:04
 
Dmitriy XM, пожалуйста, проверяйте предлагаемые Вами решения - не тот результат.
Второй раз прошу.
 
Юрий М,предлагаемый свой вариант я проверил, но не с Вашим решением  
 
Дмитрий, но ведь Ваш вариант выдаст просто список уникальных, а не то, что требуется: ведь желаемый результат (в ячейке В2) совсем другой )
 
Видел, но только двое из пяти попали в желаемый результат. Судя по названию темы "Удаление повторов значений в ячейке" , в итоге должны были остаться уникальные значения. Так, наверно, поняли оставшиеся трое.
2.1. Название темы должно отражать смысл проблемы. Либо название темы не соответствует желаемому результату
 
Юрий М, получилось! Таких строк много и можно по идее сделать цикл. У меня это даже получилось, но в контексте всего файла, удобнее в виде функции. Как этот код можно записать в виде функции?
 
Код
Function MilaP(Stroka As String) As String
Dim i As Long, arr
    arr = Split(Stroka, "-")
    Stroka = ""
    For i = 0 To UBound(arr) - 2
        If Stroka = "" Then
            Stroka = arr(i)
        Else
            If arr(i + 1) <> arr(i) Then Stroka = Stroka & "-" & arr(i + 1)
        End If
    Next
    MilaP = Stroka
End Function
 
с помощью Function WithOutCouple(s$) из #4 (я только опечатку исправил в WithUotCouple на WithOutCouple)
из 344-344-255-344-344-05-05-05-05-292-05-05-03
получено 344-255-344-05-292-05-03

а из 344-344-243-243-243-243-243-243-243-344-344-03-344-344-05-292-054-03-05-052-255-255-255-255-054-054-052-
получено 344-243-344-03-344-05-292-054-03-05-052-255-054-052-
что отличается только наличием тире в конце в отличие от заявленного в примере желаемого результата (и то, я думаю, отличие в пользу функции WithOutCouple)

шаблоны RegExp как раз тем и хороши, что Вы практически дословно пишете то, что нужно, только используя синтаксис RegExp
re.Pattern = "(\d+-)\1+"
1. (\d+-) - ищем какое-то количество цифр с знаком минус в конце
2. \1 - затем должно быть точно такое как нашлось в п.1
3. + - то что найдено в п.1 может повторятся много раз
таким образом из второго примера были найдены последовательности:
1) 344-344-
2) 243-243-243-243-243-243-243-
3) 344-344-
4) 344-344-
5) 255-255-255-255-
6) 054-054-
затем re.Replace(s, "$1") заменил каждую из последовательностей на 1-ю ее часть (см.п.1)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Юрий М, Ігор Гончаренко, спасибо! Ваши решения мне отлично подошли!

Всем, кто откликнулся, тоже большой респект!
Страницы: 1
Наверх