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

Вход

Регистрация

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

 

= Мир MS Excel/Группировка обозначений по цифрам - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по Excel » Группировка обозначений по цифрам (Формулы/Formulas)
Группировка обозначений по цифрам
4step Дата: Понедельник, 12.06.2023, 10:08 | Сообщение № 1
Группа: Пользователи
Ранг: Участник
Сообщений: 85
Репутация: 0 ±
Замечаний: 40% ±

Добрый день! В предыдущем вопросе невнятно создал тему. Проанализировав ссылку наконец то понял, что мне надо.
Имеется в качестве примера исходный код:
[vba]
Код
Public Function Склейка(ByRef rng As Range)
Dim n, arr1, s As String, x As String, y As Double, m As Byte
On Error GoTo ErrHand
Set re = CreateObject("VBScript.RegExp")
Set dic = CreateObject("System.Collections.SortedList")
re.Global = True: re.Pattern = "/\d+$"
arr1 = rng
For Each n In arr1
If n <> "" Then
If re.Test(n) Then
x = Split(n, "/")(0)
y = CDbl(Split(n, "/")(1))
If Not dic.Contains(x) Then Set dic(x) = CreateObject("System.Collections.SortedList")
If Not dic(x).Contains(y) Then dic(x).Add y, n
Else
If Not dic.Contains(n) Then Set dic(n) = CreateObject("System.Collections.SortedList")
If Not dic(n).Contains(99 ^ 9) Then dic(n).Add 99 ^ 9, n
End If
End If
Next n
s = ""
m = 0
For n = 0 To dic.Count - 1
If dic(dic.GetKey(n)).Count > 1 Then
For y = 0 To dic(dic.GetKey(n)).Count - 2
If Round(Fix(dic(dic.GetKey(n)).GetKey(y)) - Round(dic(dic.GetKey(n)).GetKey(y), 4), 4) = 0 Then f = 1 Else f = 0.0001
If Round(dic(dic.GetKey(n)).GetKey(y + 1) - dic(dic.GetKey(n)).GetKey(y), 4) = f Then
m = m + 1
ElseIf Round(dic(dic.GetKey(n)).GetKey(y + 1) - dic(dic.GetKey(n)).GetKey(y), 4) <> f Then
If m > 0 Then
s = s & "; " & dic(dic.GetKey(n)).GetByIndex(y - m) & "-" & Split(dic(dic.GetKey(n)).GetByIndex(y), "/")(1)
m = 0
ElseIf m = 0 Then
s = s & "; " & dic(dic.GetKey(n)).GetByIndex(y)
m = 0
End If
End If
Next
If m <> 0 Then
s = s & "; " & dic(dic.GetKey(n)).GetByIndex(dic(dic.GetKey(n)).Count - m - 1) & "-" & Split(dic(dic.GetKey(n)).GetByIndex(dic(dic.GetKey(n)).Count - 1), "/")(1)
m = 0
Else
s = s & "; " & dic(dic.GetKey(n)).GetByIndex(dic(dic.GetKey(n)).Count - 1)
End If
Else
s = s & "; " & dic(dic.GetKey(n)).GetByIndex(dic(dic.GetKey(n)).Count - 1)
m = 0
End If
Set dic(dic.GetKey(n)) = Nothing
Next n
Склейка = Mid(s, 3)
Set dic = Nothing
Exit Function
ErrHand:
Склейка = "Ошибка"
End Function
[/vba]
Нужно из кода убрать привязку к символу "/". Группировать обозначений нужно также по цифрам.
Например имеется список "STOP0;STOP1;STOP2;STOP3;STOP5".
Можно сгруппировать так "STOP0-STOP3; STOP5".
А можно компактней "STOP0-3, 5". "," говорит о том что "5" входит в состав обозначения "STOP". Основные обозначения разделяются ";". Прошу помочь по возможности.
К сообщению приложен файл: dorabotka.xlsm (61.6 Kb)


Сообщение отредактировал 4step - Понедельник, 12.06.2023, 10:25
 
Ответить
СообщениеДобрый день! В предыдущем вопросе невнятно создал тему. Проанализировав ссылку наконец то понял, что мне надо.
Имеется в качестве примера исходный код:
[vba]
Код
Public Function Склейка(ByRef rng As Range)
Dim n, arr1, s As String, x As String, y As Double, m As Byte
On Error GoTo ErrHand
Set re = CreateObject("VBScript.RegExp")
Set dic = CreateObject("System.Collections.SortedList")
re.Global = True: re.Pattern = "/\d+$"
arr1 = rng
For Each n In arr1
If n <> "" Then
If re.Test(n) Then
x = Split(n, "/")(0)
y = CDbl(Split(n, "/")(1))
If Not dic.Contains(x) Then Set dic(x) = CreateObject("System.Collections.SortedList")
If Not dic(x).Contains(y) Then dic(x).Add y, n
Else
If Not dic.Contains(n) Then Set dic(n) = CreateObject("System.Collections.SortedList")
If Not dic(n).Contains(99 ^ 9) Then dic(n).Add 99 ^ 9, n
End If
End If
Next n
s = ""
m = 0
For n = 0 To dic.Count - 1
If dic(dic.GetKey(n)).Count > 1 Then
For y = 0 To dic(dic.GetKey(n)).Count - 2
If Round(Fix(dic(dic.GetKey(n)).GetKey(y)) - Round(dic(dic.GetKey(n)).GetKey(y), 4), 4) = 0 Then f = 1 Else f = 0.0001
If Round(dic(dic.GetKey(n)).GetKey(y + 1) - dic(dic.GetKey(n)).GetKey(y), 4) = f Then
m = m + 1
ElseIf Round(dic(dic.GetKey(n)).GetKey(y + 1) - dic(dic.GetKey(n)).GetKey(y), 4) <> f Then
If m > 0 Then
s = s & "; " & dic(dic.GetKey(n)).GetByIndex(y - m) & "-" & Split(dic(dic.GetKey(n)).GetByIndex(y), "/")(1)
m = 0
ElseIf m = 0 Then
s = s & "; " & dic(dic.GetKey(n)).GetByIndex(y)
m = 0
End If
End If
Next
If m <> 0 Then
s = s & "; " & dic(dic.GetKey(n)).GetByIndex(dic(dic.GetKey(n)).Count - m - 1) & "-" & Split(dic(dic.GetKey(n)).GetByIndex(dic(dic.GetKey(n)).Count - 1), "/")(1)
m = 0
Else
s = s & "; " & dic(dic.GetKey(n)).GetByIndex(dic(dic.GetKey(n)).Count - 1)
End If
Else
s = s & "; " & dic(dic.GetKey(n)).GetByIndex(dic(dic.GetKey(n)).Count - 1)
m = 0
End If
Set dic(dic.GetKey(n)) = Nothing
Next n
Склейка = Mid(s, 3)
Set dic = Nothing
Exit Function
ErrHand:
Склейка = "Ошибка"
End Function
[/vba]
Нужно из кода убрать привязку к символу "/". Группировать обозначений нужно также по цифрам.
Например имеется список "STOP0;STOP1;STOP2;STOP3;STOP5".
Можно сгруппировать так "STOP0-STOP3; STOP5".
А можно компактней "STOP0-3, 5". "," говорит о том что "5" входит в состав обозначения "STOP". Основные обозначения разделяются ";". Прошу помочь по возможности.

Автор - 4step
Дата добавления - 12.06.2023 в 10:08
msi2102 Дата: Понедельник, 12.06.2023, 14:49 | Сообщение № 2
Группа: Проверенные
Ранг: Обитатель
Сообщений: 413
Репутация: 129 ±
Замечаний: 0% ±

Excel 2007
Вот два варианта, как по мне, так второй правильнее
К сообщению приложен файл: dorabotka2.xlsm (24.4 Kb)


Сообщение отредактировал msi2102 - Понедельник, 12.06.2023, 15:02
 
Ответить
СообщениеВот два варианта, как по мне, так второй правильнее

Автор - msi2102
Дата добавления - 12.06.2023 в 14:49
4step Дата: Понедельник, 12.06.2023, 15:01 | Сообщение № 3
Группа: Пользователи
Ранг: Участник
Сообщений: 85
Репутация: 0 ±
Замечаний: 40% ±

msi2102, Это просто супер! Уже много раз мне помогли с этими "группировками" и "разъединениями". Благодарю за помощь!!
 
Ответить
Сообщениеmsi2102, Это просто супер! Уже много раз мне помогли с этими "группировками" и "разъединениями". Благодарю за помощь!!

Автор - 4step
Дата добавления - 12.06.2023 в 15:01
msi2102 Дата: Понедельник, 12.06.2023, 15:04 | Сообщение № 4
Группа: Проверенные
Ранг: Обитатель
Сообщений: 413
Репутация: 129 ±
Замечаний: 0% ±

Excel 2007
4step, Заменил в Сообщении #2 файл, была незначительная ошибка
 
Ответить
Сообщение4step, Заменил в Сообщении #2 файл, была незначительная ошибка

Автор - msi2102
Дата добавления - 12.06.2023 в 15:04
4step Дата: Понедельник, 12.06.2023, 15:10 | Сообщение № 5
Группа: Пользователи
Ранг: Участник
Сообщений: 85
Репутация: 0 ±
Замечаний: 40% ±

msi2102, Обновил. Благодарю за труды!
 
Ответить
Сообщениеmsi2102, Обновил. Благодарю за труды!

Автор - 4step
Дата добавления - 12.06.2023 в 15:10
Мир MS Excel » Вопросы и решения » Вопросы по Excel » Группировка обозначений по цифрам (Формулы/Formulas)
  • Страница 1 из 1
  • 1
Поиск:

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