Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/55: Рейтинг темы: голосов - 55, средняя оценка - 4.85
0 / 0 / 0
Регистрация: 17.12.2015
Сообщений: 15
1

Преобразование таблицы с многоуровневой структурой данных

20.01.2016, 12:35. Показов 10945. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день,

столкнулся с такой проблемой: из 1С выгружаем отчет, данные в котором представляют собой многоуровневую структуру. Для дальнейшей работы с данными необходимо изменить вид таблицы так, чтобы каждый уровень был представлен в отдельном столбце (см. пример). Дополнительная сложность связана с тем, что количество строк во 2 и 3 уровнях может меняться. Вносить изменения в 1С проблематично, а на обработку ручками уходит неприлично много времени.
Подскажите, пожалуйста, как решить подобную задачу.
Вложения
Тип файла: xls Пример.xls (30.0 Кб, 125 просмотров)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.01.2016, 12:35
Ответы с готовыми решениями:

Преобразование таблицы с многоуровневой структурой данных - VBA
Всем доброго времени суток! Подскажите, пожалуйста, как решить задачу преобразования уровней из 1С...

Итоги в конце таблицы и преобразование в число данных
Есть файл, который выгружает система. Т.к. книг с одинаковым содержимым много, то для удобства...

Выполнить нормализацию многоуровневой составной единицы данных
помогите разобраться с задачей.... кпм -Код поставщика материала шм-шифр кмпн-Кол-во материала,...

Преобразование данных таблицы к классическому виду
ЗДравствуйте всем!Подскажите пожалуйста, можно ли с помощью запроса вывести данные из приложенной...

10
5606 / 1592 / 412
Регистрация: 23.12.2010
Сообщений: 2,382
Записей в блоге: 1
20.01.2016, 13:44 2
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
Sub Преобразовать_по_группировке()
    Dim i&, k&, LastRow&, Level1Row&, Level2Row&
    LastRow = Cells(Rows.Count, 2).End(xlUp).Row
    Application.ScreenUpdating = False
    With [C3:G3]: .UnMerge: .Value = [C5:G5].Value: End With
    Columns("C:D").Insert Shift:=xlToRight
    [C3] = [B4]
    [D3] = [B5]
    For i = LastRow To 4 Step -1
        For k = i To 1 Step -1
            If Rows(k).OutlineLevel = 1 Then Level1Row = k: Exit For
        Next k
        For k = i To 1 Step -1
            If Rows(k).OutlineLevel = 2 Then Level2Row = k: Exit For
        Next k
        If Rows(i).OutlineLevel = 3 Then
            Cells(i, 4) = Cells(i, 2)
            Cells(i, 3) = Cells(Level2Row, 2)
            Cells(i, 2) = Cells(Level1Row, 2)
        ElseIf i = Level1Row Or i = Level2Row Then
            Rows(i).Delete Shift:=xlUp
        End If
    Next i
    Rows("4:" & LastRow).ClearOutline
End Sub
1
0 / 0 / 0
Регистрация: 17.12.2015
Сообщений: 15
20.01.2016, 14:20  [ТС] 3
Спасибо KoGG, то, что нужно, работает, правда пока непонятно как (это код для меня сложен), будем разбираться.
0
0 / 0 / 0
Регистрация: 17.12.2015
Сообщений: 15
28.01.2016, 09:38  [ТС] 4
Добрый день, KoGG, твой код переделал под структуру из 4-х и 2-х уровней, получилось, работает в целом нормально, но каждый раз при работе макроса дублируется первая строка (в примере выделил желтым). Подскажи в чем ошибка.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Sub       
Dim i&, k&, LastRow&, Level1Row&   
 LastRow = Cells(Rows.Count, 2).End(xlUp).Row    
Application.ScreenUpdating = False    
With [C3:G3]: .UnMerge: .Value = [C4:G4].Value: End With    
Columns("C").Insert Shift:=xlToRight    
[C3] = [B4]
For i = LastRow To 4 Step -1       
 For k = i To 1 Step -1           
 If Rows(k).OutlineLevel = 1 Then Level1Row = k: Exit For        
Next k        
If Rows(i).OutlineLevel = 2 Then            
Cells(i, 3) = Cells(i, 2)           
 ' Cells(i, 3) = Cells(Level2Row, 2)           
Cells(i, 2) = Cells(Level1Row, 2)        
ElseIf i = Level1Row Then            
Rows(i).Delete Shift:=xlUp        
End If    
Next i    
Rows("4:" & LastRow).ClearOutline
End Sub
Вложения
Тип файла: xls Пример.xls (28.5 Кб, 50 просмотров)
0
5606 / 1592 / 412
Регистрация: 23.12.2010
Сообщений: 2,382
Записей в блоге: 1
28.01.2016, 11:13 5
Код какой-то невменяемый.
Написал новый более универсальный код с неограниченным количеством уровней.
Правда шапки таблицы обработаются правильно только для приведенных примеров.
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
31
32
33
34
35
Sub Преобразовать_по_группировке()
    Dim i&, k&, n&, FirstRow&, LastRow&, LevelRow&(), MaxLevel%
    LastRow = Cells(Rows.Count, 2).End(xlUp).Row
    Application.ScreenUpdating = False
    For k = 1 To LastRow
        If Trim(Cells(k, 2)) = "Номенклатура" Then FirstRow = k + 1: Exit For
    Next k
    For k = FirstRow To LastRow
        If MaxLevel < Rows(k).OutlineLevel Then MaxLevel = Rows(k).OutlineLevel
    Next k
    ReDim LevelRow&(MaxLevel)
    If MaxLevel = 3 Then With [C3:G3]: .UnMerge: .Value = [C5:G5].Value: End With
    For n = MaxLevel To 2 Step -1
        Columns("C").Insert Shift:=xlToRight
        Range("C" & (FirstRow - 1)) = Range("B" & (FirstRow - 2 + n))
    Next n
    For i = LastRow To FirstRow Step -1
        For n = 1 To MaxLevel - 1
            For k = i To FirstRow Step -1
                If Rows(k).OutlineLevel = n Then LevelRow(n) = k: Exit For
            Next k
        Next n
        If Rows(i).OutlineLevel = MaxLevel Then
            Cells(i, MaxLevel + 1) = Cells(i, 2)
            For n = 1 To MaxLevel - 1
                Cells(i, n + 1) = Cells(LevelRow(n), 2)
            Next n
        Else
            For n = 1 To MaxLevel - 1
                If i = LevelRow(n) Then Rows(i).Delete Shift:=xlUp
            Next n
        End If
    Next i
    Rows("1:" & LastRow).ClearOutline
End Sub
1
0 / 0 / 0
Регистрация: 17.12.2015
Сообщений: 15
28.01.2016, 11:48  [ТС] 6
Спасибо, а с тем что не так было, вроде работал, не универсальный конечно, но за исключением дублирования первой строки, все работало нормально.

Добавлено через 3 минуты
Первый код работал независимо от вида шапки, пробовал и с одним столбцом "Приход", и с несколькими "нач. остаток", "приход", "оборот" - все работало.

Добавлено через 28 минут
Пробовал менять количество столбцов с числовыми данными, работает. Менял шапку таблицы - частично пропадают названия столбцов, но это не смертельно, так что еще раз большое спасибо.
0
0 / 0 / 0
Регистрация: 17.06.2017
Сообщений: 3
17.06.2017, 20:38 7
Коллеги, здравствуйте!
У меня такая же проблема: нужно многоуровневую структуру преобразовать в линейную для дальнейшего анализа. Написанный макрос в этой теме не подходит. У меня шесть уровней, причём пятый уровень перемешан с шестым, но это уже мелочи. Помогите, сроки горят!!!
Файл (примерный) прикладываю. На одном листе что есть, на другом - что нужно.
Вложения
Тип файла: xlsx 12345667.xlsx (12.2 Кб, 45294 просмотров)
0
Модератор
Эксперт MS Access
11960 / 4828 / 779
Регистрация: 07.08.2010
Сообщений: 14,138
Записей в блоге: 4
17.06.2017, 23:42 8
Цитата Сообщение от Alieksey Посмотреть сообщение
У меня шесть уровней, причём пятый уровень перемешан с шестым
у вас единственный разделитель рядовых строк --единица измерения (, шт)
1 НоменклатураЯнварь 2016 г.Февраль 2016 г.Март 2016 г.Апрель 2016 г.
1 Октавия255 826,5024 831,00 32 469,00
2 Фирма 17 938,00   
3 Продукты для ухода7 938,00   
4 Профессиональные объемы    
5wwРаствор увлажняющий и кондиционирующий 1000 мл, шт    
5wwРаствор укрепляющий с протеином 1000 мл, шт    
4 Стандартные объемы7 938,00   
5wwУнивер.аргановое масло д/бритья и ухода за бородой 50мл, шт    
5wwРаствор увлажняющий и кондиционирующий 250 мл, шт3969,00   
5wwРаствор укрепляющий с протеином 250 мл, шт3969,00   
2 Фирма 2247 888,5024 831,00 32469,00
3 Продукция для ухода247 888,5024831,00 32 469,00
4 АК- средства ухода на масле арганы    
5 Средства для ухода за кожей    
6wwArgan Body lotion лосьон для тела 150мл, шт    
6wwArgan Body lotion лосьон для тела 50мл, шт    
6wwArgan Face Cream крем для лица 50мл, шт    

причем итогов больше на заголовочных строках, чем на рядовых
лист СВОД не соответствует листу НАДО
Номенклатура       Январь 2016 г.Февраль 2016 г.Март 2016 г.Апрель 2016 г.
Октавия       255826,50р24831,00р 32469,00р
ОктавияФирма 1      7 938,00   
ОктавияФирма 1Продукты для ухода     7 938,00   
ОктавияФирма 1Продукты для уходаПрофессиональные объемы        
ОктавияФирма 1Продукты для уходаПрофессиональные объемы Раствор увлажняющий и кондиционирующий 1000 мл, шт      
ОктавияФирма 1Продукты для уходаПрофессиональные объемы Раствор укрепляющий с протеином 1000 мл, шт      
ОктавияФирма 1Продукты для уходаСтандартные объемы    7 938,00   
ОктавияФирма 1Продукты для уходаСтандартные объемы Универ.аргановое масло д/бритья и ухода за бородой 50мл, шт      
ОктавияФирма 1Продукты для уходаСтандартные объемы Раствор увлажняющий и кондиционирующий 250 мл, шт  3 969,00   
ОктавияФирма 1Продукты для уходаСтандартные объемы Раствор укрепляющий с протеином 250 мл, шт  3 969,00   
ОктавияФирма 2      247 888,5024 831,00 32 469,00
ОктавияФирма 2Продукция для ухода     247888,5024831,00 32469,00
ОктавияФирма 2Продукция для уходаАК- средства ухода на масле арганы        
ОктавияФирма 2Продукция для уходаАК- средства ухода на масле арганыСредства для ухода за кожей       
ОктавияФирма 2Продукция для уходаАК- средства ухода на масле арганыСредства для ухода за кожейArgan Body lotion лосьон для тела 150мл, шт      
ОктавияФирма 2Продукция для уходаАК- средства ухода на масле арганыСредства для ухода за кожейArgan Body lotion лосьон для тела 50мл, шт      
ОктавияФирма 2Продукция для уходаАК- средства ухода на масле арганыСредства для ухода за кожейArgan Face Cream крем для лица 50мл, шт      

Добавлено через 7 минут
ппп
1
0 / 0 / 0
Регистрация: 17.06.2017
Сообщений: 3
17.06.2017, 23:55 9
shanemac51, Спасибо за быстрый ответ.
Вы это макросом сделали? Покажите, пожалуйста.
0
Модератор
Эксперт MS Access
11960 / 4828 / 779
Регистрация: 07.08.2010
Сообщений: 14,138
Записей в блоге: 4
18.06.2017, 00:10 10
может он не самый шустрый --я стремилась сохранить исходник и писала в лист ZRAB
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
Option Explicit
 
 
 
Sub Преобразовать_по_группировке()
Dim i&, k&, LastRow&, Level1Row&, Level2Row&
Dim kmax As Long, kx(0 To 20) As String, j, s1, s2
Dim ws2 As Worksheet
LastRow = Cells(Rows.Count, 2).End(xlUp).Row
Application.ScreenUpdating = False
Set ws2 = Excel.Worksheets("zrab")
 
 
  For k = 1 To LastRow
  If Rows(k).OutlineLevel > kmax Then kmax = Rows(k).OutlineLevel
  Cells(k, 1) = Rows(k).OutlineLevel
  Next k
 
Debug.Print kmax
''Exit Sub
For i = 1 To LastRow
  k = Rows(i).OutlineLevel
  
  s1 = Cells(i, 2) & ""
  
  If s1 Like "*, шт*" Then
  For j = k To kmax
  kx(j) = ""
  Next j
  kx(kmax) = s1
  Else
  For j = k To kmax
  kx(j) = ""
  Next j
  kx(k) = s1
  End If
 
 
  For j = 1 To kmax
  ws2.Cells(i, j) = kx(j)
  Next j
  
  For j = 3 To 7
  ws2.Cells(i, j + kmax) = Cells(i, j)
  Next j
 
Next i
End Sub
0
0 / 0 / 0
Регистрация: 17.06.2017
Сообщений: 3
18.06.2017, 00:51 11
Просто заглядение. Большое Вам спасибо!
0
18.06.2017, 00:51
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.06.2017, 00:51
Помогаю со студенческими работами здесь

Создание пустой таблицы со структурой таблицы-шаблона
В базе SQL Server Compact имеется таблица без записей - что-то вроде шаблона. Как создавать...

Преобразование файла с позиционной структурой в файл с разделителями
Добрый день. Собственно весь вопрос в названии темы. Обычно при поиске работы с текстом в...

После окончания работы со структурой, она будет почищена сборщиком. Что произойдет со структурой в неуправляемой памяти
Доброго времени суток. Прочитал закрепленный топик &quot;Класс Marshal, использование PInvoke,...

Разобраться со структурой данных
Имеется набор действий(100-200), для выполнения определенного алгоритма эти действия должны ...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru