Функция склеивания цифр без повторов для Excel - VBA

Узнай цену своей работы

Формулировка задачи:

Имеются две функции, которые нужно совместить Итак есть главная функция =СцепитьМного(J2:L100;", ";ИСТИНА) здесь ИСТИНА это пропуск повторов, запятыми сцепляются итак при сборке получилось такое, при этом отсеялись повторы 1, 7, 11, 12, 13, 17, 29, 30, 4, 6, 9, 10, 15, 16, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 31, 5, 2, 3 здесь они получились неупорядоченными в итоге эту функцию необходимо доработать. чтобы получилось как во второй функции =Sjatie2 и вышло, так, отсортированным и сжатым 1-7, 9-13, 15-17, 19-31 прикрепляю файл с кодом функции =СцепитьМного и с кодом функции =Sjatie2 из этих двух нужен один готовый универсальный

Решение задачи: «Функция склеивания цифр без повторов для Excel»

textual
Листинг программы
Function СцепкаУнив(Диапазон As Range, Optional Разделитель As String = " ", Optional БезПовторов As Boolean = False)
    Dim avData, lr As Long, lc As Long, sRes As String
    Dim a As Variant
    Dim cCount As Long
    Dim i As Long
    Dim i2 As Long
    
    avData = Диапазон.Value
    If Not IsArray(avData) Then
        СцепкаУнив = avData
        Exit Function
    End If
 
    For lc = 1 To UBound(avData, 2)
        For lr = 1 To UBound(avData, 1)
            If Len(avData(lr, lc)) Then
                sRes = sRes & Разделитель & avData(lr, lc)
            End If
        Next lr
    Next lc
    If Len(sRes) Then
        sRes = Mid(sRes, Len(Разделитель) + 1)
    End If
    
    If БезПовторов Then
        Dim oDict As Object, sTmpStr
        Set oDict = CreateObject("Scripting.Dictionary")
        sTmpStr = Split(sRes, Разделитель)
        On Error Resume Next
        For lr = LBound(sTmpStr) To UBound(sTmpStr)
            oDict.Add sTmpStr(lr), sTmpStr(lr)
        Next lr
        sRes = ""
        sTmpStr = oDict.keys
        For lr = LBound(sTmpStr) To UBound(sTmpStr)
            sRes = sRes & IIf(sRes <> "", Разделитель, "") & sTmpStr(lr)
        Next lr
    End If
    
    'Сжатие
    
    a = Split(sRes, Разделитель)
    Dim tSplit As Variant: ReDim tArr(LBound(a, 1) To UBound(a, 1), 1 To 3)
 
 
cCount = 0
For i = LBound(a, 1) To UBound(a, 1)
    If InStr(a(i), Разделитель) Then
        tSplit = Split(a(i), Разделитель)
        tArr(i, 1) = tSplit(LBound(tSplit))
        tArr(i, 2) = tSplit(UBound(tSplit))
        cCount = cCount + 1 + tArr(i, 2) - tArr(i, 1)
    Else
        tArr(i, 1) = a(i)
        tArr(i, 2) = a(i)
        cCount = cCount + 1
    End If
Next
 
Dim rRange: ReDim rRange(1 To cCount, 1 To 1)
 
cCount = 0
' разворачиваем
For i = LBound(a, 1) To UBound(a, 1)
    For i2 = tArr(i, 1) To tArr(i, 2)
        cCount = cCount + 1
        rRange(cCount, 1) = i2
    Next
Next
 
' сортируем массив по возрастанию
rRange = CoolSort(rRange, 1)
 
' получаем сжатую строку
СцепкаУнив = Sjatie(rRange)
 
End Function

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.4 из 5