Новости:

К первому сообщению темы должен быть прикреплен файл примера в формате xls*.
Приложив пример, Вы избавите себя и других от вопросов типа "А какой критерий?", "А куда выводить результат?", "А сколько строк?" и все тех же просьб выложить файл. Рисовать за Вас Ваши же таблички с заданиями, а затем и решение к ним, никто желанием не горит. Да и, как показывает практика, в большинстве случаев без файла решения не найти.

Главное меню

Сложности с VBA для вычисляемых полей сводных таблиц

Автор bzzzu, 11.05.2012, 19:32

« назад - далее »

bzzzu

Помогите пожалуйста разрешить проблему с вычисляемыми полями сводных таблиц.
Есть сводная таблица в которой один столбец обычное поле таблицы с исходными данными (продажи), а второй вычисляемое поле (сумма = продажи*цена).
Возникла необходимость добавлять и удалять эти столбцы по нажатию кнопки.
Для обычного поля макрос работает на ура, тогда как для вычисляемого поля добавление работает, а удаление нет, хотя код абсолютно идентичен.
Пример в приложенном файле.

Код макросов

Sub Vkl_Prod()

On Error Resume Next
Application.ScreenUpdating = False

k = 0
If ActiveSheet.PivotTables("СводнаяТаблица1").PivotFields("продажи в шт"). _
        Orientation = xlHidden Then
    k = 1
End If
       
 
       
If k = 1 Then
    ActiveSheet.PivotTables("СводнаяТаблица1").AddDataField ActiveSheet.PivotTables _
        ("СводнаяТаблица1").PivotFields("продажи"), "продажи в шт", xlCount
    ActiveSheet.PivotTables("СводнаяТаблица1").PivotFields("продажи в шт").Function = xlSum
    ActiveSheet.PivotTables("СводнаяТаблица1").PivotFields("продажи в шт").Position = 1
Else
    ActiveSheet.PivotTables("СводнаяТаблица1").PivotFields("продажи в шт"). _
        Orientation = xlHidden
End If

Application.ScreenUpdating = True
End Sub

Sub Vkl_Pole()

On Error Resume Next
Application.ScreenUpdating = False

k = 0
If ActiveSheet.PivotTables("СводнаяТаблица1").PivotFields("сумма_"). _
        Orientation = xlHidden Then
    k = 1
End If
       
 
       
If k = 1 Then
    ActiveSheet.PivotTables("СводнаяТаблица1").AddDataField ActiveSheet.PivotTables _
        ("СводнаяТаблица1").PivotFields("сумма"), "сумма_", xlCount
    ActiveSheet.PivotTables("СводнаяТаблица1").PivotFields("сумма_").Function = xlSum
    ActiveSheet.PivotTables("СводнаяТаблица1").PivotFields("сумма_").Position = 2
Else
    ActiveSheet.PivotTables("СводнаяТаблица1").PivotFields("сумма_"). _
        Orientation = xlHidden
End If

Application.ScreenUpdating = True
End Sub


bzzzu


_Boroda_

Идея такая - вместо удаления столбца делать удаление всего поля, а потом его заново создавать.
Но есть мысля попроще - просто скрывать нужные столбцы - как в приложенном файле.
Скажи мне, кудесник, любимец ба'гов...



Яндекс-деньги: 41001632713405
Webmoney: R289877159277; Z102172301748; E177867141995

bzzzu

Спасибо!
Правда такой вариант, к сожалению, не подойдет, потому что тестовый пример существенно упрощен.
А в реальном документе необходимо именно добавлять и удалять(

Идея с удалением поля хорошая, так я еще не пробовала)
Попробую, о результатах отпишусь)

bzzzu

Идея оказалась хороша, спасибо)

Правда как осуществить нормальную проверку существования вычисляемого поля с заданным именем я не придумала, пришлось извратиться(
Но зато все работает)

На всякий случай привожу код и прикладываю файл с рабочим примером, вдруг кому пригодится.
Sub Vkl_Pole()

On Error Resume Next
Application.ScreenUpdating = False


For i = 1 To 10
    For j = 1 To 10
        If Cells(i, j).Value = "сумма_" Then
            k = 1
            Exit For
        End If
    Next
Next

If k = 1 Then
    ActiveSheet.PivotTables("СводнаяТаблица1").CalculatedFields("сумма").Delete
Else
    ActiveSheet.PivotTables("СводнаяТаблица1").CalculatedFields.Add "сумма", _
        "=цена *продажи", True
    ActiveSheet.PivotTables("СводнаяТаблица1").PivotFields("сумма").Orientation = _
        xlDataField
    ActiveSheet.PivotTables("СводнаяТаблица1").PivotFields("Сумма по полю сумма"). _
        Caption = "сумма_"
End If

Application.ScreenUpdating = True
End Sub


_Boroda_

ЦитироватьПравда как осуществить нормальную проверку существования вычисляемого поля с заданным именем я не придумала,
один из вариантов
For i = 1 To ActiveSheet.PivotTables("СводнаяТаблица1").PivotFields.Count
    If ActiveSheet.PivotTables("СводнаяТаблица1").PivotFields(i).Name = "сумма" Then
        ActiveSheet.PivotTables("СводнаяТаблица1").CalculatedFields("сумма").Delete
    End If
Next i
Скажи мне, кудесник, любимец ба'гов...



Яндекс-деньги: 41001632713405
Webmoney: R289877159277; Z102172301748; E177867141995