Здравствуйте уважаемые форумчане. Помогите пожалуйста написать макрос, подводящий промежуточные итоги в таблице. Есть заполненная таблица (файл прилагается). В ней уже подведены итоги по группам. Необходимо подсчитать промежуточный итог по позициям, в которых заполнено поле признак и в которых данное поле не заполнено. В прилагаемом файле на листе 1 имеющаяся таблица, на листе 2 - как должно быть.
Здравствуйте уважаемые форумчане. Помогите пожалуйста написать макрос, подводящий промежуточные итоги в таблице. Есть заполненная таблица (файл прилагается). В ней уже подведены итоги по группам. Необходимо подсчитать промежуточный итог по позициям, в которых заполнено поле признак и в которых данное поле не заполнено. В прилагаемом файле на листе 1 имеющаяся таблица, на листе 2 - как должно быть.Альбина
Нужен макрос, данные в таблицу загружаются программно, большой объем данных, хотелось бы, чтобы в момент выгрузки сработал VBA и бухгалтер видел промежуточный итог, не производя дополнительных действий. Понимаю, что возможно включить запись макроса и сделать операцию, подсказанную выше "Данные" - "Пром. итог". Тогда подскажите, какие столбцы нужно при этом выделить, потому что у меня подсчитывается итог по группе а не по признаку.
Нужен макрос, данные в таблицу загружаются программно, большой объем данных, хотелось бы, чтобы в момент выгрузки сработал VBA и бухгалтер видел промежуточный итог, не производя дополнительных действий. Понимаю, что возможно включить запись макроса и сделать операцию, подсказанную выше "Данные" - "Пром. итог". Тогда подскажите, какие столбцы нужно при этом выделить, потому что у меня подсчитывается итог по группе а не по признаку.Альбина
Do If Cells(i, 1) & Cells(i, 2) <> cPriz And cPriz <> "~" Then Rows(i).Insert Cells(i, 1) = "Итого с признаком '" & Cells(i - 1, 2) & "':" Cells(i, 1).Resize(, 3).Interior.ColorIndex = 40 Cells(i, 3) = nSum Cells(i, 1).Resize(, 2).Merge cPriz = "~" Else If cPriz = "~" Then nSum = 0 If Left(Cells(i, 1), 5) <> "Итого" Then cPriz = Cells(i, 1) & Cells(i, 2) End If End If If Cells(i, 1) & Cells(i, 2) = cPriz Then nSum = nSum + Cells(i, 3) End If End If i = i + 1 Loop Until Cells(i, 1) = ""
End Sub
[/vba]
Можно сделать что-то типа такого: [vba]
Код
Sub test()
i = 2 cPriz = "~"
Do If Cells(i, 1) & Cells(i, 2) <> cPriz And cPriz <> "~" Then Rows(i).Insert Cells(i, 1) = "Итого с признаком '" & Cells(i - 1, 2) & "':" Cells(i, 1).Resize(, 3).Interior.ColorIndex = 40 Cells(i, 3) = nSum Cells(i, 1).Resize(, 2).Merge cPriz = "~" Else If cPriz = "~" Then nSum = 0 If Left(Cells(i, 1), 5) <> "Итого" Then cPriz = Cells(i, 1) & Cells(i, 2) End If End If If Cells(i, 1) & Cells(i, 2) = cPriz Then nSum = nSum + Cells(i, 3) End If End If i = i + 1 Loop Until Cells(i, 1) = ""
Sub Test() Dim arr(), arr2(), i&, y&, it, arr1 Application.ScreenUpdating = False With Sheets(1) arr = .Range("A2:C" & .Cells(.Rows.Count, 1).End(xlUp).Row).Value End With With CreateObject("Scripting.Dictionary") For i = LBound(arr, 1) To UBound(arr, 1) If arr(i, 1) <> "Итого по группе 1:" Then it = arr(i, 1) & "@@" & arr(i, 2) .Item(it) = .Item(it) + arr(i, 3) End If Next i
ReDim arr2(1 To .Count, 1 To 3) y = 1 For Each it In .Keys arr1 = Split(it, "@@") arr2(y, 1) = arr1(0) arr2(y, 2) = arr1(1) arr2(y, 3) = .Item(it) y = y + 1 Next it End With With Sheets(3) .Cells.Clear .[a1].Resize(y - 1, 3).Value = arr2 .Activate End With Application.ScreenUpdating = True End Sub
[/vba]
так подойдет? [vba]
Код
Sub Test() Dim arr(), arr2(), i&, y&, it, arr1 Application.ScreenUpdating = False With Sheets(1) arr = .Range("A2:C" & .Cells(.Rows.Count, 1).End(xlUp).Row).Value End With With CreateObject("Scripting.Dictionary") For i = LBound(arr, 1) To UBound(arr, 1) If arr(i, 1) <> "Итого по группе 1:" Then it = arr(i, 1) & "@@" & arr(i, 2) .Item(it) = .Item(it) + arr(i, 3) End If Next i
ReDim arr2(1 To .Count, 1 To 3) y = 1 For Each it In .Keys arr1 = Split(it, "@@") arr2(y, 1) = arr1(0) arr2(y, 2) = arr1(1) arr2(y, 3) = .Item(it) y = y + 1 Next it End With With Sheets(3) .Cells.Clear .[a1].Resize(y - 1, 3).Value = arr2 .Activate End With Application.ScreenUpdating = True End Sub
Большое спасибо за ответы! AndreTM. Ваш макрос это именно то, что нужно! Только немного некорректно во второй группе прошел поиск признака 'X'. Сразу после первой позиции группы 2 с признаком 'X' подвелся итог. В прикрепленном файле результат выполнения макроса.
Большое спасибо за ответы! AndreTM. Ваш макрос это именно то, что нужно! Только немного некорректно во второй группе прошел поиск признака 'X'. Сразу после первой позиции группы 2 с признаком 'X' подвелся итог. В прикрепленном файле результат выполнения макроса.Альбина
К сожалению не рассчитала свои силы, слишком упростила документ для примера. Если можно было бы вернуться к этой теме, помогите пожалуйста. Исходный файл осложнен тем, что в столбце "Группа" включено объединение ячеек и каждая новая группа отделяется строкой с именем этой группы. Можно ли обойти эти сложности?
К сожалению не рассчитала свои силы, слишком упростила документ для примера. Если можно было бы вернуться к этой теме, помогите пожалуйста. Исходный файл осложнен тем, что в столбце "Группа" включено объединение ячеек и каждая новая группа отделяется строкой с именем этой группы. Можно ли обойти эти сложности?Альбина
Альбина, и что? Мы теперь будем на каждый чих переписывать код? Вообще-то, вам выше правильно советовали сразу получить нужный вид сводной, а не напрягать уже готовые таблицы дополнительным функционалом. С другой стороны, вы в макросе разбирались? Или вам (как, между прочим, многим здесь) - "некогда, поскольку начальство напрягает и всё надо ещё вчера"? Так поверьте, многих из нас тоже напрягают - и ничего, успеваем и работать, и новые знания получать, и делиться ими. Нет, конечно, макрос-то не влом переписать - но ведь там минимум исправлений требуется. Вот только помощь наша уходит в песок... и вы рискуете с таким подходом очень быстро исчерпать запас здешних альтруистов [vba]
Код
Sub test()
Application.ScreenUpdating = False
i = 17 cPriz = "~"
Do If Cells(i, 2) <> cPriz And cPriz <> "~" Then Rows(i).Insert Cells(i, 2) = "Итого с признаком '" & Cells(i - 1, 2) & "':" Cells(i, 2).Resize(, 4).Interior.ColorIndex = 36 Cells(i, 3) = nSum 'Cells(i, 1).Resize(, 2).Merge cPriz = "~" Else If cPriz = "~" Then nSum = 0 If Cells(i, 2) = "X" Or Cells(i, 2) = "" Then cPriz = Cells(i, 2) End If End If If Cells(i, 2) = cPriz Then nSum = nSum + Cells(i, 3) End If End If i = i + 1 Loop Until Left(Cells(i, 1), 5) = "Всего"
Application.ScreenUpdating = True
End Sub
[/vba]
Альбина, и что? Мы теперь будем на каждый чих переписывать код? Вообще-то, вам выше правильно советовали сразу получить нужный вид сводной, а не напрягать уже готовые таблицы дополнительным функционалом. С другой стороны, вы в макросе разбирались? Или вам (как, между прочим, многим здесь) - "некогда, поскольку начальство напрягает и всё надо ещё вчера"? Так поверьте, многих из нас тоже напрягают - и ничего, успеваем и работать, и новые знания получать, и делиться ими. Нет, конечно, макрос-то не влом переписать - но ведь там минимум исправлений требуется. Вот только помощь наша уходит в песок... и вы рискуете с таким подходом очень быстро исчерпать запас здешних альтруистов [vba]
Код
Sub test()
Application.ScreenUpdating = False
i = 17 cPriz = "~"
Do If Cells(i, 2) <> cPriz And cPriz <> "~" Then Rows(i).Insert Cells(i, 2) = "Итого с признаком '" & Cells(i - 1, 2) & "':" Cells(i, 2).Resize(, 4).Interior.ColorIndex = 36 Cells(i, 3) = nSum 'Cells(i, 1).Resize(, 2).Merge cPriz = "~" Else If cPriz = "~" Then nSum = 0 If Cells(i, 2) = "X" Or Cells(i, 2) = "" Then cPriz = Cells(i, 2) End If End If If Cells(i, 2) = cPriz Then nSum = nSum + Cells(i, 3) End If End If i = i + 1 Loop Until Left(Cells(i, 1), 5) = "Всего"
Очень извиняюсь, если я вас обидела. Естественно я разбиралась с макросом. Я потому и выставляла изначально упрощенный вариант, чтобы получить направление, в котором можно разобраться с данной задачей. Я не программист, то, что i = 17, т. к. данные начинаются с 17 строки я поняла, ну и то, что номер столбца может варьироваться, а с объединенными ячейками не разобралась. Спасибо, что потратили время и помогли мне.
Очень извиняюсь, если я вас обидела. Естественно я разбиралась с макросом. Я потому и выставляла изначально упрощенный вариант, чтобы получить направление, в котором можно разобраться с данной задачей. Я не программист, то, что i = 17, т. к. данные начинаются с 17 строки я поняла, ну и то, что номер столбца может варьироваться, а с объединенными ячейками не разобралась. Спасибо, что потратили время и помогли мне.Альбина