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

Вход

Регистрация

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

 

= Мир MS Excel/Получить данные сводной таблицы - Мир MS Excel

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

Excel 2007
Здравствуйте!
В экселе есть функция ПОЛУЧИТЬ.ДАННЫЕ.СВОДНОЙ.ТАБЛИЦЫ, с ней всё понятно...
В VBA у меня не получается использовать Application.WorksheetFunction.GetPivotData - выдаёт ошибку...
Может есть статьи или книги, посвящённые именно обработке (а не созданию) сводных таблиц в VBA?

Теперь о фактической задаче:
Файл сильно уменьшила, но на листе "Данные" сохранены все столбцы. Оставила для примера трёх клиентов (по факту их гораздо больше).
Что требуется: сделать для любимого директора волшебную кнопочку, после нажатия на которую остаются видимыми только те клиенты, у которых есть невыполнение плана текущего месяца.
В ячейке F3 считается процент прошедших рабочих дней этого месяца.
Если выполнение плана по обороту или по количеству меньше этого процента, значит клиент отстаёт от плана.

Как я вижу решение данной задачи:
1. Текущий месяц берём в ячейке G1 (НачалоОтчетногоМесяца)
2. Свернуть все уровни сводной до Клиента
3. Перебираем всех клиентов. По факту нужен аналог формулы: =ПОЛУЧИТЬ.ДАННЫЕ.СВОДНОЙ.ТАБЛИЦЫ("Выпол плана оборот, %";$A$11;"Клиент";Klient.Value;"статус";"Факт";"ДатаЗнач";НачалоОтчетногоМесяца;"Для итогов";"Все";"Годы";2014)
Если выполнение по обороту И по кол-ву больше либо равны проценту прошедших дней (РабДнейПрошлоПроцент), то клиент молодец, можно его скрыть
К сообщению приложен файл: _2010-2014.xlsm (85.2 Kb)
 
Ответить
СообщениеЗдравствуйте!
В экселе есть функция ПОЛУЧИТЬ.ДАННЫЕ.СВОДНОЙ.ТАБЛИЦЫ, с ней всё понятно...
В VBA у меня не получается использовать Application.WorksheetFunction.GetPivotData - выдаёт ошибку...
Может есть статьи или книги, посвящённые именно обработке (а не созданию) сводных таблиц в VBA?

Теперь о фактической задаче:
Файл сильно уменьшила, но на листе "Данные" сохранены все столбцы. Оставила для примера трёх клиентов (по факту их гораздо больше).
Что требуется: сделать для любимого директора волшебную кнопочку, после нажатия на которую остаются видимыми только те клиенты, у которых есть невыполнение плана текущего месяца.
В ячейке F3 считается процент прошедших рабочих дней этого месяца.
Если выполнение плана по обороту или по количеству меньше этого процента, значит клиент отстаёт от плана.

Как я вижу решение данной задачи:
1. Текущий месяц берём в ячейке G1 (НачалоОтчетногоМесяца)
2. Свернуть все уровни сводной до Клиента
3. Перебираем всех клиентов. По факту нужен аналог формулы: =ПОЛУЧИТЬ.ДАННЫЕ.СВОДНОЙ.ТАБЛИЦЫ("Выпол плана оборот, %";$A$11;"Клиент";Klient.Value;"статус";"Факт";"ДатаЗнач";НачалоОтчетногоМесяца;"Для итогов";"Все";"Годы";2014)
Если выполнение по обороту И по кол-ву больше либо равны проценту прошедших дней (РабДнейПрошлоПроцент), то клиент молодец, можно его скрыть

Автор - Li_Anna
Дата добавления - 06.06.2014 в 09:35
RAN Дата: Пятница, 06.06.2014, 10:18 | Сообщение № 2
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
Разбирайтесь.
[vba]
Код
Private Sub formating()
     Dim i As Long, j As Long
     Dim tbRowStart As Long, tbRowEnd As Long
     Dim tbColStart As Long, tbColEnd As Long
     Dim pF As PivotField
     Dim arrColor, sColor$

     arrColor = Array(vbRed, vbCyan, vbYellow, vbGreen, vbMagenta, vbBlue)

     With ActiveSheet

         If .PivotTables.Count <> 1 Then Exit Sub
         With .PivotTables.Item(1)

             On Error Resume Next
             For Each pF In .RowFields
                 pF.ShowDetail = True
             Next
             For Each pF In .DataFields
                 If pF.Function <> xlSum Then
                     pF.Caption = Replace(pF.Caption, Split(pF.Caption)(0), "Сумма")
                     pF.Function = xlSum
                 End If
                 If pF.Name Like "*Процент*" Then
                     If pF.NumberFormat <> "0""%""" Then pF.NumberFormat = "0""%"""
                 ElseIf pF.Name Like "*Трудо*" Then
                     If pF.NumberFormat <> "0""час""" Then pF.NumberFormat = "0""час"""
                 Else
                     If pF.NumberFormat <> "#,##0.00$" Then pF.NumberFormat = "#,##0.00$"
                 End If
             Next
             If Err Then Err.Clear

             .TableRange1.EntireRow.Hidden = False
             .TableRange1.Interior.Color = xlNone
             tbRowStart = .RowFields(1).LabelRange.Row
             '          tbRowStart = .TableRange1.Row
             tbRowEnd = .TableRange1.Row + .TableRange1.Rows.Count - 1

             tbColStart = .TableRange1.Column
             tbColEnd = .TableRange1.Columns.Count + tbColStart - 1

             .TableRange1.Columns(1).ColumnWidth = 60
             .TableRange1.Rows.AutoFit

         End With
[/vba]
 
Ответить
СообщениеРазбирайтесь.
[vba]
Код
Private Sub formating()
     Dim i As Long, j As Long
     Dim tbRowStart As Long, tbRowEnd As Long
     Dim tbColStart As Long, tbColEnd As Long
     Dim pF As PivotField
     Dim arrColor, sColor$

     arrColor = Array(vbRed, vbCyan, vbYellow, vbGreen, vbMagenta, vbBlue)

     With ActiveSheet

         If .PivotTables.Count <> 1 Then Exit Sub
         With .PivotTables.Item(1)

             On Error Resume Next
             For Each pF In .RowFields
                 pF.ShowDetail = True
             Next
             For Each pF In .DataFields
                 If pF.Function <> xlSum Then
                     pF.Caption = Replace(pF.Caption, Split(pF.Caption)(0), "Сумма")
                     pF.Function = xlSum
                 End If
                 If pF.Name Like "*Процент*" Then
                     If pF.NumberFormat <> "0""%""" Then pF.NumberFormat = "0""%"""
                 ElseIf pF.Name Like "*Трудо*" Then
                     If pF.NumberFormat <> "0""час""" Then pF.NumberFormat = "0""час"""
                 Else
                     If pF.NumberFormat <> "#,##0.00$" Then pF.NumberFormat = "#,##0.00$"
                 End If
             Next
             If Err Then Err.Clear

             .TableRange1.EntireRow.Hidden = False
             .TableRange1.Interior.Color = xlNone
             tbRowStart = .RowFields(1).LabelRange.Row
             '          tbRowStart = .TableRange1.Row
             tbRowEnd = .TableRange1.Row + .TableRange1.Rows.Count - 1

             tbColStart = .TableRange1.Column
             tbColEnd = .TableRange1.Columns.Count + tbColStart - 1

             .TableRange1.Columns(1).ColumnWidth = 60
             .TableRange1.Rows.AutoFit

         End With
[/vba]

Автор - RAN
Дата добавления - 06.06.2014 в 10:18
RAN Дата: Пятница, 06.06.2014, 10:20 | Сообщение № 3
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
Коза забодала! Весь код за раз не пущает.
Вторая часть Марлезонского балета
[vba]
Код
        For i = tbRowEnd To tbRowStart Step -1

             For j = 2 To tbColEnd Step 2
                 If IsNumeric(.Cells(i, j)) Then
' УСЛОВИЕ &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
                     If .Cells(i, j + 1) <> .Cells(i, j) Then
' &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
                         If .Cells(i, 1).PivotField.Orientation = 1 Then
                             sColor = .Cells(i, 1).PivotField.Position - 1
                             .Cells(i, 1).Interior.Color = arrColor(sColor)
                             .Range(.Cells(i, j), .Cells(i, j + 1)).Interior.Color = arrColor(sColor)
                         End If
                     End If
                 End If
             Next

             If .Cells(i, 1).Interior.Pattern = xlNone Then
                 .Cells(i, 1).EntireRow.Hidden = True
             End If
         Next

     End With
End Sub
[/vba]
 
Ответить
СообщениеКоза забодала! Весь код за раз не пущает.
Вторая часть Марлезонского балета
[vba]
Код
        For i = tbRowEnd To tbRowStart Step -1

             For j = 2 To tbColEnd Step 2
                 If IsNumeric(.Cells(i, j)) Then
' УСЛОВИЕ &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
                     If .Cells(i, j + 1) <> .Cells(i, j) Then
' &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
                         If .Cells(i, 1).PivotField.Orientation = 1 Then
                             sColor = .Cells(i, 1).PivotField.Position - 1
                             .Cells(i, 1).Interior.Color = arrColor(sColor)
                             .Range(.Cells(i, j), .Cells(i, j + 1)).Interior.Color = arrColor(sColor)
                         End If
                     End If
                 End If
             Next

             If .Cells(i, 1).Interior.Pattern = xlNone Then
                 .Cells(i, 1).EntireRow.Hidden = True
             End If
         Next

     End With
End Sub
[/vba]

Автор - RAN
Дата добавления - 06.06.2014 в 10:20
Li_Anna Дата: Пятница, 06.06.2014, 10:39 | Сообщение № 4
Группа: Пользователи
Ранг: Новичок
Сообщений: 13
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
Разбирайтесь.


Спасибо, попробую разобраться! А самой таблицы, случайно нет? А то опыта у меня не так много, чтобы сходу так разобраться...
 
Ответить
Сообщение
Разбирайтесь.


Спасибо, попробую разобраться! А самой таблицы, случайно нет? А то опыта у меня не так много, чтобы сходу так разобраться...

Автор - Li_Anna
Дата добавления - 06.06.2014 в 10:39
RAN Дата: Пятница, 06.06.2014, 11:15 | Сообщение № 5
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
%)
Книжка-раскраска не влезает
 
Ответить
Сообщение%)
Книжка-раскраска не влезает

Автор - RAN
Дата добавления - 06.06.2014 в 11:15
_Boroda_ Дата: Пятница, 06.06.2014, 11:21 | Сообщение № 6
Группа: Модераторы
Ранг: Местный житель
Сообщений: 16675
Репутация: 6481 ±
Замечаний: 0% ±

2003; 2007; 2010; 2013 RUS
Предположу, что Вам нужно так:
[vba]
Код
VypKol = PT.GetPivotData("Выпол плана кол-во, %", "Клиент", Klient.Value, "статус", "Факт", "ДатаЗнач", Month(Mesyac), "Для итогов", "Все", "Годы", Year(Mesyac))
[/vba]
1. не Application.WorksheetFunction, а PT
2. не нужно ActiveSheet.Range("НачалоСводной"), мы указываем его в п.1
3. Mesyac должно быть не датой, а месяцем - можно цифрой, а можно Format(Mesyac, "MMM")
 
Ответить
СообщениеПредположу, что Вам нужно так:
[vba]
Код
VypKol = PT.GetPivotData("Выпол плана кол-во, %", "Клиент", Klient.Value, "статус", "Факт", "ДатаЗнач", Month(Mesyac), "Для итогов", "Все", "Годы", Year(Mesyac))
[/vba]
1. не Application.WorksheetFunction, а PT
2. не нужно ActiveSheet.Range("НачалоСводной"), мы указываем его в п.1
3. Mesyac должно быть не датой, а месяцем - можно цифрой, а можно Format(Mesyac, "MMM")

Автор - _Boroda_
Дата добавления - 06.06.2014 в 11:21
Li_Anna Дата: Понедельник, 09.06.2014, 08:15 | Сообщение № 7
Группа: Пользователи
Ранг: Новичок
Сообщений: 13
Репутация: 0 ±
Замечаний: 0% ±

Excel 2007
_Boroda_, Вы - гений!!! Спасибо Вам огромное! Всё получилось! Ура-Ура hands
 
Ответить
Сообщение_Boroda_, Вы - гений!!! Спасибо Вам огромное! Всё получилось! Ура-Ура hands

Автор - Li_Anna
Дата добавления - 09.06.2014 в 08:15
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Получить данные сводной таблицы (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

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