Доброго времени суток, уважаемые форумчане! Сама полнейший профан в exel, а сейчас приходится обрабатывать большие массивы данных, помогите, пожалуйста, решить задачу.
Необходимо разбить в отдельные строки номера домов на чётные и нечётные, при условии, что нумерация внесена в разных форматах: "48, 41 - 49, 53, 52, 54, 58 - 68, 72 - 78, 57 - 71, 82 - 94" и через запятую и диапазоны и в одной строке. Файл с примером прилагаю. Сейчас делаю ручками, но наверняка есть более быстрое решение. Заранее благодарна за помощь!
А как вы определяете, что 55-87 нечетное, в диапазоне есть же и четные? Пример совсем непонятен - исходные одни а результат совсем другой, как-будто не та информация.
skais675 написал: ...исходные одни а результат совсем другой, как-будто не та информация.
да, я уже подумала, что это запутает)) пример для образца, данные там разнятся. просто показала, что в одной строке дома в одной строке и четные и нечетные и через запятую и с диапазоном.
в диапазоне (когда тире) обычно по умолчанию либо четные, либо нечетные, т.е. 1 - 3, 5 - 11. Если комбинация четное и нечетное число то это ошибка, которая почти не встречается. А вот через запятую в строке все числа подряд могут быть. Этот файл необходимо потом загружать в систему. А система при указании диапазона считывает только по признаку четности 1 или 2 (четные/нечетные). Не знаю, правильно ли я поняла ваш вопрос))
Доброе время суток raiana5, а не подскажете, по какому принципу ул. Сорокинская и пер. Степной стали ул. Советской? И почему в примере части как надо, нумерация почти не сбивается по числам
Андрей VG, добрый день! Спасибо, что обратили внимание, всё-таки образец я неудачный сделала. Прилагаю исправленный. Суть в том, что разбивка идет в привязке к номеру участка +признак четности.
Sub Button1_Click()
arr = Range("B3:E" & Cells(Rows.Count, "E").End(xlUp).Row).Value
Columns("J:N").ClearContents
cr = 1
factor = -1
s = Array("", "")
For i = 1 To UBound(arr)
ss = Split(arr(i, 4), ",")
For j = 0 To UBound(ss)
ss(j) = Trim(ss(j))
For Z = 1 To Len(ss(j))
If Not IsNumeric(Mid(ss(j), Z, 1)) Or Mid(ss(j), Z, 1) = " " Then
Z = Z - 1
Exit For
End If
Next
If Z > Len(ss(j)) Then Z = Len(ss(j))
'Ïðîâåðÿåì ÷åòíîñòü
cislo = Int(Mid(ss(j), 1, Z))
If cislo Mod 2 = 0 Then factor = 1 Else factor = 0
If s(factor) <> "" Then s(factor) = s(factor) + ", " + ss(j) Else s(factor) = ss(j)
Next
For Z = 0 To 1
If s(Z) <> "" Then
Cells(cr, "J") = arr(i, 1)
Cells(cr, "K") = arr(i, 2)
Cells(cr, "L") = arr(i, 3)
Cells(cr, "M") = s(Z)
Cells(cr, "N") = Z + 1
cr = cr + 1
End If
Next
s = Array("", "")
Next
End Sub
Я бы сначала в исходной таблице ", " заменил на перенос строки (Ctrl-J), данные из ячейки скопировал в Блокнот, потом обратно в Excel, тогда бы номера домов выстроились в столбец. Протянул улицу. Отделил корпуса, а потом уже выяснял, что четное/нечетное, ну и собирал далее.
Андрей VG, очень здорово! такая отзывчивость! осталось разобраться с этими "пирожками" пока только с первого раза разобралась с примером Дмитрий Плотников,
Пытливый, благодарю Вас за помощь. Ваше решение на текущем этапе, оказалось самым удобным (в моем профанском случае). Но не могу полноценно пользоваться им.. Дело в том, что в вашем варианте макрос выдает результат обработки в восьмую строку, мой же массив включает в себя до 30 тыс. строк. Как переделать, чтобы результаты обработки выводились ниже такого массива - я не знаю и не умею. Прошу Вас, помогите пожалуйста - могли бы вы поправить макрос так, чтобы результаты обработки выводились например в сроку 30001? Если это уместно, конечно
Вообще, макрос задуман так, что он сам определяет последнюю заполненную строку по столбцу В (в примере с этого столбца начинаются данные) и вставляет результат обработки на 2 строки ниже заполненной области. Макрос будет корректно работать, если шапка таблицы будет расположена также, как в примере (строка, столбец), данные будут идти без разрыва, ну и таблица будет совпадать по столбцам (наименование, содержание) с примером.