Страницы: 1
RSS
Значение ячейки - в массив, Текст с разделителями в одной ячейке
 
Здравствуйте. Уперся в одну задачку: перегнать коды ОКТМО (ОБЩЕРОССИЙСКИЙ КЛАССИФИКАТОР
ТЕРРИТОРИЙ МУНИЦИПАЛЬНЫХ ОБРАЗОВАНИЙ)  в таблицу (Access). Исходник выглядит так:

80 601 404
1

- Альмухаметовский сельсовет
с Целинный 80 201 804 001, д Альмухаметово 80 201 804 002, д Булатово 80 201 804 003, д Верхнее Абдряшево 80 201 804 004, д Нижнее Абдряшево 80 201 804 005, д Северный 80 201 804 006, д ст Альмухаметово 80 201 804 007, д ст Сухое Озеро 80 201 804 008, д Уральский 80 201 804 009
если территории верхних уровней укладываются в структуру базы данных (достаточно просто скопировать), то деревни и сёла свалены в кучу в 4-м столбце. Для базы данных хорошая структура как основа построения дерева будет выглядеть так:
IDKChNameParent
806014041- Альмухаметовский сельсовет80601400
80 201 804 001с Целинный80601404
и т.д.
На данный момент получилось загнать 4-й столбец в массив и его элементы распихать построчно в Name. Но они выглядят как "Name+ID"("с Целинный 80 201 804 001" и т.д...)

Вопрос: как мне разбить эту сладкую парочку, чтобы потом раскидать по местам? Split не катит, поскольку разделитель - пробел а их там может быть несколько. IsNumeric - тоже, т.к. числовые значения в названиях тоже возможны.
Может взять разделителем "80", после сплита он исчезнет и его контакенировать?

Код который пока есть:

Код
Option Explicit

Sub split_cell()
Dim arr() As String ' массивы
Dim i As Integer, y As Integer ' счетчики
Application.ScreenUpdating = False

 arr() = Split(CStr(ActiveCell.Value), ",") 'загоняем 4-й столбец в массив

y = UBound(arr) - LBound(arr)

For i = 0 To y
    Cells(ActiveCell.Row + 1, 1).EntireRow.Select ' выделить нижележащую строку
    Selection.EntireRow.Insert shift:=xlUp ' вставить строку
    Selection.Rows.AutoFit ' выровнять её высоту
    Cells(ActiveCell.Row, 4) = arr(i) ' вставить в ячейку текущий элемент массива
Next i

Application.ScreenUpdating = True
End Sub
 
пример также прикрепляю.
 
Почитайте здесь.
Можно ещё просто взять и обработать вот эту табличку.  :)
Изменено: AndreTM - 19.12.2013 12:34:06
 
" 80 " - на примере сработает. Но именно так, с пробелами.
 
Спасибо откликнувшимся.
AndreTM, парсить через access - наверное хороший вариант, но я уж начал готовить таблицу в в excel и т.к. вроде немного осталось доделаю в нём же ) к тому же в аксе ещё будет полно работы ).

Hugo, спасибо за наводку. Вроде получилось, всё работает. Правда сделал примитивно: сплит - закинуть в 2 ячейки, поменять ячейки местами...

Не подскажете как реализовать через массив?


Код
Option Explicit

Sub split_cell()
Dim arr() As String ' массив
Dim i As Integer, y As Integer ' счетчики
Application.ScreenUpdating = False

    arr() = Split(CStr(ActiveCell.Value), ",") 'загоняем 4-й столбец в массив

y = UBound(arr) - LBound(arr)
 
For i = 0 To y
    Cells(ActiveCell.Row + 1, 1).EntireRow.Select ' выделить нижележащую строку
    Selection.EntireRow.Insert shift:=xlUp ' вставить строку
    Selection.Rows.AutoFit ' выровнять её высоту
    'не знаю как заставить сплит менять пары местами (через двумерный массив?), поэтому
    'тупо кидаю с соседние ячейки и потом меняю местами...
    Range("A" & CStr(ActiveCell.Row) & ":" & "B" & CStr(ActiveCell.Row)) = Split(CStr(arr(i)), " 80 ")

    Cells(ActiveCell.Row, 4) = Cells(ActiveCell.Row, 1)
    Cells(ActiveCell.Row, 1) = ""
    Cells(ActiveCell.Row, 2) = "80" & Cells(ActiveCell.Row, 2)
Next i

Erase arr()

Application.ScreenUpdating = True

End Sub
 
Ну и обновленный пример.
Изменено: ayupov_r - 19.12.2013 13:43:29
 
Цитата
AndreTM, парсить через access - наверное хороший вариант, но я уж начал готовить таблицу в в excel и т.к. вроде немного осталось доделаю в нём же ) к тому же в аксе ещё будет полно работы ).
Первая - вы же сами хотели получить результат в Акцессе... и зачем тогда напрягать экзель?

Вторая - там лежит готовая таблица в excel-формате (просто с излишними столбцами). Её обработать - дело нескольких строк кода...
Изменено: AndreTM - 19.12.2013 13:33:47
 
AndreTM, насчет первого - ну если хотите в азарт вошёл, да и объектная модель (excel имею в виду) забывается когда долго пользуешься только формулами и стандартными функциями ).
Насчет второго - сейчас только открыл - вот за это спасибище! похоже на самом деле то, что нужно (даже родители проставлены). из этой таблицы дёрнуть проще простого.
Но всё-таки хочется доделать начатое (я в плане кода): как мне "на лету" сплитануть элементы первого массива, закинуть их во второй, поменять местами и растолкать по ячейкам?  
Страницы: 1
Наверх