Excel работа с наборами

Под выпадающим списком понимается содержание в одной ячейке нескольких значений. Когда пользователь щелкает по стрелочке справа, появляется определенный перечень. Можно выбрать конкретное.

Очень удобный инструмент Excel для проверки введенных данных. Повысить комфорт работы с данными позволяют возможности выпадающих списков: подстановка данных, отображение данных другого листа или файла, наличие функции поиска и зависимости.

Создание раскрывающегося списка

Путь: меню «Данные» — инструмент «Проверка данных» — вкладка «Параметры». Тип данных – «Список».

Создание выпадающего списка.

Ввести значения, из которых будет складываться выпадающий список, можно разными способами:

  1. Вручную через «точку-с-запятой» в поле «Источник».
  2. Ввод значений.

  3. Ввести значения заранее. А в качестве источника указать диапазон ячеек со списком.
  4. Проверка вводимых значений.

  5. Назначить имя для диапазона значений и в поле источник вписать это имя.

Имя диапазона.
Раскрывающийся список.

Любой из вариантов даст такой результат.



Выпадающий список в Excel с подстановкой данных

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

  1. Выделяем диапазон для выпадающего списка. В главном меню находим инструмент «Форматировать как таблицу».
  2. Форматировать как таблицу.

  3. Откроются стили. Выбираем любой. Для решения нашей задачи дизайн не имеет значения. Наличие заголовка (шапки) важно. В нашем примере это ячейка А1 со словом «Деревья». То есть нужно выбрать стиль таблицы со строкой заголовка. Получаем следующий вид диапазона:
  4. Выпадающий список.

  5. Ставим курсор в ячейку, где будет находиться выпадающий список. Открываем параметры инструмента «Проверка данных» (выше описан путь). В поле «Источник» прописываем такую функцию:

Ввод значения в источник.

Протестируем. Вот наша таблица со списком на одном листе:

Список и таблица.

Добавим в таблицу новое значение «елка».

Добавлено значение елка.

Теперь удалим значение «береза».

Удалено значение береза.

Осуществить задуманное нам помогла «умная таблица», которая легка «расширяется», меняется.

Теперь сделаем так, чтобы можно было вводить новые значения прямо в ячейку с этим списком. И данные автоматически добавлялись в диапазон.

Ввод данных из списка.

  1. Сформируем именованный диапазон. Путь: «Формулы» — «Диспетчер имен» — «Создать». Вводим уникальное название диапазона – ОК.
  2. Создание имени.

  3. Создаем раскрывающийся список в любой ячейке. Как это сделать, уже известно. Источник – имя диапазона: =деревья.
  4. Снимаем галочки на вкладках «Сообщение для ввода», «Сообщение об ошибке». Если этого не сделать, Excel не позволит нам вводить новые значения.
  5. Сообщение об ошибке.

  6. Вызываем редактор Visual Basic. Для этого щелкаем правой кнопкой мыши по названию листа и переходим по вкладке «Исходный текст». Либо одновременно нажимаем клавиши Alt + F11. Копируем код (только вставьте свои параметры).
  7. Private Sub Worksheet_Change(ByVal Target As Range)
     
    Dim lReply As Long
     
        If Target.Cells.Count > 1 Then Exit Sub
        If Target.Address = "$C$2" Then
         If IsEmpty(Target) Then Exit Sub
           If WorksheetFunction.CountIf(Range("Деревья"), Target) = 0 Then
              lReply = MsgBox("Добавить введенное имя " & _
                             Target & " в выпадающий список?", vbYesNo + vbQuestion)
              If lReply = vbYes Then
                  Range("Деревья").Cells(Range("Деревья").Rows.Count + 1, 1) = Target
              End If
           End If
         End If
    End Sub
     
  8. Сохраняем, установив тип файла «с поддержкой макросов».
  9. Сообщение об ошибке.

  10. Переходим на лист со списком. Вкладка «Разработчик» — «Код» — «Макросы». Сочетание клавиш для быстрого вызова – Alt + F8. Выбираем нужное имя. Нажимаем «Выполнить».

Макрос.

Когда мы введем в пустую ячейку выпадающего списка новое наименование, появится сообщение: «Добавить введенное имя баобаб в выпадающий список?».

Нажмем «Да» и добавиться еще одна строка со значением «баобаб».

Выпадающий список в Excel с данными с другого листа/файла

Когда значения для выпадающего списка расположены на другом листе или в другой книге, стандартный способ не работает. Решить задачу можно с помощью функции ДВССЫЛ: она сформирует правильную ссылку на внешний источник информации.

  1. Делаем активной ячейку, куда хотим поместить раскрывающийся список.
  2. Открываем параметры проверки данных. В поле «Источник» вводим формулу: =ДВССЫЛ(“[Список1.xlsx]Лист1!$A$1:$A$9”).

Имя файла, из которого берется информация для списка, заключено в квадратные скобки. Этот файл должен быть открыт. Если книга с нужными значениями находится в другой папке, нужно указывать путь полностью.

Как сделать зависимые выпадающие списки

Возьмем три именованных диапазона:

Три именованных диапазона.

Это обязательное условие. Выше описано, как сделать обычный список именованным диапазоном (с помощью «Диспетчера имен»). Помним, что имя не может содержать пробелов и знаков препинания.

  1. Создадим первый выпадающий список, куда войдут названия диапазонов.
  2. Список диапазонов.

  3. Когда поставили курсор в поле «Источник», переходим на лист и выделяем попеременно нужные ячейки.
  4. Таблица со списком.

  5. Теперь создадим второй раскрывающийся список. В нем должны отражаться те слова, которые соответствуют выбранному в первом списке названию. Если «Деревья», то «граб», «дуб» и т.д. Вводим в поле «Источник» функцию вида =ДВССЫЛ(E3). E3 – ячейка с именем первого диапазона.
  6. Второй раскрывающийся список.

    Выбор нескольких значений из выпадающего списка Excel

    Бывает, когда из раскрывающегося списка необходимо выбрать сразу несколько элементов. Рассмотрим пути реализации задачи.

    1. Создаем стандартный список с помощью инструмента «Проверка данных». Добавляем в исходный код листа готовый макрос. Как это делать, описано выше. С его помощью справа от выпадающего списка будут добавляться выбранные значения.
    2. Private Sub Worksheet_Change(ByVal Target As Range)
          On Error Resume Next
          If Not Intersect(Target, Range("Е2:Е9")) Is Nothing And Target.Cells.Count = 1 Then
              Application.EnableEvents = False
              If Len(Target.Offset(0, 1)) = 0 Then
                  Target.Offset(0, 1) = Target
              Else
                  Target.End(xlToRight).Offset(0, 1) = Target
              End If
              Target.ClearContents
              Application.EnableEvents = True
          End If
      End Sub
       
    3. Чтобы выбранные значения показывались снизу, вставляем другой код обработчика.
    4. Private Sub Worksheet_Change(ByVal Target As Range)
          On Error Resume Next
          If Not Intersect(Target, Range("Н2:К2")) Is Nothing And Target.Cells.Count = 1 Then
              Application.EnableEvents = False
              If Len(Target.Offset(1, 0)) = 0 Then
                  Target.Offset(1, 0) = Target
              Else
                  Target.End(xlDown).Offset(1, 0) = Target
              End If
              Target.ClearContents
              Application.EnableEvents = True
          End If
      End Sub
       
    5. Чтобы выбираемые значения отображались в одной ячейке, разделенные любым знаком препинания, применим такой модуль.

    6. Private Sub Worksheet_Change(ByVal Target As Range)
          On Error Resume Next
          If Not Intersect(Target, Range("C2:C5")) Is Nothing And Target.Cells.Count = 1 Then
              Application.EnableEvents = False
              newVal = Target
              Application.Undo
              oldval = Target
              If Len(oldval) <> 0 And oldval <> newVal Then
                  Target = Target & "," & newVal
              Else
                  Target = newVal
              End If
              If Len(newVal) = 0 Then Target.ClearContents
              Application.EnableEvents = True
          End If
      End Sub

    Не забываем менять диапазоны на «свои». Списки создаем классическим способом. А всю остальную работу будут делать макросы.

    Выпадающий список с поиском

    1. На вкладке «Разработчик» находим инструмент «Вставить» – «ActiveX». Здесь нам нужна кнопка «Поле со списком» (ориентируемся на всплывающие подсказки).
    2. Вставить ActiveX.

    3. Щелкаем по значку – становится активным «Режим конструктора». Рисуем курсором (он становится «крестиком») небольшой прямоугольник – место будущего списка.
    4. Элемент ActiveX.

    5. Жмем «Свойства» – открывается перечень настроек.
    6. Свойства ActiveX.

    7. Вписываем диапазон в строку ListFillRange (руками). Ячейку, куда будет выводиться выбранное значение – в строку LinkedCell. Для изменения шрифта и размера – Font.

    Скачать пример выпадающего списка

    При вводе первых букв с клавиатуры высвечиваются подходящие элементы. И это далеко не все приятные моменты данного инструмента. Здесь можно настраивать визуальное представление информации, указывать в качестве источника сразу два столбца.

При работе с интерактивной аналитической OLAP сводной таблицей в Excel можно создавать именованные наборы, гибкие функции, которые можно использовать для:

  • Группирование общих наборов элементов, которые можно использовать повторно, даже если эти наборы не присутствуют в данных.

  • Объедините элементы из разных иерархий способами, которые были недоступны в более ранних версиях Excel, которые часто называют асимметричными отчетами.

  • Создайте именованный набор с помощью пользовательских многомерных выражений (MDX), языка запросов для баз данных OLAP, который предоставляет синтаксис вычислений, аналогичный формулам листа.

Если вы не знакомы с языком запросов многомерных выражений (MDX), можно создать именованный набор на основе элементов в строках или столбцах сводной таблицы. Дополнительные сведения о языке запросов многомерных выражений см. в статье «Запрос многомерных данных».

Если вы знакомы с языком запросов многомерных выражений, можно использовать многомерные выражения для создания или изменения именованного набора.

В этой статье

  • Создание именованного набора на основе элементов строк или столбцов

  • Создание именованного набора с помощью многомерных выражений

  • Изменение или удаление именованного набора

Создание именованного набора на основе элементов строк или столбцов

  1. Щелкните сводную таблицу OLAP, для которой нужно создать именованный набор.

    Откроется окно «Инструменты сводной таблицы» с добавлением вкладок «Параметры » и «Конструктор «.

  2. На вкладке «Параметры» в группе «Вычисления» щелкните «Поля», «Элементы», «Наборы &«, а затем выберите команду «Создать набор на основе элементов строк» или «Создать набор на основе элементов столбцов».

    ''Работа со сводными таблицами'': группа ''Вычисления'' на вкладке ''Параметры''

    Отобразится диалоговое окно «Новый набор». При необходимости можно изменить размер этого диалогового окна, перетащив маркер изменения размера в правом нижнем углу диалогового окна.

  3. В поле «Задать имя » введите имя, которое вы хотите использовать для набора.

  4. Чтобы указать строки, которые необходимо включить в именованный набор, выполните одно или несколько из следующих действий:

    • Чтобы удалить строку из списка элементов, щелкните область слева от нужной строки и нажмите кнопку «Удалить строку».

    • Чтобы добавить новую строку в список элементов, щелкните область слева от строки, под которой нужно добавить новую строку, а затем нажмите кнопку «Добавить строку».

    • Чтобы создать копию элемента, щелкните область слева от строки, которую нужно скопировать, а затем нажмите кнопку «Копировать строку».

    • Чтобы переместить элемент в другое место, щелкните область слева от строки, которую вы хотите переместить, а затем с помощью стрелок вверх и вниз переместите его в соответствующее расположение.

  5. По умолчанию элементы из разных уровней будут отображаться в отдельных полях иерархии, а именованный набор заменяет текущие поля в области строк или столбцов.

    • Чтобы отобразить эти элементы в том же поле, что и другие элементы, снимите флажок «Отображаемые элементы с разных уровней » в отдельных полях .

    • Чтобы текущие поля отображались в области строк или столбцов, снимите флажок «Заменить поля в области строк» новым набором или замените поля в области столбцов новым флажком. Набор не будет отображаться в сводной таблице при нажатии кнопки «ОК», но будет доступен в списке полей сводной таблицы.

  6. Нажмите кнопку « ОК», чтобы создать именованный набор.

    Примечания: 

    • Чтобы отменить все действия после закрытия диалогового окна, нажмите кнопку «Отменить» на панели быстрого доступа.

    • К именованным наборам нельзя применить фильтрацию любого типа.

К началу страницы

Создание именованного набора с помощью многомерных выражений

Важно: При использовании многомерных выражений для создания именованного набора или изменения определения многомерных выражений существующего именованного набора любые дополнительные изменения можно выполнить только с помощью многомерных выражений.

  1. Щелкните сводную таблицу OLAP, для которой нужно создать пользовательский именованный набор.

  2. На вкладке «Параметры» в группе «Вычисления» щелкните «Поля», «Элементы», «& Наборы«, а затем выберите пункт «Управление наборами».

    ''Работа со сводными таблицами'': группа ''Вычисления'' на вкладке ''Параметры''

    Отобразится диалоговое окно «Диспетчер наборов». При необходимости можно изменить размер этого диалогового окна, перетащив маркер изменения размера в правом нижнем углу диалогового окна.

  3. Нажмите кнопку «Создать», а затем нажмите кнопку «Создать набор» с помощью многомерных выражений.

  4. В поле «Задать имя » введите имя, которое вы хотите использовать для набора.

  5. Чтобы задать определение многомерных выражений для именованного набора, выполните одно из следующих действий:

    • В поле «Задать определение » введите или вставьте скопированное определение многомерных выражений.

    • На вкладке «Поля и элементы » выберите запись списка полей, которую нужно включить, и нажмите кнопку «Вставить».

      Вы также можете перетащить запись списка полей в поле определения «Задать» или дважды щелкнуть запись списка полей.

      Доступные записи списка полей

      Запись списка полей

      Примеры многомерных выражений, созданных с помощью куба Adventure Works

      измерение

      [Продукт]

      Иерархия атрибутов (включает все элементы)

      [Продукт]. [Категория]

      Уровень иерархии атрибутов (не включает все члены)

      [Продукт]. [Категория]. [Категория]

      Элемент из иерархии атрибутов

      [Продукт]. [Категория].&[4]

      Иерархия пользователей

      [Продукт]. [Категории продуктов]

      Уровень иерархии пользователей

      [Продукт]. [Категории продуктов]. [Категория]

      Элемент из пользовательской иерархии

      [Продукт]. [Категории продуктов]. [Категория].&[4]

      Измерения

      [Меры]. [Интернет-объем продаж]

      Вычисляемая мера

      [Меры]. [Отношение интернета к родительскому продукту]

      Именованный набор

      [Основная группа продуктов]

      Значение ключевого показателя эффективности

      KPIValue («Коэффициент валовой прибыли продукта)

      Цель ключевого показателя эффективности

      KPIGoal(«Product Gross Profit Margin»),

      Состояние ключевого показателя эффективности

      KPIStatus («Валовая прибыль продукта»)

      Тренд ключевого показателя эффективности

      KPITrend(«Валовая прибыль продукта»)

      Свойство member из пользовательской иерархии

      [Продукт]. [Категории продуктов]. Properties(«Class»)

      Свойство member из иерархии атрибутов

      [Продукт]. [Продукт]. Properties(«Class»)

    • На вкладке « Функции» выберите одну или несколько функций из доступных функций многомерных выражений, которые вы хотите использовать, и нажмите кнопку «Вставить». Функции многомерных выражений поддерживаются службами Analysis Services. они не включают функции VBA.

      Аргументы функции помещаются внутри символов шеврона (<< >>). Вы можете заменить аргументы заполнителей, щелкнув их, а затем введя допустимые имена, которые вы хотите использовать.

      Примеры функций многомерных выражений

      ADDCALCULATEDMEMBERS( «Set» )
      AGGREGATE( «Set»[, «Numeric Expression»] )
      «Level»ALLMEMBERS
      «Hierarchy» (Иерархия).ALLMEMBERS
      ANCESTOR( «Member» «Level» )
      ANCESTOR( «Member», «Distance» )
      ANCESTORS( «Member», «Distance» )
      ANCESTORS( «Member», «Level» )
      ASCENDANTS( «Member» )
      AVG( «Set»[, «Числовое выражение»] )
      AXIS( «Числовое выражение» )
      BOTTOMNCOUNT( «Set», «Count»[, «Numeric Expression»] )
      BOTTOMPERCENT( «Set», «Percentage», «Numeric Expression» )
      BOTTOMSUM ( «Set», «Value», «Numeric Expression» ) …

  6. Чтобы протестировать новое определение многомерных выражений, щелкните «Тест многомерных выражений».

  7. По умолчанию элементы из разных уровней будут отображаться в отдельных полях в иерархии, поля упорядочивания и повторяющиеся записи автоматически удаляются (так как в набор добавлены HIERARCHIZE и DISTINCT), а именованный набор заменяет текущие поля в строке или области столбца.

    • Чтобы отобразить эти элементы в том же поле, что и другие элементы, снимите флажок «Отображаемые элементы с разных уровней » в отдельных полях .

    • Чтобы изменить иерархию по умолчанию и сохранить повторяющиеся записи, снимите автоматический порядок и удалите дубликаты из установленного флажка.

    • Чтобы текущие поля отображались в области строк или столбцов, снимите флажок «Заменить поля в области строк» новым набором или замените поля в области столбцов новым флажком. Набор не будет отображаться в сводной таблице при нажатии кнопки «ОК», но будет доступен в списке полей сводной таблицы.

  8. Если вы подключены к кубу SQL Server Analysis Services 2008, по умолчанию создается динамический именованный набор. Этот именованный набор автоматически пересчитывается при каждом обновлении.

    • Чтобы предотвратить пересчет именованного набора при каждом обновлении, снимите флажок «Пересчет» с каждым флажком обновления.

  9. Нажмите кнопку « ОК», чтобы создать именованный набор.

    Примечания: 

    • Чтобы отменить все действия после закрытия диалогового окна, нажмите кнопку «Отменить» на панели быстрого доступа.

    • К именованным наборам нельзя применить фильтрацию любого типа.

К началу страницы

Изменение или удаление именованного набора

  1. Щелкните сводную таблицу OLAP, содержащую именованный набор, который требуется изменить или удалить.

  2. На вкладке «Параметры» в группе «Вычисления» щелкните «Поля», «Элементы», «& Наборы«, а затем выберите пункт «Управление наборами».

    ''Работа со сводными таблицами'': группа ''Вычисления'' на вкладке ''Параметры''

    Отобразится диалоговое окно «Диспетчер наборов». При необходимости можно изменить размер этого диалогового окна, перетащив маркер изменения размера в правом нижнем углу диалогового окна.

  3. Выберите набор, который требуется изменить или удалить.

  4. Выполните одно из указанных ниже действий.

    • Чтобы изменить выбранный именованный набор, нажмите кнопку «Изменить» и внесите необходимые изменения.

    • Чтобы удалить выбранный именованный набор, нажмите кнопку «Удалить», а затем нажмите кнопку «Да «, чтобы подтвердить.

К началу страницы

Распределяем список по наборам

Постановка задачи

Имеем список объектов (например, товаров) с пометкой, к какому набору (корзине) каждый из них относится. Необходимо разложить объекты по своим наборам, сформировав таблицу как на рисунке справа:

Исходные данные и результат

Похожие задачи встречаются на практике весьма часто — в случаях, когда приходится распределять те или иные ресурсы:

  • сотрудников по командам
  • водителей по маршрутам
  • клиентов по менеджерам
  • товары по корзинам и т.д.

В прошлом я уже делал статью и видео о похожей задаче, где мы разбирали как переложить одномерный столбец с данными в двумерную таблицу, но там ситуация была проще, т.к. каждый набор (строка) имел одинаковый размер (число столбцов). Здесь же количество элементов в наборах заранее не известно и не равно друг другу, так что подход придётся изменить.

Чтобы у вас был выбор, давайте разберем несколько способов решения этой задачи.

Способ 1. Вручную через сводную таблицу

Этот способ не предполагает автоматического обновления, поэтому годится только в тех случаях, когда нужно просто, быстро и разово решить такую задачу. Делаем следующее:

1. Ставим активную ячейку в любое место исходной таблицы и строим по ней сводную через Вставка — Сводная таблица (Insert — Pivot Table).

2. В панели полей сводной закидываем поле Корзина в область строк, поле Товары — в область столбцов и в область значений. На выходе должны получить сводную, где на пересечении корзины и товара будет число, если товар входит в заданную корзину:

Строим сводную

3. Выделяем центральную область данных в сводной, не включая итоги (диапазон E3:S8 в примере выше), копируем и вставляем специальной вставкой как значения в любое место листа.

4. В скопированном диапазоне выделим снова только центральный блок с числами без подписей и затем заставим Excel выделить только ячейки с числами, нажав клавишу F5 — кнопка Выделить Константы (F5 — Go to Special — Constants):

Выделяем ячейки с числами

5. Аккуратно, чтобы не сбить получившееся выделение, вводим в первую выделенную ячейку (она будет белой) ссылку на соответствующий ей товар (в нашем случае это будет ссылка на Брокколи), жмём на клавишу F4, чтобы оставить знак доллара только перед цифрой (т.е. закрепить строку) и сочетание клавиш Ctrl+Enter (чтобы ввести аналогичные формулы сразу во все выделенные ячейки):

Вставляем товары по ссылкам

6. Заменяем формулы на значения во всей таблице специальной вставкой.

7. Используя уже знакомый по п.4 трюк с клавишей F5Выделить на этот раз выделяем пустые ячейки и удаляем их со сдвигом влево:

Удаляем пустые ячейки со сдвигом влево

Задача решена.

Способ 2. Обновляемый запрос через Power Query

Этот способ чуть сложнее, но позволит не повторять весь процесс в будущем при изменении исходных данных — достаточно будет просто обновить наш запрос. Будем использовать для решения надстройку Power Query, которую для Excel 2010-2013 можно бесплатно скачать с сайта Microsoft. Начиная с версии Excel 2016, Power Query уже встроена в Microsoft Excel по умолчанию.

Чтобы решить нашу задачу, делаем следующее:

1. Превращаем исходную таблицу в динамическую «умную», чтобы не думать впоследствии о изменении её размеров. Можно использовать команду Главная — Форматировать как таблицу (Home — Format as Table) или сочетание клавиш Ctrl+T.

2. Загружаем полученную «умную» таблицу в Power Query через команду Данные — Из таблицы / диапазона (Data — From Table/Range).

3. Если хотим, чтобы в каждой корзине товары шли по алфавиту — сортируем таблицу сначала по корзинам, а потом по товарам, используя кнопки фильтра в шапке таблицы.

4. Группируем таблицу по корзинам, выбрав на вкладке Преобразование команду Группировать по (Transform — Group by) и задав в качестве операции Все строки (All rows):

Группируем строки по корзинам

Наша исходная таблица «схлопнется» до корзин, содержимое которых будет лежать во вложенных таблицах в последнем столбце:

Готовые группы во вложенных таблицах

5. Выбираем команду Добавление столбца — Настраиваемый столбец (Add Column — Custom column), чтобы добавить к каждой вложенной таблице столбец индекса с порядковым номером строки с помощью М-функции Table.AddIndexColumn:

Добавляем индексный столбец

6. Удаляем все столбцы, кроме последнего, а его содержимое разворачиваем иконкой с двойными стрелками в шапке таблицы. Получим, по сути, первоначальную таблицу, но с добавленной нумерацией товаров внутри каждой корзины:

Развернутая таблица с добавленными индексами в корзинах

7. Добавляем в последнем столбце к нумерации слово «Товар » с помощью команды Преобразование — Формат — Добавить префикс (Transform — Format — Add Prefix).

8. Последний штрих: выполняем свёртку по последнему столбцу с нумерацией с помощью команды Преобразование — Столбец сведения (Transform — Pivot Column):

Выполняем свёртку по столбцу Товар 1,2,3...

Задача решена! Осталось выгрузить полученные результаты обратно в Excel через Главная — Закрыть и загрузить — Закрыть и загрузить в… (Home — Close & Load — Close & Load to…)

Готовый результат запроса

При изменении данных в исходной таблице необходимо будет обновить наш запрос, щёлкнув по результирующей таблице правой кнопкой мыши и выбрав команду Обновить (Refresh) или кнопку Обновить всё на вкладке Данные (Data — Refresh All).

Способ 3. Функции динамических массивов

Этот способ подойдет только тем, у кого установлены последние обновления Office 365, которые добавили к функционалу Excel поддержку динамических массивов и новые функции для работы с ними: СОРТ, УНИК, ФИЛЬТР, ПОСЛЕД и СЛУЧМАССИВ. Если у вас Office 365, но этих функций пока нет — значит соответствующие обновления до вас ещё не добрались (их рассылают волнами и не по всем пользователям сразу), так что нужно немного подождать.

Этот способ хорош, в первую очередь, тем, что при любых изменениях в исходных данных — результаты обновляются «на лету» автоматически. Да и сам процесс не сильно сложен — потребуется всего три формулы.

Поехали:

1. Превращаем исходную таблицу в динамическую «умную», чтобы не думать впоследствии о изменении её размеров. Можно использовать команду Главная — Форматировать как таблицу (Home — Format as Table) или сочетание клавиш Ctrl+T.

2. Формируем отсортированный список уникальных названий корзин из столбца [Корзина] нашей умной таблицы Таблица4 — с помощью функций СОРТ (SORT) и УНИК (UNIQUE), соответственно:

Список корзин с помощью динамических массивов

3. Выводим все товары из каждой корзины с помощью функции ФИЛЬТР (FILTER):

Выводим товары из каждой корзины

По умолчанию, функция ФИЛЬТР выводит результаты в столбец. Чтобы развернуть их по горизонтали — в строку — используем дополнительно функцию транспонирования ТРАНСП (TRANSPOSE).

4. Добавляем шапку для красоты:

Добавляем шапку

Здесь логика такая:

  • Функция СЧЁТЕСЛИ (COUNTIF) вычисляет массив с размерами каждой корзины — это, в нашем случае, будет {4,2,7,1,2}
  • Затем функция МАКС (MAX) определяет в нём самое большое число (7)
  • Новая функция динамических массивов ПОСЛЕД (SEQUENCE) генерирует числовую последовательность от 1 до 7, к которой затем приклеивается слово «Товар » в начало.

Ссылки по теме

  • Динамические массивы — тихая революция в Excel
  • Трансформация столбца в таблицу (формулами и через Power Query)
  • Превращение строк в столбцы и обратно

Блеск и нищета сводных таблиц

Несколько слов о сессионных наборах

Новые возможности построения сводных отчетов

Маленькая ложка дегтя

Заключение

Предыдущая статья цикла была посвящена новым возможностям работы с многомерными пространствами, которые появились в последних версиях программы Microsoft Excel. В ней обсуждался новый инструмент по созданию пользовательских фильтров под названием Срезы данных. В настоящей публикации данная тема будет продолжена — речь пойдет о способах формирования наборов и вычисляемых элементов средствами клиентского приложения.

Несколько слов о сессионных наборах

Как известно, структура любого аналитического отчета и сводной таблицы Microsoft Excel в частности определяется тремя наборами элементов:

  • набор, размещаемый на оси X отчета;
  • набор, размещаемый на оси Y отчета;
  • набор, определяющий измерение среза Slicer Dimension, также называемый Осью фильтров.

В службах Microsoft Analysis Services есть специальная операция, позволяющая значительно упростить создание сложных наборов и при этом повысить общую производительность запросов. Речь идет об именованных наборах (Named Set). Именованные множества, так же как и вычисляемые элементы, могут быть определены в различных областях действия (Scopes).

Для большинства пользователей привычными являются только два режима создания наборов:

добавление в сценарий MDX — такой вариант делает набор видимым для всех запросов, адресованных к кубу;

определение набора как части конкретного MDX-выражения посредством инструкции WITH — в этом случае набор доступен только в контексте заданного выражения.

Однако существует еще один вариант, находящийся в тени первых двух, — определение набора в рамках сессии. На аналитический сервер можно послать директиву следующего вида (выражение 1):

Выражение 1

CREATE SESSION SET [Выручка].[БГД] AS

{

[Компания].[Бета],

[Компания].[Гамма],

[Компания].[Дельта]

}

Выражение 1 предписывает создать в кубе [Выручка] новое множество [БГД], состоящее из трех элементов измерения [Компания]. После выполнения данной инструкции во всех последующих запросах можно ссылаться на множество [БГД] без его дополнительного объявления в операторе Select. Сессионные наборы никак не влияют на структуру исходного аналитического куба и, что особенно важно, не видны другим пользователям системы. Строго говоря, они недоступны даже самому пользователю при обращении к серверу в рамках другой сессии. Но, за исключением ограничений в области видимости, сессионные наборы ничем не отличаются от наборов, которые были добавлены в базовый сценарий MDX.

Перечисленные обстоятельства делают наборы, определенные в рамках сессии, подходящим инструментом для реализации модных в последнее время идей «персонального BI». Действительно, при их использовании можно совершенно не заботиться о том, что они будут кому-то мешать или влиять на общую производительность приложения. Сводные таблицы в рамках двухуровневой архитектуры взаимодействуют с аналитическим сервером через OLE DB-провайдер, на который возложены все обязанности по организации сеансов связи. Потенциально с активными подключениями можно связать пользовательские наборы, однако действующая в Microsoft Excel 2007 объектная модель не позволяла этого делать. В Microsoft Excel 2010 указанный недостаток был наконец исправлен. Более того, управлять сессионными наборами теперь можно непосредственно через графический интерфейс электронной таблицы.

Новые возможности построения сводных отчетов

Все операции с наборами выполняются в специальной форме Диспетчер наборов, которая вызывается командой Управление наборами из раздела Поля, элементы и наборы контекстной ленты Параметры при работе со сводными таблицами.

Добавление нового набора в отчет производится путем нажатия кнопки Создать. При этом пользователю предоставляется возможность выбрать желаемый способ его определения: на основании готовых строк или столбцов уже существующего макета сводного отчета либо посредством MDX-выражения.

Первый подход очень выручает в двух ситуациях: когда требуется быстро определить некоторое фиксированное подмножество элементов одного измерения, а также при создании асимметричных многомерных наборов. Операция по объединению элементов единственного измерения в набор предельно ясна, поэтому мы не будем на ней останавливаться. А вот действия по созданию асимметричных наборов, напротив, заслуживают обсуждения.

Жизненные реалии требуют проводить анализ данных по большему количеству аналитик. Для сводных таблиц это означает необходимость размещать на одной оси отчета элементы сразу из нескольких измерений. Про такие наборы из отчета говорят, что они состоят из кортежей элементов. С формированием наборов такого рода связано множество сложностей технического плана. Исходное решение, предложенное компанией Microsoft, было предельно простым. В «классическом» дизайнере сводных таблиц (до версии 2007 включительно) разрешен единственный способ создания многомерных наборов — посредством операции прямого произведения множеств. Прямое или декартово произведение множеств представляет собой всевозможные упорядоченные пары элементов из двух исходных множеств и всегда является симметричным. Иными словами, если в кубе есть измерение Год с элементами {[2009], [2010]}, а также измерение Сервис, содержащее элементы {[Абонентская плата], [Интернет­доступ]}, то на их базе можно составить единственный набор (набор 1).

Набор 1

{

([2009], [Абонентская плата])

([2009], [Интернет­доступ])

([2010], [Абонентская плата])

([2010], [Интернет­доступ])

}

Проблема заключалась в том, что раньше из набора 1 невозможно было удалить конкретный кортеж, например ([2009], [Интернет­доступ]). В арсенале доступных методов Microsoft Excel 2007 была единственная операция — выставление фильтра, то есть исключение какого-то элемента из базового одномерного набора. Понятно, что такая операция влечет за собой удаление из итогового набора всех кортежей, связанных с данным элементом. Так, если из набора элементов измерения Сервис удалить элемент [Интернет­доступ], то набор 1 потеряет не только кортеж ([2009], [Интернет­доступ]), что, собственно, и было нашей целью, но также кортеж ([2010], [Интернет­доступ]), наличие которого требовалось в выходном наборе.

В Microsoft Excel 2010 из имеющегося симметричного набора можно выделить его произвольное подмножество. Сначала в раздел строк отчета поместим измерения Год и Сервис. Затем в диспетчере наборов выберем опцию Создать набор по строкам… В открывшейся форме будет показан набор — прямое произведение исходных измерений (рис. 1).

Рис. 1. Симметричный набор кортежей

Множество кортежей, представленных на рис. 1, всегда соответствует текущему состоянию набора из раздела строк отчета сводной таблицы. Соответственно при желании кардинальность базового набора можно уменьшить, например сохранив в нем кортежи, относящиеся к 2009 и 2010 годам. Для этого в конструкторе сводных отчетов при помощи фильтров оставим в измерении Год только нужные временные периоды.

После создания симметричного набора можно переходить ко второму этапу — составлению на его базе требуемого асимметричного множества. В распоряжении пользователя есть три операции: удаление либо копирование существующих кортежей, а также добавление новых. Назначение операций вытекает из их названий. От себя добавим, что в наборе можно иметь неограниченное количество дубликатов кортежей. Кроме того, следует учитывать, что фильтрация наборов в макете отчета никак не влияет на добавление новых элементов набора. Даже если вы принудительно ограничили периоды в исходном наборе 2010 и 2011 годами, впоследствии вы всё равно сможете добавить кортеж с любым годом.

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

Наконец, последний элемент формы, заслуживающий пояснительных комментариев, — это кнопка Изменить MDX… Ее нажатие приводит к переводу формы в режим редактирования MDX-выражения, описывающего текущее определение набора. Данную кнопку следует нажимать с осторожностью, так как вернуться обратно в «классический» режим формы уже не получится.

Разобравшись с принципом создания наборов на базе имеющихся строк или столбцов сводной таблицы, перейдем к рассмотрению основного режима построения наборов — посредством MDX-выражений. Для примера создадим простой набор «Услуги_Телефонии» на базе одного измерения Сервис (рис. 2).

Рис. 2. Создание набора на базе элементов одного измерения

Как видно из рис. 2, мастер построения наборов практически идентичен генератору MDX-запросов из среды Microsoft SQL Server Management Studio. Вдвойне приятно, что в нем поддерживаются многие операции, привычные по работе с Management Studio. В частности, в мастере возможно добавление элементов в набор путем перетаскивания объектов методом drag-and-drop из репозитария метаданных, а также вставка функций с уже готовым шаблоном заполнения аргументов. Заметим, что пользователю доступны не только объекты, хранящиеся на стороне сервера, но также наборы, созданные ранее в среде Microsoft Excel.

Для глобальных и сессионных наборов можно задать два правила их дальнейшего поведения. Первый режим: состав элементов набора определяется однократно в момент его создания. Примером такого набора является множество «Услуги_Телефонии», представленное на рис. 2. Очевидно, что множество, состоящее из двух явным образом перечисленных элементов, не будет меняться с течением времени. Но такое условие соблюдается не всегда. Например, при добавлении фактических значений в новый период куба может измениться набор tail(nonempty([Дата].[Месяц].members),3). Представленное выше выражение определяет «хвосты» — последние значения из набора непустых периодов. И эти «хвосты» будут постепенно смещаться в сторону старших дат по мере заполнения куба. Таким образом, со временем будет меняться и сам набор. Справедливым будет возражение, что изменение аналитического пространства является нечастой операцией, оттого вероятность, что она придется на одну сессию, невелика. Соответственно можно не переживать по этому поводу, так как в следующей сессии все наборы будут созданы заново. Это действительно так. Но, кроме приведенного выше случая, существует еще ряд других распространенных ситуаций, в которых состав набора может измениться. Причем часть из них имеет непосредственное отношение к Microsoft Excel и, что самое печальное, приводит к серьезным ошибкам при генерации сводных отчетов.

Поясним смысл сказанного на примере. Для этого определим следующий сессионный набор:

Выражение 2

СREATE SESSION SET [Выручка].[Лучшие_по_году] AS

TopCount( [Компания].[Компания].levels(1).members, 5, ([Measures].[Сумма]))

Выражение 2 очень простое — оно определяет пять лучших по объему продаж компаний. Зададимся вопросом: за какой период были выделены данные компании? Ведь пятерка лидеров может меняться от месяца к месяцу, от года к году и т.д. Набор [Лучшие_по_году] был определен в текущем глобальном контексте. Для каждого измерения выбирался элемент Default Member, который для измерения типа Time равен значению [All]. Соответственно пять компаний из набора [Лучшие_по_году] были определены по результатам продаж за все периоды. Принципиально важным здесь является следующий момент: после того как компании определены, их состав жестко фиксируется и в дальнейшем уже не меняется. Такие наборы первого типа называются Статическими — STATIC. Попробуем разобраться, к чему приводит их применение на практике.

После объявления набора [Лучшие_по_году] последовательно выполним два запроса: выражение 3 и выражение 4.

Выражение 3

select [Лучшие_по_году] on 0

from [Выручка]

Выражение 4

select [Лучшие_по_году] on 0

from (select {[Дата].[Год].&[2009]} on 0 from [Выручка])

Результаты их исполнения представлены на рис. 3 и 4 соответственно.

Рис. 3. Статический набор в глобальном контексте

Рис. 4. Статический набор в контексте конкретного года

Отчет, представленный на рис. 3, выглядит абсолютно логично. В нем приводится суммарная выручка лучших компаний за весь период наблюдений. Но что касается данных, представленных на рис. 4, то нельзя однозначно утверждать, что они соответствуют ожиданиям пользователя. В представленном отчете показаны лучшие компании за весь период, но выручка приводится за 2009 год. Хорошо, если именно такой отчет был истинной целью его составителя. Сводная таблица Microsoft Excel, соответствующая выражению 4, содержит всего две строки (рис. 5).

Рис. 5. Выручка лучших за весь
период компаний в 2009 году

Однако обычно пользователей интересует иное: «требуется выбрать пять лучших компаний по объему продаж именно 2009 года». Практически это означает необходимость заново пересчитать набор [Лучшие_по_году] — на этот раз в контексте выражения 4. А для этого придется отказаться от требования его неизменности во времени.

В службах Microsoft Analysis Services имеется возможность создать набор, который будет пересчитываться для каждого запроса, из которого он вызван. Такие наборы называют Динамическими — DYNAMIC. Соответственно пользователь должен сам выбрать, какой из двух режимов больше отвечает его потребностям и решаемым задачам. Тип набора в MDX-выражении указывается директивой STATIC или DYNAMIC. Так, выражение 2 можно переписать следующим образом (выражение 5).

Выражение 5

СREATE SESSION DYNAMIC SET [Выручка].[Лучшие_по_году] AS

TopCount( [Компания].[Компания].levels(1).members, 5, ([Measures].[Сумма]))

В результате чего при запуске выражения 4 будет возвращаться другой результирующий набор. В нем показываются лучшие компании 2009 года (рис. 6).

Рис. 6. Динамический набор
в контексте конкретного  года

При создании сессионных наборов в среде Microsoft Excel пользователь избавлен от необходимости написания скриптовых команд. Выбор требуемого типа набора выполняется посредством выставления специального флага Пересчитывать набор при каждом обновлении в Диспетчере наборов (см. рис. 2). Поставленный флажок означает, что создаваемый набор должен быть динамическим. Следует отметить, что динамические наборы в среде Microsoft Excel налагают на разработчика определенные ограничения. Если в MDX-выражении, определяющем набор, в качестве аргументов присутствуют динамические наборы, то такой набор должен быть объявлен как динамический.

Маленькая ложка дегтя

Надеюсь, читатели убедились в несомненной полезности нового инструментария от Microsoft. К сожалению, за гибкость, легкость и простоту использования приходится расплачиваться потерей части функциональности.

Во­первых, в наборах, заданных в сессии, запрещено использование операторов, которые исполняются в контексте оператора Select. Для пояснения смысла последней фразы рассмотрим следующий код:

Выражение 6

with set [Лучшие_по_году] as TopCount([Компания].[Компания].[Компания].members,5,([Measures].[Сумма],Axis(0).Item(0)))

select [Дата].[Год].&[2010] on 0,

[Лучшие_по_году] on 1

from [Выручка]

В выражении 6 определяется набор [Лучшие_по_году], состоящий из первых пяти лучших по объему выручки компаний за период, значение которого является первым элементом набора, отложенного по оси Х. Оси добавляются в отчет в порядке их нумерации: сначала ось Х (номер 0), затем ось Y (номер 1). Поэтому к моменту создания набора для оси Y набор для оси X будет уже сформирован. Это, в свою очередь, означает, что к элементам данного набора можно обратиться программно — такая операция выполняется при помощи оператора Axis(0). В частности, инструкция Axis(0).Item(0) выбирает первый элемент из получившегося набора, который затем добавляется в кортеж. Результат исполнения выражения 6 показан на рис. 7.

Рис. 7. Создание набора в контексте оператора Select

Но оператор Axis(0) имеет смысл только внутри запроса: пока не определена ось Х, не может быть создан и набор [Лучшие_по_году]. Набор [Лучшие_по_году] определяется посредством инструкции With, которая является неотъемлемой частью оператора Select. Поэтому о функциях, подобных Axis, говорят, что они выполняются в контексте оператора Select.

Во­вторых, сессионные наборы, создаваемые внутри сводных таблиц Microsoft Excel, не переопределяют глобальный контекст. Вкратце напомним читателям, о чем идет речь. Как уже отмечалось, именованные множества могут быть созданы в трех режимах: глобальном контексте, контексте сессии либо контексте конкретного MDX-запроса. В случае одноименных наборов каждый последующий контекст переопределяет предыдущий.

Например, в сценарий MDX на уровне куба можно добавить именованный набор [Лучшие_по_году] следующего вида:

Выражение 7

CREATE SET CURRENTCUBE.[Лучшие_по_году] AS

TopCount( [Компания].[Компания].levels(1).members, 5, ([Measures].[Сумма], [Дата].[Год].&[2009]))

Как видно из записи выражения 3, исходный набор [Лучшие_по_году] выбирает пять лучших компаний по объемам дохода, полученного в 2009 году. Затем на уровне сессии допускается создать новый экземпляр набора [Лучшие_по_году]:

Выражение 8

CREATE SESSION SET [Выручка].[Лучшие_по_году] AS

TopCount( [Компания].[Компания].levels(1).members, 5, ([Measures].[Сумма], [Дата].[Год].[2010]))

Теперь при обращении к множеству [Лучшие_по_году] из последующих запросов, сделанных в рамках сессии, вместо лучших компаний 2009 года будут выводиться компании — лидеры 2010 года.

Но и это не предел. В конкретном запросе посредством директивы With можно определить еще одну версию набора [Лучшие_по_году].

Выражение 9

with set [Лучшие_по_году] as

TopCount( [Компания].[Компания].levels(1).members, 5, ([Measures].[Сумма], [Дата].[Год].[2011]))

select [Лучшие_по_году] on 0

from [Выручка]

Несмотря на то что в глобальном контексте множество [Лучшие_по_году] определяется по доходам компаний 2009 года, после чего в рамках сессии переопределяется заново на основании доходов 2010 года, в запросе из выражения 5 оно будет рассчитываться на основании своего последнего определения — по выручке 2011 года.

Операция переопределения наборов хороша тем, что носит «каскадный» характер. Иными словами, она синхронно меняет не только сам набор, но и все множества, созданные на его основе. Более того, в аналитическом сервере возможна интересная манипуляция. В базовый сценарий MDX исходный набор добавляется повторно под новым псевдонимом:

Выражение 10

CREATE SET CURRENTCUBE.[Лучшие_по_году_расш] AS

{[Лучшие_по_году]}

Затем в сценарии определяются новые вычисляемые элементы, использующие в качестве входных аргументов набор [Лучшие_по_году_расш]. При такой организации логики вычислений изменение текущего контекста конкретного набора приведет к изменению глобального контекста всех связанных с ним объектов — как наборов, так и вычисляемых элементов.

Что делать, если стандартных возможностей недостаточно

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

Границы временного интервала могут быть как неизменными во времени, так и динамически вычисляемыми в контексте текущего ракурса. В первом варианте мы составляем статический набор — одна из возможных форм его записи представлена выражением 11.

Выражение 11

filter([Компания].[Компания].[Компания].members, ([Measures].[Сумма],[Дата].[Год].&[2011])>([Measures].[Сумма], [Дата].[Год].&[2010]))

Во втором — динамический набор (выражение 12).

Выражение 12

filter( [Компания].[Компания].[Компания].members, ([Measures].[Сумма]) > ([Measures].[Сумма], [Дата].[Год].PrevMember)).

Первый из представленных вариантов фиксирует единственный интервал (2010 г.; 2011 г.), второй позволяет получить все возможные временные диапазоны (2009 г.; 2010 г.), (2010 г.; 2011 г.), (2011 г.; 2012 г.), но только фиксированной длины — 1 год. Нас же интересует универсальное решение, при котором пользователь сможет указать любую начальную и конечную дату (отстоящие друг от друга на произвольное число календарных периодов) и сформировать для них соответствующий набор из клиентов компании. При помощи аналитических выражений такого результата достичь невозможно.

Единственный выход из сложившейся ситуации — исправить саму текстовую строку, содержащую MDX-выражение. Такую операцию всегда можно выполнить вручную при помощи формы управления наборами. Но если ее требуется повторять регулярно, то рутинные действия проще автоматизировать путем написания программного кода на языке VBA.

Работа со сводными таблицами изначально была основана на использовании двух специальных объектов от компании Panorama Software (создателя сводных таблиц) PivotCache и PivotTable. Первый из них представляет собой набор записей, полученных из определенного OLAP-источника, и связан с рабочей книгой в целом. Второй объект— PivotTable — определяет внешнее представление отчета конкретной сводной таблицы и связан с отдельным листом книги. В последних версиях Microsoft Excel (2007 и 2010) вместо объекта PivotCashe можно применять альтернативный вариант — коллекцию Connections. В нашем примере мы будем использовать именно ее.

Активные подключения, связанные с книгой, доступны для просмотра в форме Подключения, которая активируется одноименной командой на ленте Данные (рис. 8).

Рис. 8. Диспетчер активных подключений к книге

Как видно из рис. 8, в нашем примере с книгой ассоциировано единственное подключение Выручка, посредством которого в книге Microsoft Excel показываются данные по доходам отдельных компаний.

Кнопка Управление наборами позволяет добавлять в действующее подключение новые именованные наборы либо редактировать уже имеющиеся. Создадим новый набор «Растущие_Компании» на базе следующего MDX-выражения (выражение 13).

Выражение 13

Filter([Компания].[Компания].[Компания],[Дата].[Дата].[Год].&[2009]<[Дата].[Дата].[Год].&[2011])

После выполнения указанной операции набор «Растущие_Компании» можно использовать во всех сводных отчетах, созданных на основе подключения Выручка. Сформируем теперь новый сводный отчет, в котором на оси Y разместим недавно созданный набор (рис. 9).

Рис. 9. Создание универсального отчета

Напомним, что нам требуется выбрать начальный и конечный периоды, а затем динамически вычислить удовлетворяющее заданному условию множество компаний. Выполним несколько подготовительных операций. На листе с отчетом определим две именованные ячейки Год_Начало и Год_Конец, куда при помощи оператора ВПР() будем подставлять выражение элемента из измерения [Дата] для выбранного пользователем года.

Кроме того, добавим на лист новый управляющий элемент типа «кнопка», который свяжем с процедурой Пересчет_Набора, представленной в листинге 1.

Листинг 1

Sub Пересчет_Набора()

Dim Formula_MDX As String

Formula_MDX = “Filter([Компания].[Компания].[Компания],” + Range(“Год_Начало”).Value + “<” + Range(“Год_Конец”).Value + “)”

With ActiveWorkbook.Connections(«Выручка»).OLEDBConnection

.CalculatedMembers(«[Растущие_Компании]»).Delete

.CalculatedMembers.Add Name:=»[Растущие_Компании]», _

Formula:=Formula_MDX, _

Type:=xlCalculatedSet

End With

ActiveSheet.PivotTables(«Раб_Отчет»).RefreshTable

End Sub

Процедура Пересчет_Набора состоит из трех этапов. Сначала в строковой переменной с именем Formula_MDX составляется новое MDX-выражение, куда подставляются текущие значения из ячеек Год_Начало и Год_Конец.

На втором шаге из подключения Выручка удаляется набор «Растущие_Компании». Затем в коллекцию CalculatedMembers данного подключения добавляется одноименный набор, но с MDX-выражением, заданным ранее определенной строкой Formula_MDX. Кроме того, в момент создания определяется тип нового вычисляемого элемента — xlCalculatedSet.

Заметим, что созданный с помощью процедуры набор получил название набора, который ранее уже был добавлен в сводный отчет. Поэтому нам не требуется изменять его положение в отчете, а для отображения нового множества в сводной таблице ее достаточно просто обновить. Соответствующая команда еActiveSheet.PivotTables(“Раб_Отчет»).RefreshTable завершает нашу процедуру.

Подход, основанный на программном обращении к свойствам объектов, обладает дополнительным преимуществом — с его помощью в отчеты сводных таблиц можно добавлять не только новые сессионные наборы, но и собственные вычисляемые элементы.

Предположим, что нам требуется рассчитать величину прироста дохода текущего периода по сравнению с предыдущим. Данный показатель (назовем его «Прирост») легко вычисляется по формуле:

Выражение 14

([Measures].[Сумма])-([Measures].[Сумма],[Дата].[Дата].PrevMember)

Чтобы на базе выражения 14 сделать новую вычисляемую меру, достаточно немного модифицировать код из листинга 1 (см. листинг 2):

Листинг 2

Sub New_Measure_Member()

With ActiveWorkbook.Connections(«Выручка»).OLEDBConnection

.CalculatedMembers.Add Name:=»[Прирост]», _

Formula:=»([Measures].[Сумма])-([Measures].[Сумма],[Дата].[Дата].PrevMember)», _

Type:=xlCalculatedMember

End With

End Sub

В представленном фрагменте кода, так же как и в программе из листинга 1, производится добавление нового элемента в коллекцию CalculatedMembers объекта Connection. Главное отличие состоит в типе (Type) создаваемого элемента: в первом случае это был xlCalculatedSet (Вычисляемый набор), а во втором — xlCalculatedMember (Вычисляемый элемент). После исполнения процедуры New_Measure_Member() в имеющемся подключении «Выручка» будет создана новая вычисляемая мера «Прирост». Она будет доступна для составления отчетов во всех сводных таблицах, организованных на базе данного подключения.

Похожим образом новые элементы добавляются на оси измерений. Однако в данном случае немного сложнее становится синтаксис объявления имени элемента. Он должен учитывать тот факт, что любое измерение всегда является множеством с заданным на нем отношением порядка. Иными словами, при создании элемента важно указать его место расположения.

Рассмотрим для примера иерархию Дата из группы измерений Дата, представленную четырьмя уровнями: All, Год, Квартал и Месяц. При желании вычисляемый элемент можно расположить на любом из них (рис. 10).

Рис. 10. Размещение вычисляемого элемента СМ на различных уровнях иерархии Дата

Выбор конкретного места в иерархии производится путем указания родительского элемента. Так, если требуется, чтобы вычисляемый элемент СМ присутствовал на уровне Год, его нужно определить следующим образом: [Дата].[Дата].[(All)].[All].[СМ]. Данная запись означает, что элемент СМ должен быть потомком элемента ALL, размещенного на уровне ALL. Принимая во внимание тот факт, что уровень ALL представлен единственным одноименным элементом, исходную запись можно сократить, сделав более компактной, — [Дата].[Дата].[All].[СМ].

Предположим теперь, что нам требуется разместить СМ на следующем уровне — Квартал. Все элементы с данного уровня объединены в группы по отношению к тому или иному году. Если мы хотим, чтобы новый вычисляемый элемент был помещен после кварталов, относящихся к 2009 году, но перед кварталами 2010 года, то должны указать 2009 год в качестве родительского для вычисляемого элемента: [Дата].[Дата].[Год].&[2009].[СМ]. Аналогичным образом следует поступить при размещении элемента на уровне Месяц. Например, чтобы вычисляемый элемент шел после месяцев II квартала 2009 года, его следует определить следующим образом: [Дата].[Дата].[Квартал].&[2009].&[2КВ].[СМ].

Важно понимать, что указание полного пути к элементу­родителю в имени вычисляемого элемента определяет лишь его физическое размещение в иерархии, но сам он при этом не включается в структуру агрегации. Например, элемент [Дата].[Дата].[Год].&[2009].[СМ] хоть и входит в группу кварталов 2009 года, но не является его потомком. Однако для любого вычисляемого элемента определено отношение родства по восходящей линии — его предок на каждом вышестоящем уровне иерархии.

Рис. 11 иллюстрирует данную идею. В MDX-выражении задан вычисляемый элемент СМ, который размещается на уровне Месяц. Затем при помощи оператора Ascendants() успешно формируется набор из элементов-предков элемента СМ. Обратная операция — попытка показать СМ в наборе из потомков элемента верхнего уровня — будет безуспешной.

Рис. 11. Вычисляемый элемент имеет предков на вышестоящих уровнях…

Подобный дуализм в поведении вычисляемых элементов хоть и требует некоторого времени на привыкание, на самом деле весьма практичен. С одной стороны, он исключает необоснованное увеличение агрегационных сумм (вычисляемый элемент не является чьим-либо потомком), а с другой — позволяет использовать функции навигации в многомерном пространстве при составлении MDX-выражений (у вычисляемого элемента есть предки на каждом вышестоящем уровне).

Примером применения данного свойства в работе служит программа, представленная в листинге 3, которая создает в иерархии Дата три вычисляемых элемента с именем СМ. Все элементы определяются одним и тем же MDX-выражением, суммирующим показатели двух первых потомков от прямого предка вычисляемого элемента. Поскольку вычисляемые элементы размещены на разных уровнях иерархии Дата, это приводит к изменению контекста исполнения MDX-выражения, а в конечном счете — к различным значениям показателя СМ в сводном отчете (рис. 12).

Рис. 12. Добавление вычисляемых элементов
в отчет сводной таблицы

Листинг 3

Public Sub New_Dim_Member()

Dim Formula_MDX As String

Formula_MDX = «aggregate({[Дата].[Дата].CurrentMember.Parent.FirstChild,[Дата].[Дата].CurrentMember.Parent.FirstChild.NextMember})»

With ActiveWorkbook.Connections(«Выручка»).OLEDBConnection

.CalculatedMembers.Add Name:=»[Дата].[Дата].[All].[CM]», _

Formula:=Formula_MDX, _

Type:=xlCalculatedMember

.CalculatedMembers.Add Name:=»[Дата].[Дата].[2009].[CM]», _

Formula:=Formula_MDX, _

Type:=xlCalculatedMember

.CalculatedMembers.Add Name:=»[Дата].[Дата].[2009].[2КВ].[CM]», _

Formula:=Formula_MDX, _

Type:=xlCalculatedMember

End With

End Sub

Заключение

В статье были рассмотрены различные способы создания наборов и вычисляемых элементов, доступные в последних версиях программы Microsoft Excel. Описанная функциональность позволяет значительно повысить гибкость разработки прикладных отчетов и реализовать в среде Microsoft Excel модель персонального BI.

КомпьютерПресс 08’2013

Содержание

  • Выполнение выборки
    • Способ 1: применение расширенного автофильтра
    • Способ 2: применение формулы массива
    • Способ 3: выборка по нескольким условиям с помощью формулы
    • Способ 4: случайная выборка
  • Вопросы и ответы

Выборка в Microsoft Excel

При работе с таблицами Excel довольно часто приходится проводить отбор в них по определенному критерию или по нескольким условиям. В программе сделать это можно различными способами при помощи ряда инструментов. Давайте выясним, как произвести выборку в Экселе, используя разнообразные варианты.

Выполнение выборки

Выборка данных состоит в процедуре отбора из общего массива тех результатов, которые удовлетворяют заданным условиям, с последующим выводом их на листе отдельным списком или в исходном диапазоне.

Способ 1: применение расширенного автофильтра

Наиболее простым способом произвести отбор является применение расширенного автофильтра. Рассмотрим, как это сделать на конкретном примере.

  1. Выделяем область на листе, среди данных которой нужно произвести выборку. Во вкладке «Главная» щелкаем по кнопке «Сортировка и фильтр». Она размещается в блоке настроек «Редактирование». В открывшемся после этого списка выполняем щелчок по кнопке «Фильтр».
    Включение фильтра в Microsoft Excel

    Есть возможность поступить и по-другому. Для этого после выделения области на листе перемещаемся во вкладку «Данные». Щелкаем по кнопке «Фильтр», которая размещена на ленте в группе «Сортировка и фильтр».

  2. Включение фильтра через вкладку Данные в Microsoft Excel

  3. После этого действия в шапке таблицы появляются пиктограммы для запуска фильтрования в виде перевернутых острием вниз небольших треугольников на правом краю ячеек. Кликаем по данному значку в заглавии того столбца, по которому желаем произвести выборку. В запустившемся меню переходим по пункту «Текстовые фильтры». Далее выбираем позицию «Настраиваемый фильтр…».
  4. Переход в настраиваемый фильтр в Microsoft Excel

  5. Активируется окно пользовательской фильтрации. В нем можно задать ограничение, по которому будет производиться отбор. В выпадающем списке для столбца содержащего ячейки числового формата, который мы используем для примера, можно выбрать одно из пяти видов условий:
    • равно;
    • не равно;
    • больше;
    • больше или равно;
    • меньше.

    Давайте в качестве примера зададим условие так, чтобы отобрать только значения, по которым сумма выручки превышает 10000 рублей. Устанавливаем переключатель в позицию «Больше». В правое поле вписываем значение «10000». Чтобы произвести выполнение действия, щелкаем по кнопке «OK».

  6. Пользвательский фильтр в Microsoft Excel

  7. Как видим, после фильтрации остались только строчки, в которых сумма выручки превышает 10000 рублей.
  8. Результаты фильтрации в Microsoft Excel

  9. Но в этом же столбце мы можем добавить и второе условие. Для этого опять возвращаемся в окно пользовательской фильтрации. Как видим, в его нижней части есть ещё один переключатель условия и соответствующее ему поле для ввода. Давайте установим теперь верхнюю границу отбора в 15000 рублей. Для этого выставляем переключатель в позицию «Меньше», а в поле справа вписываем значение «15000».

    Кроме того, существует ещё переключатель условий. У него два положения «И» и «ИЛИ». По умолчанию он установлен в первом положении. Это означает, что в выборке останутся только строчки, которые удовлетворяют обоим ограничениям. Если он будет выставлен в положение «ИЛИ», то тогда останутся значения, которые подходят под любое из двух условий. В нашем случае нужно выставить переключатель в положение «И», то есть, оставить данную настройку по умолчанию. После того, как все значения введены, щелкаем по кнопке «OK».

  10. Установка верхней границы в пользовательском фильтре в Microsoft Excel

  11. Теперь в таблице остались только строчки, в которых сумма выручки не меньше 10000 рублей, но не превышает 15000 рублей.
  12. Результаты фильтрации по нижней и верхней границе в Microsoft Excel

  13. Аналогично можно настраивать фильтры и в других столбцах. При этом имеется возможность сохранять также фильтрацию и по предыдущим условиям, которые были заданы в колонках. Итак, посмотрим, как производится отбор с помощью фильтра для ячеек в формате даты. Кликаем по значку фильтрации в соответствующем столбце. Последовательно кликаем по пунктам списка «Фильтр по дате» и «Настраиваемый фильтр».
  14. Переход к фильтрации по дате в Microsoft Excel

  15. Снова запускается окно пользовательского автофильтра. Выполним отбор результатов в таблице с 4 по 6 мая 2016 года включительно. В переключателе выбора условий, как видим, ещё больше вариантов, чем для числового формата. Выбираем позицию «После или равно». В поле справа устанавливаем значение «04.05.2016». В нижнем блоке устанавливаем переключатель в позицию «До или равно». В правом поле вписываем значение «06.05.2016». Переключатель совместимости условий оставляем в положении по умолчанию – «И». Для того, чтобы применить фильтрацию в действии, жмем на кнопку «OK».
  16. Пользвательский фильтр для формата даты в Microsoft Excel

  17. Как видим, наш список ещё больше сократился. Теперь в нем оставлены только строчки, в которых сумма выручки варьируется от 10000 до 15000 рублей за период с 04.05 по 06.05.2016 включительно.
  18. Результаты фильтрации по сумме и дате в Microsoft Excel

  19. Мы можем сбросить фильтрацию в одном из столбцов. Сделаем это для значений выручки. Кликаем по значку автофильтра в соответствующем столбце. В выпадающем списке щелкаем по пункту «Удалить фильтр».
  20. Удаление фильтра с одного из столбцов в Microsoft Excel

    Lumpics.ru

  21. Как видим, после этих действий, выборка по сумме выручки будет отключена, а останется только отбор по датам (с 04.05.2016 по 06.05.2016).
  22. Ограничения только по дате в Microsoft Excel

  23. В данной таблице имеется ещё одна колонка – «Наименование». В ней содержатся данные в текстовом формате. Посмотрим, как сформировать выборку с помощью фильтрации по этим значениям.

    Кликаем по значку фильтра в наименовании столбца. Последовательно переходим по наименованиям списка «Текстовые фильтры» и «Настраиваемый фильтр…».

  24. Переход к текстовой фильтрации в Microsoft Excel

  25. Опять открывается окно пользовательского автофильтра. Давайте сделаем выборку по наименованиям «Картофель» и «Мясо». В первом блоке переключатель условий устанавливаем в позицию «Равно». В поле справа от него вписываем слово «Картофель». Переключатель нижнего блока так же ставим в позицию «Равно». В поле напротив него делаем запись – «Мясо». И вот далее мы выполняем то, чего ранее не делали: устанавливаем переключатель совместимости условий в позицию «ИЛИ». Теперь строчка, содержащая любое из указанных условий, будет выводиться на экран. Щелкаем по кнопке «OK».
  26. Пользвательский фильтр для формата текста в Microsoft Excel

  27. Как видим, в новой выборке существуют ограничения по дате (с 04.05.2016 по 06.05.2016) и по наименованию (картофель и мясо). По сумме выручки ограничений нет.
  28. Ограничения по дате и по наименованию в Microsoft Excel

  29. Полностью удалить фильтр можно теми же способами, которые использовались для его установки. Причем неважно, какой именно способ применялся. Для сброса фильтрации, находясь во вкладке «Данные» щелкаем по кнопке «Фильтр», которая размещена в группе «Сортировка и фильтр».
    Очистка фильтра в Microsoft Excel

    Второй вариант предполагает переход во вкладку «Главная». Там выполняем щелчок на ленте по кнопке «Сортировка и фильтр» в блоке «Редактирование». В активировавшемся списке нажимаем на кнопку «Фильтр».

Очистка фильтра во вкладке Главная в Microsoft Excel

При использовании любого из двух вышеуказанных методов фильтрация будет удалена, а результаты выборки – очищены. То есть, в таблице будет показан весь массив данных, которыми она располагает.

Фильтр сброшен в Microsoft Excel

Урок: Функция автофильтр в Excel

Способ 2: применение формулы массива

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

  1. На том же листе создаем пустую таблицу с такими же наименованиями столбцов в шапке, что и у исходника.
  2. Создание пустой таблицы в Microsoft Excel

  3. Выделяем все пустые ячейки первой колонки новой таблицы. Устанавливаем курсор в строку формул. Как раз сюда будет заноситься формула, производящая выборку по указанным критериям. Отберем строчки, сумма выручки в которых превышает 15000 рублей. В нашем конкретном примере, вводимая формула будет выглядеть следующим образом:

    =ИНДЕКС(A2:A29;НАИМЕНЬШИЙ(ЕСЛИ(15000<=C2:C29;СТРОКА(C2:C29);"");СТРОКА()-СТРОКА($C$1))-СТРОКА($C$1))

    Естественно, в каждом конкретном случае адрес ячеек и диапазонов будет свой. На данном примере можно сопоставить формулу с координатами на иллюстрации и приспособить её для своих нужд.

  4. Ввод формулы в Microsoft Excel

  5. Так как это формула массива, то для того, чтобы применить её в действии, нужно нажимать не кнопку Enter, а сочетание клавиш Ctrl+Shift+Enter. Делаем это.
  6. Формула массива введена в столбец наименований в Microsoft Excel

  7. Выделив второй столбец с датами и установив курсор в строку формул, вводим следующее выражение:

    =ИНДЕКС(B2:B29;НАИМЕНЬШИЙ(ЕСЛИ(15000<=C2:C29;СТРОКА(C2:C29);"");СТРОКА()-СТРОКА($C$1))-СТРОКА($C$1))

    Жмем сочетание клавиш Ctrl+Shift+Enter.

  8. Формула массива введена в столбец даты в Microsoft Excel

  9. Аналогичным образом в столбец с выручкой вписываем формулу следующего содержания:

    =ИНДЕКС(C2:C29;НАИМЕНЬШИЙ(ЕСЛИ(15000<=C2:C29;СТРОКА(C2:C29);"");СТРОКА()-СТРОКА($C$1))-СТРОКА($C$1))

    Опять набираем сочетание клавиш Ctrl+Shift+Enter.

    Во всех трех случаях меняется только первое значение координат, а в остальном формулы полностью идентичны.

  10. Формула массива введена в столбец выручки в Microsoft Excel

  11. Как видим, таблица заполнена данными, но внешний вид её не совсем привлекателен, к тому же, значения даты заполнены в ней некорректно. Нужно исправить эти недостатки. Некорректность даты связана с тем, что формат ячеек соответствующего столбца общий, а нам нужно установить формат даты. Выделяем весь столбец, включая ячейки с ошибками, и кликаем по выделению правой кнопкой мыши. В появившемся списке переходим по пункту «Формат ячейки…».
  12. Переход к форматировани ячеек в Microsoft Excel

  13. В открывшемся окне форматирования открываем вкладку «Число». В блоке «Числовые форматы» выделяем значение «Дата». В правой части окна можно выбрать желаемый тип отображения даты. После того, как настройки выставлены, жмем на кнопку «OK».
  14. Установка формата даты в Microsoft Excel

  15. Теперь дата отображается корректно. Но, как видим, вся нижняя часть таблицы заполнена ячейками, которые содержат ошибочное значение «#ЧИСЛО!». По сути, это те ячейки, данных из выборки для которых не хватило. Более привлекательно было бы, если бы они отображались вообще пустыми. Для этих целей воспользуемся условным форматированием. Выделяем все ячейки таблицы, кроме шапки. Находясь во вкладке «Главная» кликаем по кнопке «Условное форматирование», которая находится в блоке инструментов «Стили». В появившемся списке выбираем пункт «Создать правило…».
  16. Переход к созданию правила в Microsoft Excel

  17. В открывшемся окне выбираем тип правила «Форматировать только ячейки, которые содержат». В первом поле под надписью «Форматировать только ячейки, для которых выполняется следующее условие» выбираем позицию «Ошибки». Далее жмем по кнопке «Формат…».
  18. Переход к выбору формата в Microsoft Excel

  19. В запустившемся окне форматирования переходим во вкладку «Шрифт» и в соответствующем поле выбираем белый цвет. После этих действий щелкаем по кнопке «OK».
  20. Формат ячеек в Microsoft Excel

  21. На кнопку с точно таким же названием жмем после возвращения в окно создания условий.

Создание условия форматирования в Microsoft Excel

Теперь у нас имеется готовая выборка по указанному ограничению в отдельной надлежащим образом оформленной таблице.

Выборка сделана в Microsoft Excel

Урок: Условное форматирование в Excel

Способ 3: выборка по нескольким условиям с помощью формулы

Так же, как и при использовании фильтра, с помощью формулы можно осуществлять выборку по нескольким условиям. Для примера возьмем всю ту же исходную таблицу, а также пустую таблицу, где будут выводиться результаты, с уже выполненным числовым и условным форматированием. Установим первым ограничением нижнюю границу отбора по выручке в 15000 рублей, а вторым условием верхнюю границу в 20000 рублей.

  1. Вписываем в отдельном столбце граничные условия для выборки.
  2. Условия в Microsoft Excel

  3. Как и в предыдущем способе, поочередно выделяем пустые столбцы новой таблицы и вписываем в них соответствующие три формулы. В первый столбец вносим следующее выражение:

    =ИНДЕКС(A2:A29;НАИМЕНЬШИЙ(ЕСЛИ(($D$2=C2:C29);СТРОКА(C2:C29);"");СТРОКА(C2:C29)-СТРОКА($C$1))-СТРОКА($C$1))

    В последующие колонки вписываем точно такие же формулы, только изменив координаты сразу после наименования оператора ИНДЕКС на соответствующие нужным нам столбцам, по аналогии с предыдущим способом.

    Каждый раз после ввода не забываем набирать сочетание клавиш Ctrl+Shift+Enter.

  4. Результат выборки по нескольким условиям в Microsoft Excel

  5. Преимущество данного способа перед предыдущим заключается в том, что если мы захотим поменять границы выборки, то совсем не нужно будет менять саму формулу массива, что само по себе довольно проблематично. Достаточно в колонке условий на листе поменять граничные числа на те, которые нужны пользователю. Результаты отбора тут же автоматически изменятся.

Изменение результатов выборки в Microsoft Excel

Способ 4: случайная выборка

В Экселе с помощью специальной формулы СЛЧИС можно также применять случайный отбор. Его требуется производить в некоторых случаях при работе с большим объемом данных, когда нужно представить общую картину без комплексного анализа всех данных массива.

  1. Слева от таблицы пропускаем один столбец. В ячейке следующего столбца, которая находится напротив первой ячейки с данными таблицы, вписываем формулу:

    =СЛЧИС()

    Эта функция выводит на экран случайное число. Для того, чтобы её активировать, жмем на кнопку ENTER.

  2. Случайное число в Microsoft Excel

  3. Для того, чтобы сделать целый столбец случайных чисел, устанавливаем курсор в нижний правый угол ячейки, которая уже содержит формулу. Появляется маркер заполнения. Протягиваем его вниз с зажатой левой кнопкой мыши параллельно таблице с данными до её конца.
  4. Маркер заполнения в Microsoft Excel

  5. Теперь у нас имеется диапазон ячеек, заполненный случайными числами. Но, он содержит в себе формулу СЛЧИС. Нам же нужно работать с чистыми значениями. Для этого следует выполнить копирование в пустой столбец справа. Выделяем диапазон ячеек со случайными числами. Расположившись во вкладке «Главная», щелкаем по иконке «Копировать» на ленте.
  6. Копирование в Microsoft Excel

  7. Выделяем пустой столбец и кликаем правой кнопкой мыши, вызывая контекстное меню. В группе инструментов «Параметры вставки» выбираем пункт «Значения», изображенный в виде пиктограммы с цифрами.
  8. Вставка в Microsoft Excel

  9. После этого, находясь во вкладке «Главная», кликаем по уже знакомому нам значку «Сортировка и фильтр». В выпадающем списке останавливаем выбор на пункте «Настраиваемая сортировка».
  10. Переход к настраиваемой сортировке в Microsoft Excel

  11. Активируется окно настройки сортировки. Обязательно устанавливаем галочку напротив параметра «Мои данные содержат заголовки», если шапка имеется, а галочки нет. В поле «Сортировать по» указываем наименование того столбца, в котором содержатся скопированные значения случайных чисел. В поле «Сортировка» оставляем настройки по умолчанию. В поле «Порядок» можно выбрать параметр как «По возрастанию», так и «По убыванию». Для случайной выборки это значения не имеет. После того, как настройки произведены, жмем на кнопку «OK».
  12. Настройка сортировки в Microsoft Excel

  13. После этого все значения таблицы выстраиваются в порядке возрастания или убывания случайных чисел. Можно взять любое количество первых строчек из таблицы (5, 10, 12, 15 и т.п.) и их можно будет считать результатом случайной выборки.

Случайная выборка в Microsoft Excel

Урок: Сортировка и фильтрация данных в Excel

Как видим, выборку в таблице Excel можно произвести, как с помощью автофильтра, так и применив специальные формулы. В первом случае результат будет выводиться в исходную таблицу, а во втором – в отдельную область. Имеется возможность производить отбор, как по одному условию, так и по нескольким. Кроме того, можно осуществлять случайную выборку, использовав функцию СЛЧИС.

Еще статьи по данной теме:

Помогла ли Вам статья?

Понравилась статья? Поделить с друзьями:
  • Excel пустое значение ячейки по условию
  • Excel работа с минутами
  • Excel работа с http
  • Excel пустое значение для суммы
  • Excel работа с массивами функция если