Страницы: 1 2 След.
RSS
как перечислить числа входящие в диапазон
 
Извиняюсь за кривую формулировку вопроса.  
 
Есть записи в таблице вида 4-16, 28-30 и так далее.  
Задача: необходимо диапазон 4-16 развернуть в виде 4,5,6,7,8,9,10,11,12,13,14,15,16  
То есть перечислить целые числа, входящие в диапазон.  
Как это можно сделать не вручную?
 
Формулой?  
Макросом наверное так - Split(value,"-"), затем к первому элементу прибавляем по 1 и формируем строку, пока не достигнем второго элемента.
 
Макросом.
 
У меня такой вариант, выгрузка в С:  
 
Option Explicit  
 
Sub tt()  
Dim iLastRow As Long  
Dim cc, z As Long, x As Long, txt As String  
iLastRow = Cells(Rows.Count, 1).End(xlUp).Row  
 
For Each cc In Range("a2:a" & iLastRow)  
z = --Split(cc, "-")(0)  
x = --Split(cc, "-")(1)  
txt = Split(cc, "-")(0)  
Do While z < x  
txt = txt & "," & z + 1  
z = z + 1  
Loop  
cc.Offset(, 2) = txt  
Next  
End Sub
 
Hugo, а на фига мою переменную (х) тырить? Мало алфавита?
 
Спасибо за помощь. Тема закрыта
 
хорошо, iLastRow не заметил... а то бан на 2 недели...
 
:-)  iLastRow - "всехная"
 
Шлифанул:  
 
Option Explicit  
 
Sub tt()  
Dim iLastRow As Long  
Dim cc, z As Long, x As Long, txt As String  
iLastRow = Cells(Rows.Count, 1).End(xlUp).Row  
 
For Each cc In Range("a2:a" & iLastRow)  
txt = Split(cc, "-")(0)  
x = --Split(cc, "-")(1)  
z = --txt  
Do While z < x  
z = z + 1  
txt = txt & "," & z  
Loop  
cc.Offset(, 2) = txt  
Next  
End Sub
 
Уважаемые гуру Юрий и Игорь,  
не спорьте,ваши решения похожи как однояйцевые близнецы.  
И в обоих упущен один и тот же момент, часто встречающийся в документах с перечислением: возможность того, что в одной из обрабатываемых макросами ячеек может быть и одно значение, а не перечисление нескольких через дефис. Да и разделитель может быть не дефис, а, например, многоточие.  
Кроме того, в общем случае в одной ячейке может быть перечислено и несколько диапазонов через запятую или точку с запятой. Например: 2-5;7-9;14-17  
Поэтому, ИМХО, для универсальности решения неплохо было бы UDF сделать, которой можно было бы задать символы разделители "и т.д." (etc) и "а также" (as_well)  
Я бы и сам дополировал такую UDF для своей "копилки", но что-то никак не соображу, как обработать единичное значение и перечисление значений...  
 
 
=====  
76576
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Одиночное:  
 
test = Split(cc, "-")  
If UBound(test) > 0 Then  
 
и т.д.
 
Вернее так с одиночным:  
 
For Each cc In Range("a2:a" & iLastRow)  
If UBound(Split(cc, "-")) > 0 Then  
txt = Split(cc, "-")(0)  
x = --Split(cc, "-")(1)  
z = --txt  
Do While z < x  
z = z + 1  
txt = txt & "," & z  
Loop  
Else  
txt = cc.Value  
End If  
cc.Offset(, 2) = txt  
Next  
 
Ну а разделители и разделители групп можно задать в параметрах, и сперва бить по группам, затем в группах.  
Но такое городить лениво, да и не интересно...
 
Пока я сам сделал:  
  For Each cc In Range("a2:a" & iLastRow)  
     If UBound(Split(cc, "-")) > 0 Then  
        txt = Split(cc, "-")(0)  
        x = --Split(cc, "-")(1)  
        z = --txt  
        Do While z < x  
           z = z + 1  
           txt = txt & "," & z  
        Loop  
     Else: txt = cc  
     End If  
     cc.Offset(, 2) = txt  
  Next  
 
Игорь уже ответил... Ну, ясно, же: мастер!  
А вот с обработкой нескольких групп хотелось бы всё-таки помозговать...
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
{quote}{login=Alex_ST}{date=27.09.2010 04:53}{thema=}{post}Юрий и Игорь,  
не спорьте, <...> в обоих упущен один и тот же момент, часто встречающийся в документах с перечислением: возможность того, что в одной из обрабатываемых макросами ячеек может быть и одно значение, а не перечисление нескольких через дефис. Да и разделитель может быть не дефис{/post}{/quote}  
Алекс, я думал, что большего зануды, чем я, тут не найти :-))  
В примере было по две группы, разделитель - дефис... Чего ещё выдумывать?  
Сказал бы автор: значение может быть одиночным, разделитель может быть любой... Тогда бы и решение было другим. Резюме: бан на 7 дней.
 
Еще ZVI выкладывал вариант решения, правда там начало и конец данных вводятся в ячейки:) <BR>http://www.planetaexcel.ru/forum.php?thread_id=2380
 
{quote}{login=Юрий М}{date=27.09.2010 07:50}{thema=Re: }{post}{quote}Резюме: бан на 7 дней.{/post}{/quote}  
Что-то я не понял, какие из правил форума я нарушил?  
За что это бан?  
За попытку расширить область применения разрабатываемого макроса с узко ограниченной примером топик-стартера до охватывающей большинство часто встречающихся случаев подобного перечисления? — Значит, подстраивать разрабатываемые макросы под постоянно уточняемые запросы стартера можно бесконечно, а указать на то, что запрос далеко не полон - нет?
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Алекс, что с Вами? Вы такой серьёзный сегодня...
 
Станешь серьёзным, когда, прийдя утром недопроснувшись на работу и вооружившись чашечкой кофейку, первым же делом идёшь на любимую Планету и вдруг видишь, что тебя грозятся забанить ни за что, ни про что... Это что же, мне весь день (и хорошо если один!)без любимой игрушки на работе торчать???  
Да за такие шуточки в приличных местах ...  
В общем, как в том анекдоте: "Ну и шуточки у тебя, боцман... Торпеда-то мимо прошла!"  
Ну, нельзя же так шутить, Юрий...
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Договорились - шесть дней :-)
 
Да алекс прав. У меня в ячейках задано несколько диапазонов и еще отдельно через запятую написано: например: 4-16,25,33,35-40. Но я подумад что так задавать вопрос будет уже совсем жестоко по отношению к профи. Я просто поделил диапазоны по ячейкам преобрабовал и все сцепил обратно в кучу.
 
Во!  
А этот случай "протелепатил", а меня тут за это зачморить (забанить) грозятся...  
:-)  
Если никто ничего раньше не сделает, то я попробую (но не обещаю) во время обеда "докрутить" макрос Игоря до универсальной ЮДФ-ки
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Дополнил макрос. Получился безобразный монстр, но как-то работает :). Использовать в крайнем случае.  
Лучше наверное сделать UDF с выбором разделителей..., заодно и лишнее повыкидывать.  
Алекс, делай свой вариант, этот не смотри :)  
 
Sub tt()  
Dim iLastRow As Long  
Dim cc, a, aa, z As Long, x As Long, txt As String, ccc As String, txtOut As String  
iLastRow = Cells(Rows.Count, 1).End(xlUp).Row  
 
For Each cc In Range("a2:a" & iLastRow)  
ccc = Replace(cc, " ", "")  
a = Split(ccc, ",")  
If UBound(a) > 0 Then  
   For Each aa In a  
       If UBound(Split(aa, "-")) > 0 Then  
       txt = Split(aa, "-")(0)  
       x = --Split(aa, "-")(1)  
       z = --txt - 1  
           Do While z < x  
           z = z + 1  
               If txtOut = "" Then  
                   txtOut = z  
               Else  
                   txtOut = txtOut & "," & z  
               End If  
           Loop  
       Else  
           If txtOut = "" Then  
               txtOut = aa  
           Else  
               txtOut = txtOut & "," & aa  
           End If  
       End If  
   Next  
Else  
If txtOut = "" Then  
txtOut = ccc  
Else  
txtOut = txtOut & "," & ccc  
End If  
End If  
cc.Offset(, 2) = txtOut: txtOut = ""  
Next  
 
End Sub
 
Можно чуть подсократить код в 3-х местах, заменив 5 строк на одну:  
If txtOut = "" Then txtOut = ccc Else txtOut = txtOut & "," & ccc
 
И вовсе не Квазимодо получится если 3х4=12 строк убрать  
Я, пожалуй, его "причешу" и из него ЮДФ-ку буду делать в обед.
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Давай.  
Я там ещё дополнительно на всякий случай все пробелы в начале кода убиваю. Ну это фраза для неискушённых :)
 
А может лучше подход Юрия развить - у него вроде короче код получиться должен?
 
ЮДФ и Суб для теста.  
 
Function ExpandList(ByVal Src As String) As String  
Dim elem, aNums, j As Long  
Src = Replace(Src, " ", "")  
If Src = "" Then Exit Function  
For Each elem In Split(Src, ",")  
   aNums = Split(elem, "-")  
   For j = aNums(0) To aNums(UBound(aNums))  
       ExpandList = ExpandList & "," & j  
   Next  
Next  
ExpandList = Mid(ExpandList, 2)  
End Function  
 
Sub tt()  
Dim cc  
For Each cc In Range("a2:a" & Cells(Rows.Count, 1).End(xlUp).Row)  
   cc.Offset(, 2) = ExpandList(cc)  
Next  
End Sub
 
Ну что сказать - умыл :)
 
Развил:  
 
Function ExpandListAlone(Src As String, grsep As String, ingrsep As String) As String  
Dim elem, aNums, j As Long  
Src = Replace(Src, " ", "")  
If Src = "" Then Exit Function  
For Each elem In Split(Src, grsep)  
aNums = Split(elem, ingrsep)  
For j = aNums(0) To aNums(UBound(aNums))  
ExpandListAlone = ExpandListAlone & "," & j  
Next  
Next  
ExpandListAlone = Mid(ExpandListAlone, 2)  
End Function
 
В одном месте забыл:  
 
ExpandListAlone = ExpandListAlone & grsep & j
Страницы: 1 2 След.
Наверх