Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.10.2014, 12:25   #1
Viktorkv
Пользователь
 
Регистрация: 07.06.2010
Сообщений: 62
По умолчанию Запись цифр, которые содержатся в одном столбце через дефис и запятую

Здравствуйте!

Помогите решить задачу посредством макроса в EXCEL 2003.
В столбце "A" содержатся названия уровня, в столбце "B" номера.

Задача проанализировать эти два столбца и если номера повторяются написать их через дефис, если нарушается непрерывность счета, то через запятую. Результат обработки помещается в столбцы I и J.
Вложения
Тип файла: rar Пример, записи через дефис и запятую.rar (2.7 Кб, 22 просмотров)
Viktorkv вне форума Ответить с цитированием
Старый 04.10.2014, 13:48   #2
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

через тире записываются 3 и более чисел подряд (2 подряд будут разделены запятыми)
Код:
Sub SetNums()
  Dim r1 As Long, r2 As Long, r As Long, c1 As Long, c2 As Long
  r1 = 2: r2 = 6: c1 = 1: c2 = 9: Cells(r2, c2 + 1).NumberFormat = "@"
  Cells(r2, c2) = Cells(r1, c1):  Cells(r2, c2 + 1) = Cells(r1, c1 + 1)
  Do
    r = 1
    Do While Cells(r1 + r, c1 + 1) - Cells(r1, c1 + 1) = r
      r = r + 1
      If Cells(r1, c1) <> Cells(r1 + r, c1) Then Exit Do
    Loop
    Cells(r2, c2 + 1) = Cells(r2, c2 + 1) & IIf(r > 2, "-", ", ") & Cells(r1 + r - 1, c1 + 1)
    If Cells(r1, c1) <> Cells(r1 + r, c1) Then
      r2 = r2 + 1: Cells(r2, c2 + 1).NumberFormat = "@"
      Cells(r2, c2) = Cells(r1 + r, c1): Cells(r2, c2 + 1) = Cells(r1 + r, c1 + 1)
    Else
      Cells(r2, c2 + 1) = Cells(r2, c2 + 1) & ", " & Cells(r1 + r, c1 + 1)
    End If
    r1 = r1 + r
  Loop Until Cells(r1, c1) = ""
End Sub
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 04.10.2014, 14:14   #3
Viktorkv
Пользователь
 
Регистрация: 07.06.2010
Сообщений: 62
По умолчанию

Если цифры будут идти в таком порядке:

А 1
А 2
А 3
А 4
А 5
А 7

получится

А 1-5, 7, 7, 28-38, 64-69, 90-109, 156-166, 175-179
Viktorkv вне форума Ответить с цитированием
Старый 04.10.2014, 14:50   #4
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

эту строку
Код:
Cells(r2, c2 + 1) = Cells(r2, c2 + 1) & IIf(r > 2, "-", ", ") & Cells(r1 + r - 1, c1 + 1)
запишите так
Код:
If r > 1 Then Cells(r2, c2 + 1) = Cells(r2, c2 + 1) & IIf(r > 2, "-", ", ") & Cells(r1 + r - 1, c1 + 1)
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 04.10.2014, 15:16   #5
Viktorkv
Пользователь
 
Регистрация: 07.06.2010
Сообщений: 62
По умолчанию

IgorGO, спасибо огромное!
Viktorkv вне форума Ответить с цитированием
Старый 04.10.2014, 15:18   #6
Viktorkv
Пользователь
 
Регистрация: 07.06.2010
Сообщений: 62
По умолчанию

IgorGO, в чем может быть причина, почему функция выдает "-"
Public Function Тире_запятая(Диапазон As Range, Символ)
Dim M(), R, T
With Диапазон
M = Range(.Cells(1, 1), .Cells(Cells(Rows.Count, 1).End(xlUp).Row, 2))
End With
For R = 2 To LR
If M(R, 1) = Символ Then
If Len(Тире_запятая) = 0 Then
Тире_запятая = M(R, 2)
Else
If M(R, 2) <> T + 1 Then
Тире_запятая = Тире_запятая & "-" & T & ", " & M(R, 2)
End If
End If
T = M(R, 2)
End If
Next R
Тире_запятая = Тире_запятая & "-" & T
End Function
Viktorkv вне форума Ответить с цитированием
Старый 04.10.2014, 22:10   #7
ikki_pf
Форумчанин
 
Регистрация: 25.02.2012
Сообщений: 166
По умолчанию

просто интересно: Viktorkv, Вы заблудились в созданных Вами темах?
функцию Тире_запятая Вам написал другой человек.
и на другом форуме.
ikki_pf вне форума Ответить с цитированием
Старый 05.10.2014, 12:20   #8
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

Код:
Sub SetNums()
  Dim r1 As Long, r2 As Long, r As Long, c1 As Long, c2 As Long
  r1 = 1: r2 = 6: c1 = 1: c2 = 9
  Cells(r2, c2 + 1).NumberFormat = "@": Cells(r2, c2) = Cells(r1, c1):  Cells(r2, c2 + 1) = Cells(r1, c1 + 1)
  Do
    r = 1
    Do While Cells(r1 + r, c1 + 1) - Cells(r1 + r - 1, c1 + 1) = 1 And Cells(r1, c1) = Cells(r1 + r, c1)
      r = r + 1
    Loop
    Cells(r2, c2 + 1) = Cells(r2, c2 + 1) & IIf(r > 1, "-" & Cells(r1 + r - 1, c1 + 1), "") & ", " & Cells(r1 + r, c1 + 1)
    If Cells(r1, c1) <> Cells(r1 + r, c1) Then
      Cells(r2, c2 + 1) = Left(Cells(r2, c2 + 1), Len(Cells(r2, c2 + 1)) - Len(", " & Cells(r1 + r, c1 + 1))): r2 = r2 + 1
      Cells(r2, c2 + 1).NumberFormat = "@":  Cells(r2, c2) = Cells(r1 + r, c1): Cells(r2, c2 + 1) = Cells(r1 + r, c1 + 1)
    End If
    r1 = r1 + r
  Loop Until Cells(r1, c1) = ""
End Sub
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете

Последний раз редактировалось IgorGO; 05.10.2014 в 12:32.
IgorGO вне форума Ответить с цитированием
Старый 05.10.2014, 13:39   #9
Viktorkv
Пользователь
 
Регистрация: 07.06.2010
Сообщений: 62
По умолчанию

IgorGO, последний макрос выдает ошибку type mismatch

Ничего страшного, предыдущий все правильно делает, спасибо за помощь!

Последний раз редактировалось Viktorkv; 05.10.2014 в 13:42.
Viktorkv вне форума Ответить с цитированием
Старый 05.10.2014, 14:04   #10
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

ошибка наверное в этой строке
Код:
Do While Cells(r1 + r, c1 + 1) - Cells(r1 + r - 1, c1 + 1) = 1 And Cells(r1, c1) = Cells(r1 + r, c1)
и наверное потому, что в строке
r1 = 1: r2 = 6: c1 = 1: c2 = 9
r1 = 1 а не 2 как было в начальном варианте (стартовая строка ссылается мимо данных)

упростил логику на несколько строк и попутно изменилось правило работы: через тире отбображаются любые подряд идущие номера. например: 1 2 5 7 8 9 10
в последнем варианте будет отображено как:
1-2, 5, 7-10

а в предыдущей версии так:
1, 2, 5, 7-10
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете

Последний раз редактировалось IgorGO; 05.10.2014 в 16:25.
IgorGO вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Найти все слова-числа, т.е. такие, которые состоят только из цифр. Известно, что количество цифр в каждом числе не более 9 (девяти vikichocolate Помощь студентам 1 21.12.2011 00:12
Поиск элемента в одном столбце и замена в другом Volgar Microsoft Office Excel 13 05.01.2011 19:49
Отображение формулы в одном столбце dyakon88 Microsoft Office Excel 6 25.11.2010 20:15
Как заменить обычний дефис на неразрывный дефис Jaroslav Microsoft Office Excel 2 28.05.2010 11:39