powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Как сделать типа UNPIVOT?
11 сообщений из 11, страница 1 из 1
Как сделать типа UNPIVOT?
    #38365180
Есть выгрузка xls - отчет, нужно его распивотить, чтобы привести к обычному табличному виду - для запихивания в базу.
Картинка что есть и что нужно получить - на рисунке.
Раньше я это делал циклом типа
Код: vbnet
1.
2.
3.
4.
5.
for Ei
   for Fj
       ...
   next Fj
Next Ei


Помню, что когда я раньше так обрабатывал файл на старом компе, это занимало кучу времени.
А сейчас нужно так отработать больше сотни файлов.
Может есть иной способ?
ЗЫ Для справки - E1..EN - лицевые счета плательщика, к примеру, f1..fn - название услуг ЖКХ - типа ГВС, ВДГО и тп.
...
Рейтинг: 0 / 0
Как сделать типа UNPIVOT?
    #38365358
Фотография ПЕНСИОНЕРКА
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: vbnet
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.
Sub e130813_2102()
Dim J1, J1K, J2, J2K
'Общий итог
''для скорости формирую
''ОБЫЧНО ДОБАВЛЯЮ ЕЩЕ СТОЛБИКИ И ИМЕНЕМ ФАЙЛА И ЛИСТА
''затем текстовик полностью загоняю в XLS или оставляю связанным
''в зависимости от задачи
Open "c:\OTCHET.TXT" For Output As #1
Print #1, "наименование"; Chr(9); "номер магазина"; Chr(9); "количество"
''''''''''''''''''''''''''''''''''
J1 = 4
J1K = 100000
Do While J1 < J1K
J1 = J1 + 1
If Cells(J1, 1) = "Общий итог" Then
J1K = J1 - 1
Exit Do
End If
Loop
'''''''''''''''''''''''''''''''''''
J2 = 1
J2K = 50
Do While J2 < J2K
J2 = J2 + 1
If Cells(4, J2) = "Общий итог" Then
J2K = J2 - 1
Exit Do
End If
Loop
'''''''''''''''''''''''''''''''''
J1 = 4
Debug.Print J1K, J2K
Do While J1 < J1K
J1 = J1 + 1
J2 = 1
Do While J2 < J2K
J2 = J2 + 1
If Cells(J1, J2) <> "" Then
Print #1, Cells(J1, 1); Chr(9); Cells(4, J2); Chr(9); Cells(J1, J2)
End If
Loop
Loop
Close #1

End Sub
...
Рейтинг: 0 / 0
Как сделать типа UNPIVOT?
    #38366105
Михаил Ч.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
У Николая Павлова есть "редизайнер таблиц": http://www.planetaexcel.ru/techniques/3/55/
На больших таблицах работает очень медленно, т.к. обрабатывает ячейки поочередно.
Немного подпилил макрос, перегнал в массивы, скорость стала существенно быстрее

Перед запуском нужно выделить таблицу вместе с заголовками.

Код: vbnet
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.
Sub Redesigner()
    Dim inpdata As Range, realdata As Range, ns As Worksheet
    Dim i&, j&, k&, c&, r&, hc&, hr&
    Dim out(), dataArr, hcArr, hrArr
    
    hr = Val(InputBox("Сколько строк с подписями данных сверху?"))
    hc = Val(InputBox("Сколько столбцов с подписями данных слева?"))

    Set inpdata = Selection
    If inpdata.Rows.Count <= hr Or inpdata.Columns.Count <= hc Then Exit Sub
    Set realdata = inpdata.Offset(hr, hc).Resize(inpdata.Rows.Count - hr, inpdata.Columns.Count - hc)
    dataArr = realdata.Value
    If hr Then hrArr = inpdata.Offset(0, hc).Resize(hr, inpdata.Columns.Count - hc).Value
    If hc Then hcArr = inpdata.Offset(hr, 0).Resize(inpdata.Rows.Count - hr, hc).Value
    
    ReDim out(1 To Application.CountA(realdata), 1 To hr + hc + 1)
    Set ns = Worksheets.Add
    
    For i = 1 To UBound(dataArr, 1)
        For j = 1 To UBound(dataArr, 2)
            If Not IsEmpty(dataArr(i, j)) Then
                k = k + 1
                For c = 1 To hc: out(k, c) = hcArr(i, c): Next c
                For r = 1 To hr: out(k, c + r - 1) = hrArr(r, j): Next r
                out(k, c + r - 1) = dataArr(i, j)
            End If
    Next j, i
    ns.Cells(2, 1).Resize(UBound(out, 1), UBound(out, 2)) = out
End Sub 
...
Рейтинг: 0 / 0
Как сделать типа UNPIVOT?
    #38367043
Михаил Ч.У Николая Павлова есть "редизайнер таблиц": http://www.planetaexcel.ru/techniques/3/55/
На больших таблицах работает очень медленно, т.к. обрабатывает ячейки поочередно.
Немного подпилил макрос, перегнал в массивы, скорость стала существенно быстрее

Перед запуском нужно выделить таблицу вместе с заголовками.
[/src]
Работает шустро, респект.
Не в курсах, а в Акцесс так шустро 1 жохом массив можно перегнать?
А то я опасаюсь упереться в ограничение Экселя на 65000 строк.
...
Рейтинг: 0 / 0
Как сделать типа UNPIVOT?
    #38367114
Михаил Ч.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
грязный комплектовщикНе в курсах, а в Акцесс так шустро 1 жохом массив можно перегнать?
А то я опасаюсь упереться в ограничение Экселя на 65000 строк.
Про Акцесс ничего сказать не могу, не знаю как в нем работать, но в 2007/2010/2013 Excel вмещается 1048576 строк
...
Рейтинг: 0 / 0
Как сделать типа UNPIVOT?
    #38404310
Кто подскажет, как обратную задачу решить - сделать из нормальной таблицы двумерную?
Т.е. есть таблица типа дата|название услуги|сумма.
01-янв-11 Отопление 928,37
01-янв-11 ХВС 0
01-янв-11 Хол.водосн.по счетч 0
И нужно название услуги развернуть по горизонтали.
Пока ничего кроме создания сводной таблицы программно не придумал, а нужно будет еще и со сводной копировать данные и вставлять значения на другой лист.
...
Рейтинг: 0 / 0
Как сделать типа UNPIVOT?
    #38404651
100ts
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
гр. комплектовщик,

попробуйте через Power Query, вот ссылка
http://datapigtechnologies.com/blog/index.php/transpose-or-unpivot-entire-datasets-with-data-explorer/
делается очень быстро
...
Рейтинг: 0 / 0
Как сделать типа UNPIVOT?
    #38455939
100tsгр. комплектовщик,

попробуйте через Power Query, вот ссылка
http://datapigtechnologies.com/blog/index.php/transpose-or-unpivot-entire-datasets-with-data-explorer/
делается очень быстро
Этот аддин, как я понял, для Эксель 2010 и старше версий.
А у меня 2003.
Вот есть, допустим, такая нормальная исходная таблица с полями:
Период|Адрес|Услуга|Расход|Начислено
Нужно Поле Услуга развернуть по горизонтали. Т.е. из этого поля сделать поля типа Услуга1_Начислено ... УслугаN_Начислено, Услуга1_Расход ... УслугаN_Расход.
Можно как-то такую транспонировку в Экселе по-простому сделать?
У меня ум за разум заходит.
ЗЫ Приложил пример в файле.
...
Рейтинг: 0 / 0
Как сделать типа UNPIVOT?
    #38455944
файл примера:
...
Рейтинг: 0 / 0
Как сделать типа UNPIVOT?
    #38456124
Inna88
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте объясните пожалуйста. Ни как не могу разобраться с редизайном таблиц.
Какие цифры нужно вносить в эти поля, если возможно объясните с примерами. Буду очень благодарна.

hr = Val(InputBox("Сколько строк с подписями данных сверху?"))
hc = Val(InputBox("Сколько столбцов с подписями данных слева?"))
...
Рейтинг: 0 / 0
Как сделать типа UNPIVOT?
    #38456312
гр. к.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Inna88, в 1 посте этой темы в примере hr и hc равно 1, в примере в приатаченном файле hc=2,hr=1
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Microsoft Office [игнор отключен] [закрыт для гостей] / Как сделать типа UNPIVOT?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]