Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Удалить дубликаты и просуммировать по нескольким критериям - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Удалить дубликаты и просуммировать по нескольким критериям (Макросы/Sub)
Удалить дубликаты и просуммировать по нескольким критериям
dlink74 Дата: Четверг, 22.10.2015, 16:17 | Сообщение № 1
Группа: Пользователи
Ранг: Участник
Сообщений: 66
Репутация: 0 ±
Замечаний: 0% ±

2010
Добрый день.
Прошу помощи для реализации учёта.
На вкладке Учёт в колонки B; C; D; E таблицы последовательно вносятся данные по материалам, в G и H проставляется цифра Прихода или Расхода соответственно в I выбирается участок операции. Каждая новая операция - новая строка в таблице (таблица будет растянута "вниз" до упора. Хотелось бы во вкладке Отчёт при выполнении макроса получить подобие того, что реализовано во вкладке Лист 1 путём копи-паста данных из вкладки Учёт, удаления дубликатов по критериям А; B; C; D, суммирования Прихода и Расхода из вкладки Учёт по этим критериям и вычисления остатка в Н. Попытался выполнить эти операции "под запись" макроса, но при последующем запуске его возникают ошибки в которых я не могу разобраться.
ЗЫ: Хотелось бы чтобы при применении фильтра по дате (месяцу) в столбце А листа Учёт или по Участку в столбце I, при выполнении макроса на листе Отчёт отражался бы месяц за который сформирован Отчёт или Участок.
Заранее спасибо.
К сообщению приложен файл: 4355429.xlsx (27.3 Kb)
 
Ответить
СообщениеДобрый день.
Прошу помощи для реализации учёта.
На вкладке Учёт в колонки B; C; D; E таблицы последовательно вносятся данные по материалам, в G и H проставляется цифра Прихода или Расхода соответственно в I выбирается участок операции. Каждая новая операция - новая строка в таблице (таблица будет растянута "вниз" до упора. Хотелось бы во вкладке Отчёт при выполнении макроса получить подобие того, что реализовано во вкладке Лист 1 путём копи-паста данных из вкладки Учёт, удаления дубликатов по критериям А; B; C; D, суммирования Прихода и Расхода из вкладки Учёт по этим критериям и вычисления остатка в Н. Попытался выполнить эти операции "под запись" макроса, но при последующем запуске его возникают ошибки в которых я не могу разобраться.
ЗЫ: Хотелось бы чтобы при применении фильтра по дате (месяцу) в столбце А листа Учёт или по Участку в столбце I, при выполнении макроса на листе Отчёт отражался бы месяц за который сформирован Отчёт или Участок.
Заранее спасибо.

Автор - dlink74
Дата добавления - 22.10.2015 в 16:17
Pelena Дата: Четверг, 22.10.2015, 17:22 | Сообщение № 2
Группа: Админы
Ранг: Местный житель
Сообщений: 19187
Репутация: 4421 ±
Замечаний: ±

Excel 365 & Mac Excel
Здравствуйте.
А без макроса, сводной не вариант?
К сообщению приложен файл: 0894198.xlsx (31.9 Kb)


"Черт возьми, Холмс! Но как??!!"
Ю-money 41001765434816
 
Ответить
СообщениеЗдравствуйте.
А без макроса, сводной не вариант?

Автор - Pelena
Дата добавления - 22.10.2015 в 17:22
sv2014 Дата: Четверг, 22.10.2015, 23:05 | Сообщение № 3
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 226
Репутация: 61 ±
Замечаний: 0% ±

Excel 2013
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]
К сообщению приложен файл: example_23_10_2.xls (94.0 Kb)
 
Ответить
Сообщение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]

Автор - sv2014
Дата добавления - 22.10.2015 в 23:05
sv2014 Дата: Четверг, 22.10.2015, 23:37 | Сообщение № 4
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 226
Репутация: 61 ±
Замечаний: 0% ±

Excel 2013
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
[/vba]

Автор - sv2014
Дата добавления - 22.10.2015 в 23:37
dlink74 Дата: Пятница, 23.10.2015, 09:59 | Сообщение № 5
Группа: Пользователи
Ранг: Участник
Сообщений: 66
Репутация: 0 ±
Замечаний: 0% ±

2010
Спасибо. Тестирую.
 
Ответить
СообщениеСпасибо. Тестирую.

Автор - dlink74
Дата добавления - 23.10.2015 в 09:59
dlink74 Дата: Пятница, 23.10.2015, 10:58 | Сообщение № 6
Группа: Пользователи
Ранг: Участник
Сообщений: 66
Репутация: 0 ±
Замечаний: 0% ±

2010
Pelena,
как Вы получили в Сводной столбец Остаток? Ведь его нет в источнике данных (Учёт). Именно в это я упёрся когда сам пытался решить задачу через Сводную.
Спасибо.
 
Ответить
СообщениеPelena,
как Вы получили в Сводной столбец Остаток? Ведь его нет в источнике данных (Учёт). Именно в это я упёрся когда сам пытался решить задачу через Сводную.
Спасибо.

Автор - dlink74
Дата добавления - 23.10.2015 в 10:58
Pelena Дата: Пятница, 23.10.2015, 11:04 | Сообщение № 7
Группа: Админы
Ранг: Местный житель
Сообщений: 19187
Репутация: 4421 ±
Замечаний: ±

Excel 365 & Mac Excel
Это вычисляемое поле. При активной сводной на вкладке Параметры найдите кнопку Поля, Элементы, Наборы -- Вычисляемое поле, раскройте список и увидите поле Остаток


"Черт возьми, Холмс! Но как??!!"
Ю-money 41001765434816
 
Ответить
СообщениеЭто вычисляемое поле. При активной сводной на вкладке Параметры найдите кнопку Поля, Элементы, Наборы -- Вычисляемое поле, раскройте список и увидите поле Остаток

Автор - Pelena
Дата добавления - 23.10.2015 в 11:04
dlink74 Дата: Пятница, 23.10.2015, 12:26 | Сообщение № 8
Группа: Пользователи
Ранг: Участник
Сообщений: 66
Репутация: 0 ±
Замечаний: 0% ±

2010
Pelena,
Спасибо.
 
Ответить
СообщениеPelena,
Спасибо.

Автор - dlink74
Дата добавления - 23.10.2015 в 12:26
sv2014 Дата: Пятница, 23.10.2015, 16:08 | Сообщение № 9
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 226
Репутация: 61 ±
Замечаний: 0% ±

Excel 2013
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]
К сообщению приложен файл: example_24_10_2.xls (78.5 Kb)
 
Ответить
Сообщение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]

Автор - sv2014
Дата добавления - 23.10.2015 в 16:08
dlink74 Дата: Пятница, 23.10.2015, 19:01 | Сообщение № 10
Группа: Пользователи
Ранг: Участник
Сообщений: 66
Репутация: 0 ±
Замечаний: 0% ±

2010
sv2014,
Спасибо за помощь. Обязательно протестирую, но с макросами мне пока работать тяжело и при любых изменениях в Учёте придётся обращаться за помощью. Поэтому вар-т со Сводной для меня сейчас предпочтительнее.
Ещё раз спасибо.
 
Ответить
Сообщениеsv2014,
Спасибо за помощь. Обязательно протестирую, но с макросами мне пока работать тяжело и при любых изменениях в Учёте придётся обращаться за помощью. Поэтому вар-т со Сводной для меня сейчас предпочтительнее.
Ещё раз спасибо.

Автор - dlink74
Дата добавления - 23.10.2015 в 19:01
dlink74 Дата: Пятница, 23.10.2015, 19:04 | Сообщение № 11
Группа: Пользователи
Ранг: Участник
Сообщений: 66
Репутация: 0 ±
Замечаний: 0% ±

2010
Подскажите, а в Сводной фильтр по дате можно настроить как в Учёте - год и помесячно?
Спасибо
 
Ответить
СообщениеПодскажите, а в Сводной фильтр по дате можно настроить как в Учёте - год и помесячно?
Спасибо

Автор - dlink74
Дата добавления - 23.10.2015 в 19:04
Pelena Дата: Пятница, 23.10.2015, 19:57 | Сообщение № 12
Группа: Админы
Ранг: Местный житель
Сообщений: 19187
Репутация: 4421 ±
Замечаний: ±

Excel 365 & Mac Excel
Так?
К сообщению приложен файл: 4502056.xlsx (33.0 Kb)


"Черт возьми, Холмс! Но как??!!"
Ю-money 41001765434816
 
Ответить
СообщениеТак?

Автор - Pelena
Дата добавления - 23.10.2015 в 19:57
dlink74 Дата: Суббота, 24.10.2015, 21:18 | Сообщение № 13
Группа: Пользователи
Ранг: Участник
Сообщений: 66
Репутация: 0 ±
Замечаний: 0% ±

2010
Pelena,
Да!!!
Вижу что появилось дополнительное поле Годы, но понять как работает не могу..., как конкретные даты из Учёта преобразованы в месяцы?????
Работает. "Черт возьми, Холмс! Но как??!!" :)
 
Ответить
СообщениеPelena,
Да!!!
Вижу что появилось дополнительное поле Годы, но понять как работает не могу..., как конкретные даты из Учёта преобразованы в месяцы?????
Работает. "Черт возьми, Холмс! Но как??!!" :)

Автор - dlink74
Дата добавления - 24.10.2015 в 21:18
Pelena Дата: Суббота, 24.10.2015, 21:36 | Сообщение № 14
Группа: Админы
Ранг: Местный житель
Сообщений: 19187
Репутация: 4421 ±
Замечаний: ±

Excel 365 & Mac Excel
Это группировка дат.
Сначала размещаем поле Дата в Названиях строк, кликаем правой кнопкой мыши по полю с датами в сводной -- Группировать -- отмечаем Месяцы и годы --ОК. Теперь перетаскиваем получившиеся поля Годы и Дата в фильтр отчёта


"Черт возьми, Холмс! Но как??!!"
Ю-money 41001765434816
 
Ответить
СообщениеЭто группировка дат.
Сначала размещаем поле Дата в Названиях строк, кликаем правой кнопкой мыши по полю с датами в сводной -- Группировать -- отмечаем Месяцы и годы --ОК. Теперь перетаскиваем получившиеся поля Годы и Дата в фильтр отчёта

Автор - Pelena
Дата добавления - 24.10.2015 в 21:36
dlink74 Дата: Воскресенье, 25.10.2015, 18:47 | Сообщение № 15
Группа: Пользователи
Ранг: Участник
Сообщений: 66
Репутация: 0 ±
Замечаний: 0% ±

2010
Нет слов, очень красиво!!!
Спасибо за решение и объяснения.
 
Ответить
СообщениеНет слов, очень красиво!!!
Спасибо за решение и объяснения.

Автор - dlink74
Дата добавления - 25.10.2015 в 18:47
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Удалить дубликаты и просуммировать по нескольким критериям (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!