Добрый день. Прошу помощи для реализации учёта. На вкладке Учёт в колонки B; C; D; E таблицы последовательно вносятся данные по материалам, в G и H проставляется цифра Прихода или Расхода соответственно в I выбирается участок операции. Каждая новая операция - новая строка в таблице (таблица будет растянута "вниз" до упора. Хотелось бы во вкладке Отчёт при выполнении макроса получить подобие того, что реализовано во вкладке Лист 1 путём копи-паста данных из вкладки Учёт, удаления дубликатов по критериям А; B; C; D, суммирования Прихода и Расхода из вкладки Учёт по этим критериям и вычисления остатка в Н. Попытался выполнить эти операции "под запись" макроса, но при последующем запуске его возникают ошибки в которых я не могу разобраться. ЗЫ: Хотелось бы чтобы при применении фильтра по дате (месяцу) в столбце А листа Учёт или по Участку в столбце I, при выполнении макроса на листе Отчёт отражался бы месяц за который сформирован Отчёт или Участок. Заранее спасибо.
Добрый день. Прошу помощи для реализации учёта. На вкладке Учёт в колонки B; C; D; E таблицы последовательно вносятся данные по материалам, в G и H проставляется цифра Прихода или Расхода соответственно в I выбирается участок операции. Каждая новая операция - новая строка в таблице (таблица будет растянута "вниз" до упора. Хотелось бы во вкладке Отчёт при выполнении макроса получить подобие того, что реализовано во вкладке Лист 1 путём копи-паста данных из вкладки Учёт, удаления дубликатов по критериям А; B; C; D, суммирования Прихода и Расхода из вкладки Учёт по этим критериям и вычисления остатка в Н. Попытался выполнить эти операции "под запись" макроса, но при последующем запуске его возникают ошибки в которых я не могу разобраться. ЗЫ: Хотелось бы чтобы при применении фильтра по дате (месяцу) в столбце А листа Учёт или по Участку в столбце I, при выполнении макроса на листе Отчёт отражался бы месяц за который сформирован Отчёт или Участок. Заранее спасибо.dlink74
dlink74, добрый вечер,протестируйте макрос,кнопка итог в файл примере
[vba]
Код
Sub itog() Dim i&, z(), t$, i1& i1 = Sheets("Учёт").Range("A5").End(xlDown).Row z = Sheets("Учёт").Range("B5:H" & i1).Value With CreateObject("Scripting.dictionary"): .Comparemode = 1 For i = 1 To UBound(z) t = z(i, 1) & z(i, 2) & z(i, 3) & z(i, 4) If .exists(t) = False Then m = m + 1: .Item(t) = m: For j = 1 To 7: z(m, j) = z(i, j): Next Else z(.Item(t), 6) = z(.Item(t), 6) + z(i, 6) z(.Item(t), 7) = z(.Item(t), 7) + z(i, 7) End If Next
Sheets("Лист1").Range("A5").Resize(.Count, 7) = z End With With Sheets("Лист1") .Range("H1").Formula = "=NOW()" .Range("H1").Value = .Range("H1").Value End With End Sub
[/vba]
dlink74, добрый вечер,протестируйте макрос,кнопка итог в файл примере
[vba]
Код
Sub itog() Dim i&, z(), t$, i1& i1 = Sheets("Учёт").Range("A5").End(xlDown).Row z = Sheets("Учёт").Range("B5:H" & i1).Value With CreateObject("Scripting.dictionary"): .Comparemode = 1 For i = 1 To UBound(z) t = z(i, 1) & z(i, 2) & z(i, 3) & z(i, 4) If .exists(t) = False Then m = m + 1: .Item(t) = m: For j = 1 To 7: z(m, j) = z(i, j): Next Else z(.Item(t), 6) = z(.Item(t), 6) + z(i, 6) z(.Item(t), 7) = z(.Item(t), 7) + z(i, 7) End If Next
Sheets("Лист1").Range("A5").Resize(.Count, 7) = z End With With Sheets("Лист1") .Range("H1").Formula = "=NOW()" .Range("H1").Value = .Range("H1").Value End With End Sub
dlink74, добавлю,что можно и такой вариант макроса
[vba]
Код
Sub itog1() Dim i%, j%, k%, z(), t$, i1& i1 = Sheets("Учёт").Range("A5").End(xlDown).Row z = Sheets("Учёт").Range("B5:H" & i1).Value With CreateObject("Scripting.dictionary"): .Comparemode = 1 For i = 1 To UBound(z) t = z(i, 1) & z(i, 2) & z(i, 3) & z(i, 4) If .exists(t) = False Then m = m + 1: .Item(t) = m: For j = 1 To UBound(z, 2): z(m, j) = z(i, j): Next Else For k = 6 To 7: z(.Item(t), k) = z(.Item(t), k) + z(i, k): Next End If Next Sheets("Лист1").Range("A5").Resize(.Count, UBound(z, 2)) = z End With With Sheets("Лист1") .Range("H1").Formula = "=NOW()" .Range("H1").Value = .Range("H1").Value End With End Sub
[/vba]
dlink74, добавлю,что можно и такой вариант макроса
[vba]
Код
Sub itog1() Dim i%, j%, k%, z(), t$, i1& i1 = Sheets("Учёт").Range("A5").End(xlDown).Row z = Sheets("Учёт").Range("B5:H" & i1).Value With CreateObject("Scripting.dictionary"): .Comparemode = 1 For i = 1 To UBound(z) t = z(i, 1) & z(i, 2) & z(i, 3) & z(i, 4) If .exists(t) = False Then m = m + 1: .Item(t) = m: For j = 1 To UBound(z, 2): z(m, j) = z(i, j): Next Else For k = 6 To 7: z(.Item(t), k) = z(.Item(t), k) + z(i, k): Next End If Next Sheets("Лист1").Range("A5").Resize(.Count, UBound(z, 2)) = z End With With Sheets("Лист1") .Range("H1").Formula = "=NOW()" .Range("H1").Value = .Range("H1").Value End With End Sub
Pelena, как Вы получили в Сводной столбец Остаток? Ведь его нет в источнике данных (Учёт). Именно в это я упёрся когда сам пытался решить задачу через Сводную. Спасибо.
Pelena, как Вы получили в Сводной столбец Остаток? Ведь его нет в источнике данных (Учёт). Именно в это я упёрся когда сам пытался решить задачу через Сводную. Спасибо.dlink74
Это вычисляемое поле. При активной сводной на вкладке Параметры найдите кнопку Поля, Элементы, Наборы -- Вычисляемое поле, раскройте список и увидите поле Остаток
Это вычисляемое поле. При активной сводной на вкладке Параметры найдите кнопку Поля, Элементы, Наборы -- Вычисляемое поле, раскройте список и увидите поле ОстатокPelena
"Черт возьми, Холмс! Но как??!!" Ю-money 41001765434816
dlink74, добрый день,вычисляемое поле можно создать и макросом,в файл - примере: лист сводная_таблица1,кнопка сводная таблица, на листе Учёт,протестируйте,можно доработать под Ваши нужды.
[vba]
Код
Sub CreatePivotTable1() Dim PTCache As PivotCache Dim PT As PivotTable, i As Integer On Error Resume Next Application.DisplayAlerts = False Sheets("сводная_таблица1").Delete On Error GoTo 0 i = Sheets("Учёт").Range("A5").End(xlDown).Row Set PTCache = ActiveWorkbook.PivotCaches.Create( _ SourceType:=xlDatabase, _ SourceData:="Учёт!B4:H" & i) Worksheets.Add ActiveSheet.Name = "сводная_таблица1" Set PT = ActiveSheet.PivotTables.Add(PivotCache:=PTCache, _ TableDestination:=Range("A3")) PT.ManualUpdate = True PT.AddFields RowFields:=Array("Материал", "Маркировка", "Диаметр (мм)", "№ партии", "Ед. измерения") With PT.PivotFields("Приход") .Orientation = xlDataField .Function = xlSum .Position = 1 .NumberFormat = "# ##0" End With With PT.PivotFields("Расход") .Orientation = xlDataField .Function = xlSum .Position = 2 .NumberFormat = "# ##0" End With PT.CalculatedFields.Add Name:="Остаток", _ Formula:="=Приход-Расход" With PT.PivotFields("Остаток") .Orientation = xlDataField .Function = xlSum .Position = 3 .NumberFormat = "# ##0" .Caption = "Остаток " End With ActiveWorkbook.ShowPivotTableFieldList = False With PT .RowAxisLayout xlTabularRow .NullString = "0" .RepeatAllLabels xlRepeatLabels .ShowTableStyleRowStripes = True .TableStyle2 = "PivotStyle2 = PivotStyleMedium10" .ManualUpdate = False .ManualUpdate = True End With Application.ScreenUpdating = True End Sub
[/vba]
dlink74, добрый день,вычисляемое поле можно создать и макросом,в файл - примере: лист сводная_таблица1,кнопка сводная таблица, на листе Учёт,протестируйте,можно доработать под Ваши нужды.
[vba]
Код
Sub CreatePivotTable1() Dim PTCache As PivotCache Dim PT As PivotTable, i As Integer On Error Resume Next Application.DisplayAlerts = False Sheets("сводная_таблица1").Delete On Error GoTo 0 i = Sheets("Учёт").Range("A5").End(xlDown).Row Set PTCache = ActiveWorkbook.PivotCaches.Create( _ SourceType:=xlDatabase, _ SourceData:="Учёт!B4:H" & i) Worksheets.Add ActiveSheet.Name = "сводная_таблица1" Set PT = ActiveSheet.PivotTables.Add(PivotCache:=PTCache, _ TableDestination:=Range("A3")) PT.ManualUpdate = True PT.AddFields RowFields:=Array("Материал", "Маркировка", "Диаметр (мм)", "№ партии", "Ед. измерения") With PT.PivotFields("Приход") .Orientation = xlDataField .Function = xlSum .Position = 1 .NumberFormat = "# ##0" End With With PT.PivotFields("Расход") .Orientation = xlDataField .Function = xlSum .Position = 2 .NumberFormat = "# ##0" End With PT.CalculatedFields.Add Name:="Остаток", _ Formula:="=Приход-Расход" With PT.PivotFields("Остаток") .Orientation = xlDataField .Function = xlSum .Position = 3 .NumberFormat = "# ##0" .Caption = "Остаток " End With ActiveWorkbook.ShowPivotTableFieldList = False With PT .RowAxisLayout xlTabularRow .NullString = "0" .RepeatAllLabels xlRepeatLabels .ShowTableStyleRowStripes = True .TableStyle2 = "PivotStyle2 = PivotStyleMedium10" .ManualUpdate = False .ManualUpdate = True End With Application.ScreenUpdating = True End Sub
sv2014, Спасибо за помощь. Обязательно протестирую, но с макросами мне пока работать тяжело и при любых изменениях в Учёте придётся обращаться за помощью. Поэтому вар-т со Сводной для меня сейчас предпочтительнее. Ещё раз спасибо.
sv2014, Спасибо за помощь. Обязательно протестирую, но с макросами мне пока работать тяжело и при любых изменениях в Учёте придётся обращаться за помощью. Поэтому вар-т со Сводной для меня сейчас предпочтительнее. Ещё раз спасибо.dlink74
Pelena, Да!!! Вижу что появилось дополнительное поле Годы, но понять как работает не могу..., как конкретные даты из Учёта преобразованы в месяцы????? Работает. "Черт возьми, Холмс! Но как??!!"
Pelena, Да!!! Вижу что появилось дополнительное поле Годы, но понять как работает не могу..., как конкретные даты из Учёта преобразованы в месяцы????? Работает. "Черт возьми, Холмс! Но как??!!" dlink74
Это группировка дат. Сначала размещаем поле Дата в Названиях строк, кликаем правой кнопкой мыши по полю с датами в сводной -- Группировать -- отмечаем Месяцы и годы --ОК. Теперь перетаскиваем получившиеся поля Годы и Дата в фильтр отчёта
Это группировка дат. Сначала размещаем поле Дата в Названиях строк, кликаем правой кнопкой мыши по полю с датами в сводной -- Группировать -- отмечаем Месяцы и годы --ОК. Теперь перетаскиваем получившиеся поля Годы и Дата в фильтр отчётаPelena
"Черт возьми, Холмс! Но как??!!" Ю-money 41001765434816