Функция склеивания цифр без повторов для 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
Листинг программы
  1. Function СцепкаУнив(Диапазон As Range, Optional Разделитель As String = " ", Optional БезПовторов As Boolean = False)
  2.     Dim avData, lr As Long, lc As Long, sRes As String
  3.     Dim a As Variant
  4.     Dim cCount As Long
  5.     Dim i As Long
  6.     Dim i2 As Long
  7.    
  8.     avData = Диапазон.Value
  9.     If Not IsArray(avData) Then
  10.         СцепкаУнив = avData
  11.         Exit Function
  12.     End If
  13.  
  14.     For lc = 1 To UBound(avData, 2)
  15.         For lr = 1 To UBound(avData, 1)
  16.             If Len(avData(lr, lc)) Then
  17.                 sRes = sRes & Разделитель & avData(lr, lc)
  18.             End If
  19.         Next lr
  20.     Next lc
  21.     If Len(sRes) Then
  22.         sRes = Mid(sRes, Len(Разделитель) + 1)
  23.     End If
  24.    
  25.     If БезПовторов Then
  26.         Dim oDict As Object, sTmpStr
  27.         Set oDict = CreateObject("Scripting.Dictionary")
  28.         sTmpStr = Split(sRes, Разделитель)
  29.         On Error Resume Next
  30.         For lr = LBound(sTmpStr) To UBound(sTmpStr)
  31.             oDict.Add sTmpStr(lr), sTmpStr(lr)
  32.         Next lr
  33.         sRes = ""
  34.         sTmpStr = oDict.keys
  35.         For lr = LBound(sTmpStr) To UBound(sTmpStr)
  36.             sRes = sRes & IIf(sRes <> "", Разделитель, "") & sTmpStr(lr)
  37.         Next lr
  38.     End If
  39.    
  40.     'Сжатие
  41.    
  42.     a = Split(sRes, Разделитель)
  43.     Dim tSplit As Variant: ReDim tArr(LBound(a, 1) To UBound(a, 1), 1 To 3)
  44.  
  45.  
  46. cCount = 0
  47. For i = LBound(a, 1) To UBound(a, 1)
  48.     If InStr(a(i), Разделитель) Then
  49.         tSplit = Split(a(i), Разделитель)
  50.         tArr(i, 1) = tSplit(LBound(tSplit))
  51.         tArr(i, 2) = tSplit(UBound(tSplit))
  52.         cCount = cCount + 1 + tArr(i, 2) - tArr(i, 1)
  53.     Else
  54.         tArr(i, 1) = a(i)
  55.         tArr(i, 2) = a(i)
  56.         cCount = cCount + 1
  57.     End If
  58. Next
  59.  
  60. Dim rRange: ReDim rRange(1 To cCount, 1 To 1)
  61.  
  62. cCount = 0
  63. ' разворачиваем
  64. For i = LBound(a, 1) To UBound(a, 1)
  65.     For i2 = tArr(i, 1) To tArr(i, 2)
  66.         cCount = cCount + 1
  67.         rRange(cCount, 1) = i2
  68.     Next
  69. Next
  70.  
  71. ' сортируем массив по возрастанию
  72. rRange = CoolSort(rRange, 1)
  73.  
  74. ' получаем сжатую строку
  75. СцепкаУнив = Sjatie(rRange)
  76.  
  77. End Function

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


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

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

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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут