Доброго дня, всем! Прошу помощи в следующем вопросе: есть отчет из 1С Торговля, сохраненный в формате .xls Сохраняется в виде структуры. Возможно ли средствами Excel трансформировать его в другой вид, с которым впоследствии можно было бы работать. Создать сводную таблицу или просто таблицу с возможностью использования фильтров? (в оригинальном отчете более 18 тыс. строк)
Доброго дня, всем! Прошу помощи в следующем вопросе: есть отчет из 1С Торговля, сохраненный в формате .xls Сохраняется в виде структуры. Возможно ли средствами Excel трансформировать его в другой вид, с которым впоследствии можно было бы работать. Создать сводную таблицу или просто таблицу с возможностью использования фильтров? (в оригинальном отчете более 18 тыс. строк)alx74
а группировка исходной таблицы выполнена вручную? и разукрашка из 1С? и формулы УФ? реальный вид исх.данных покажите.
пс. в таком варианте "как хотелось бы" использование фильтров будет проблематично. нужно повторять значения контрагентов и ТМЦ в каждой строке таблицы.
а группировка исходной таблицы выполнена вручную? и разукрашка из 1С? и формулы УФ? реальный вид исх.данных покажите.
пс. в таком варианте "как хотелось бы" использование фильтров будет проблематично. нужно повторять значения контрагентов и ТМЦ в каждой строке таблицы.
Сгруппировано автоматом при сохранении из 1С в формат .xls. Разукрасил только надписи "изменилось" с помощью УФ, чтобы было видно, что в одном наименовании может быть несколько строк с данными об изменении скидок. Во вложении вариант без УФ. То что необходимо будет заполнить пробелы знаю, это не проблема.
Сгруппировано автоматом при сохранении из 1С в формат .xls. Разукрасил только надписи "изменилось" с помощью УФ, чтобы было видно, что в одном наименовании может быть несколько строк с данными об изменении скидок. Во вложении вариант без УФ. То что необходимо будет заполнить пробелы знаю, это не проблема.alx74
различие между контрагентом и ТМЦ в исх.таблице - только в форматах и уровне группировки. такие различия никак, кроме цикла, перебрать не удастся. это довольно долго и неинтересно.
предлагаю попробовать другой вариант.
[vba]
Код
Sub t() Dim c As Range, lr&, dk As Object, dt As Object Dim w As Worksheet, i&, j&, a(), a1(), a2(), sk$, st$
Set dk = CreateObject("scripting.dictionary") Set dt = CreateObject("scripting.dictionary")
With ActiveSheet .UsedRange.MergeCells = False Set c = .[a:a].Find("Период (было)", lookat:=xlWhole) If c Is Nothing Then Exit Sub lr = .Cells(.Rows.Count, 1).End(xlUp).Row Set w = ThisWorkbook.Worksheets.Add .Outline.ShowLevels RowLevels:=1 .Range(c.Offset(1), .Cells(lr, 1)).SpecialCells(xlCellTypeVisible).Copy w.[a1] a = w.[a1].CurrentRegion.Value For Each v In a: dk.Item(v) = 0: Next .Outline.ShowLevels RowLevels:=2 .Range(c.Offset(1), .Cells(lr, 1)).SpecialCells(xlCellTypeVisible).Copy w.[a1] a = w.[a1].CurrentRegion.Value For Each v In a If Not dk.exists(v) Then dt.Item(v) = 0 Next .Outline.ShowLevels RowLevels:=3 Application.DisplayAlerts = False w.Delete Application.DisplayAlerts = True a1 = .Range(c.Offset(1), .Cells(lr, 7)).Value ReDim a2(1 To UBound(a1), 1 To 7) For i = 1 To UBound(a1) If dk.exists(a1(i, 1)) Then sk = a1(i, 1) ElseIf dt.exists(a1(i, 1)) Then st = a1(i, 1) Else j = j + 1 a2(j, 1) = sk a2(j, 2) = st a2(j, 3) = a1(i, 1) a2(j, 4) = a1(i, 4) a2(j, 5) = a1(i, 5) a2(j, 6) = a1(i, 6) a2(j, 7) = a1(i, 7) End If Next .[m22].Resize(j, 7).Value = a2 End With End Sub
[/vba]
внимание! этот вариант будет работать некорректно, если будут взаимные совпадения в названиях контрагентов и ТМЦ (что, конечно, чрезвычайно маловероятно, но всё же...)
различие между контрагентом и ТМЦ в исх.таблице - только в форматах и уровне группировки. такие различия никак, кроме цикла, перебрать не удастся. это довольно долго и неинтересно.
предлагаю попробовать другой вариант.
[vba]
Код
Sub t() Dim c As Range, lr&, dk As Object, dt As Object Dim w As Worksheet, i&, j&, a(), a1(), a2(), sk$, st$
Set dk = CreateObject("scripting.dictionary") Set dt = CreateObject("scripting.dictionary")
With ActiveSheet .UsedRange.MergeCells = False Set c = .[a:a].Find("Период (было)", lookat:=xlWhole) If c Is Nothing Then Exit Sub lr = .Cells(.Rows.Count, 1).End(xlUp).Row Set w = ThisWorkbook.Worksheets.Add .Outline.ShowLevels RowLevels:=1 .Range(c.Offset(1), .Cells(lr, 1)).SpecialCells(xlCellTypeVisible).Copy w.[a1] a = w.[a1].CurrentRegion.Value For Each v In a: dk.Item(v) = 0: Next .Outline.ShowLevels RowLevels:=2 .Range(c.Offset(1), .Cells(lr, 1)).SpecialCells(xlCellTypeVisible).Copy w.[a1] a = w.[a1].CurrentRegion.Value For Each v In a If Not dk.exists(v) Then dt.Item(v) = 0 Next .Outline.ShowLevels RowLevels:=3 Application.DisplayAlerts = False w.Delete Application.DisplayAlerts = True a1 = .Range(c.Offset(1), .Cells(lr, 7)).Value ReDim a2(1 To UBound(a1), 1 To 7) For i = 1 To UBound(a1) If dk.exists(a1(i, 1)) Then sk = a1(i, 1) ElseIf dt.exists(a1(i, 1)) Then st = a1(i, 1) Else j = j + 1 a2(j, 1) = sk a2(j, 2) = st a2(j, 3) = a1(i, 1) a2(j, 4) = a1(i, 4) a2(j, 5) = a1(i, 5) a2(j, 6) = a1(i, 6) a2(j, 7) = a1(i, 7) End If Next .[m22].Resize(j, 7).Value = a2 End With End Sub
[/vba]
внимание! этот вариант будет работать некорректно, если будут взаимные совпадения в названиях контрагентов и ТМЦ (что, конечно, чрезвычайно маловероятно, но всё же...)ikki
помощь по Excel и VBA ikki@fxmail.ru, icq 592842413, skype alex.ikki
Сообщение отредактировал ikki - Четверг, 21.02.2013, 13:26
А так же в отступах и регистре первой буквы названия
отступы относятся к формату, в массив без цикла не берутся. регистр первой буквы - думаю, просто совпадение. ориентироваться только на регистр при обработке реальных данных чрезвычайно опасно. имхо.
Цитата (Serge_007)
А так же в отступах и регистре первой буквы названия
отступы относятся к формату, в массив без цикла не берутся. регистр первой буквы - думаю, просто совпадение. ориентироваться только на регистр при обработке реальных данных чрезвычайно опасно. имхо.ikki
помощь по Excel и VBA ikki@fxmail.ru, icq 592842413, skype alex.ikki
Воспользовался советом Serge_007 (отдельное спасибо), потратил 10 минут дополнительного знакомства с 1С и смог изменить формат (внешний вид) сохранения файла. В связи с этим немного переформулировалась задача: каким инструментом удалить строки, которые залиты цветом и не несут информации в строке правее (даты изменения и числовые значения)? з.ы. ikki, shanemac51 за коды спасибо, пригодятся для дальнейшего изучения VBA.
Цитата (Serge_007)
Настройте его для выгрузки в плоской форме
Воспользовался советом Serge_007 (отдельное спасибо), потратил 10 минут дополнительного знакомства с 1С и смог изменить формат (внешний вид) сохранения файла. В связи с этим немного переформулировалась задача: каким инструментом удалить строки, которые залиты цветом и не несут информации в строке правее (даты изменения и числовые значения)? з.ы. ikki, shanemac51 за коды спасибо, пригодятся для дальнейшего изучения VBA.alx74