Функция склеивания цифр без повторов для 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д