Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
2 / 1 / 1
Регистрация: 25.05.2013
Сообщений: 216

Сократить диапазон чисел, записав их через знак тире

18.11.2020, 21:51. Показов 3957. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер!

Если есть мысли, как помочь, буду очень признателен.
В столбце B, начиная со 2 ячейки приведены данные, по примеру:

1-2,3,4,7,9,10,11-16,20 те логику в написании немного сложновато понять, человек может расписать диапазон чисел через запятую, например 1,2,3 или через запятую и тире 1,2-3 или через тире 1-3

задача привести этот диапазон к понятному виду

1-4,7,9-16,20
Вложения
Тип файла: xlsx Текст через дефис.xlsx (7.8 Кб, 52 просмотров)
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.11.2020, 21:51
Ответы с готовыми решениями:

Число или диапазон через тире
подскажите регулярку, чтобы можно было вводить 123 или 123-456 с одним тире, то есть 123- не принимало попробовал такую ...

Сгенерировать диапазон чисел через запятую
В общем дело такое что нужно сгенерировать диапазон чисел от 0 до 267257 на C++ Shell (http://cpp.sh/). Как это сделать? Желательно ещё...

Разбейте фразу «Повторение – мать учения» на слова, исключив знак тире. Выведите полученный массив слов
Разбейте фразу «Повторение – мать учения» на слова, исключив знак тире. Выведите полученный массив слов

3
1847 / 1162 / 354
Регистрация: 11.07.2014
Сообщений: 4,107
19.11.2020, 08:42
Лучший ответ Сообщение было отмечено Виктор83 как решение

Решение

Виктор83, я вывожу результат в пятый столбец, чтобы можно было сравнить
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Sub proba()
Dim I As Integer, Last As Integer, S As String, Chi() As Integer, Sc, L1 As Integer
Dim K As Integer, J As Integer, L As Integer, N As Integer, I1 As Integer
Last = Cells(Rows.Count, 1).End(xlUp).Row
For I = 2 To Last
  Sc = Split(Cells(I, 2), ","): K = UBound(Sc)
  L1 = -1
  For J = 0 To K
    L = InStr(Sc(J), "-")
    If L > 0 Then  'диапазон
      For I1 = CInt(Left(Sc(J), L - 1)) To CInt(Mid(Sc(J), L + 1))
        L1 = L1 + 1: ReDim Preserve Chi(L1): Chi(L1) = I1
      Next
    Else
      L1 = L1 + 1: ReDim Preserve Chi(L1): Chi(L1) = CInt(Sc(J))
    End If
  Next
  S = "": L = Chi(0): K = L
  ReDim Preserve Chi(L1 + 1): Chi(L1 + 1) = Chi(L1) + 5: L1 = L1 + 1
  For J = 1 To L1
    If Chi(J) <> L + 1 Then
      S = S & "," & K & IIf(L = K, "", IIf(K + 1 = L, ",", "-") & Chi(J - 1))
      L = Chi(J): K = L
    Else
      L = L + 1
    End If
  Next
  Cells(I, 5) = Mid(S, 2)
Next
End Sub
1
малоболт
1328 / 510 / 213
Регистрация: 30.01.2020
Сообщений: 1,244
19.11.2020, 17:58
Виктор83, Вот ещё один похожий способ в виде функции, которую можно использовать например, как клиентскую функцию. Входной параметр - исходная строка, возвращает преобразованную строку.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Function ConvrtStr(xStr)
  dim ii, i1, i2, i3, i4, aa, aaa, oStr
  aa = Split(xStr,",") 'разбиваем строку на массив подстрок по разделителю - запятая
  aaa = Split(aa(0),"-") ' разбиваем начальный элемент этого массива подстрок по разделителю - тире. 
  i1 = Cint(aaa(0)):  i2 = Cint(aaa(uBound(aaa))) 'первое число -> i1, последнее (если оно одно, то первое) -> i2
  oStr = Cstr(i1) ' запишем в результирующую строку пока самое первое число
  for ii= 1 to Ubound (aa) step 1 ' пробежимся по остальным элементам массива подстрок
    aaa = Split(aa(ii),"-") ' каждый разбиваем на массив полуподстрок - получаем 1 или 2 элемента
    i3 = Cint(aaa(0)):  i4 = Cint(aaa(uBound(aaa))) 'первое число -> i3, последнее (если оно одно - оно же и первое) -> i4
    If i3 = i2+1 Then ' Если это смежные диапазоны чисел 
      i2 = i4         ' - сольём их в один
    else              ' в противном случае дозаписываем хвост предыдущего диапазона
      if I2 = i1+1 Then oStr = oStr & "," & cstr(i2)  'если диапазон всего из 2 чисел
      if I2 > i1+1 Then oStr = oStr & "-" & cstr(i2)  'если диапазон поболее
      i1 = i3: i2 = i4 'текущий диапазон становится прежним
      oStr = oStr & "," & cstr(i1) 'Дозаписываем начало этого диапазона в результирующую строку 
    end if
  next
  if I2 = i1+1 Then oStr = oStr & "," & cstr(i2) 'дозаписываем хвост последнего диапазаноа
  if I2 > i1+1 Then oStr = oStr & "-" & cstr(i2) 
  Convrtstr = oStr ' результат возвращаем
end Function
2
2 / 1 / 1
Регистрация: 25.05.2013
Сообщений: 216
19.11.2020, 19:40  [ТС]
Burk, спасибо большое, это то, что нужно, супер!

Добавлено через 2 минуты
Punkt5, ваша функция тоже работает, спасибо за подробное описание каждого этапа, попробую разобраться.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.11.2020, 19:40
Помогаю со студенческими работами здесь

Диапазон чисел через класс, поля, конструктор, функция, методы
Всем Привет! Сделал программу и класс к ней, программа в классе должны быть следующее 1. Объявить два вещественных поля...

Количество чисел, которые генерируются и диапазон для генерации вводить через форму
Определить, какой процент повторов случайных чисел (общие_количество повторов / общие количество_чисел * 100) будет встречаться при...

Вывод нескольких чисел через запятую - не ставить знак после последнего элемента
program massiv; uses crt; var a:array of integer; ar:real; en,s,i,n:integer; begin repeat clrscr; s:=0; write('Введите...

Диапазон чисел - какой диапазон у каждой переменной
все int, можете написать какой диапазон у каждой переменной типа а1= a1 = rand()%7; b1 = rand()%6+4; a2 = rand()%7; b2 =...

Поменять знак чисел на противоположный, если они имеют разный знак; иначе замененить их нулями
даны два числа a и b. Разработать и описать алгоритм, в результате которого числа меняют свой знак на противоположный, если они имеют...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru