Green-sell.info

Новые технологии
48 просмотров
Рейтинг статьи
1 звезда2 звезды3 звезды4 звезды5 звезд
Загрузка...

Древовидная структура в excel

Древовидная структура в excel

На этом шаге мы рассмотрим создание структур рабочего листа.

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

Создать структуру можно одним из способов:

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

  1. Поместить табличный курсор в любую ячейку диапазона.
  2. Выбрать команду Данные | Группа и структура | Создание структуры.

Программа Excel проанализирует формулы из выделенного диапазона и создаст структуру. В зависимости от формул будет создана горизонтальная, вертикальная или смешанная структура.

Если у рабочего листа уже есть структура, то будет задан вопрос, не хотите ли Вы изменить существующую структуру. Щелкните на кнопке Да, чтобы удалить старую и создать новую структуру.

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

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

Чтобы создать группу строк, выделите полностью все строки, которые нужно включить в эту группу, кроме строки, содержащей формулы для подсчета итогов. Затем выберите команду Данные | Группа и структура | Группировать. По мере создания группы Excel будет отображать символы структуры.

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

Можно выбирать также группы групп. Это приведет к созданию многоуровневых структур. Создание таких структур следует начинать с внутренней группы и двигаться изнутри наружу. В случае ошибки при группировке можно произвести разгруппирование с помощью команды Данные | Группа и структура | Разгруппировать

В Excel есть кнопки инструментов, с помощью которых можно ускорить процесс группировки и разгруппировки (рис. 1). Кроме того можно воспользоваться комбинацией клавиш Alt + Shift + для группировки выбранных строк или столбцов, или Alt + Shift + для осуществления операции разгруппирования.

Рис. 1. Инструменты структуризации

Инструмент структуризации содержит следующие кнопки.

Структурирование данных в Excel

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

  1. Для начала отсортируем данные по столбцу Company.
  2. На вкладке Данные (Data) нажмите кнопку Промежуточный итог (Subtotal).
  3. В списке При каждом изменении в (At each change in) выберите Company. Этот столбец мы будем использовать, чтобы структурировать нашу таблицу.
  4. В списке Операция (Use function) выберите Количество (Count).
  5. Поставьте галочку напротив Company (см. рисунок ниже).
  6. Нажмите ОК.Результат:

  • Чтобы свернуть группу ячеек, нажмите знак “” (минус). Можно использовать цифры, чтобы свернуть или развернуть группы по уровню. К примеру, нажмите 2, чтобы отображались только подуровни.
  • Примечание: Нажмите 1, чтобы отображать только итоги, или 3, чтобы отобразить всё.

    Чтобы свернуть группу столбцов, выполните следующие действия:

    1. Выделите столбцы A и B.
    2. На вкладке Данные (Data), кликните по Группировать (Group).
    3. Нажмите на знак ““.Результат:
    4. Чтобы удалить структуру, выделите любую ячейку из набора данных и на вкладке Данные (Data) нажмите кнопку Промежуточный итог (Subtotal). Затем кликните по Убрать все (Remove All).

    Древовидная структура в excel

    В рамках практического изучения ООП написал набор классов, реализующих построение древовидной структуры любого уровня сложности для VBA. Как вы знаете, сам VBA кроме массивов и коллекций (объект Collection ) в готовом виде ничего более не имеет. Пределом мечтаний на данный момент является внешний компонент Dictionary из библиотеки Microsoft Scripting Runtime. В виду этакой скудности приходится городить конструкты типа Dictionary с элементами в виде других Dictionary , либо изобретать свои классы. Чем я и занялся. Теперь, если вам потребуется выстроить дерево, то вы можете воспользоваться моим готовым решением.

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

    PerfectTree: свойства класса

    Моя структура базируется на классе PerfectTree . Данный класс с точки зрения прикладного программиста содержит лишь корень нашего дерева (свойство Root ) и несколько методов, о которых позже. Root – это экземпляр класса Node (узел). Узел Root создаётся одновременно с созданием экземпляра класса PerfectTree . Дальнейший рост дерева идёт от этого корня.

    Node: свойства класса

    Наше дерево представляет собой некое множество узлов, объединенных друг с другом отношениями родитель – потомки. То есть каждый узел имеет ОДНОГО родителя и может иметь потомков (одного или больше), а может и не иметь. Любой узел имеет следующие свойства:

    Чтобы лучше уяснить себе назначение основных свойств узла, поизучайте эту иллюстрацию:

    Nodes: свойства класса

    Последний имеющийся класс – класс Nodes – представляет из себя просто коллекцию узлов. Они могут быть объединены по какому-то признаку, как, например, коллекция в свойстве Children класса Node объединена по принципу одного родителя, либо вы можете создать коллекцию с произвольными узлами.

    PerfectTree: методы класса

    Node: методы класса

    Nodes: методы класса

    Некоторые замечания

    Как грамотно прятать внутреннюю кухню ваших объектов?

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

    Например, возьмём такое свойство класса Node , как Level . Если вы сделаете так:

    То через некоторое время поймёте, что:

    У вас нет защиты от дурака. Кто угодно сможет присвоить неправильное значение свойству Level и сломает всю гармонию вашей структуры, которую, вы вообще-то говоря, обязаны защищать, если пишите компоненты для других. Если же вы будете в обработчике Let городить проверку присваиваемого значения на корректность, то получится слишком сложно и, в конце концов, медленно.

    Осознав вышесказанное, вы захотите закрыть свойство Level на запись из пользовательских модулей. Ведь действительно, при создании нового узла его Level вычисляется из родительского +1 и у пользователя нет никаких практических причин писать в это свойство. Но как это сделать? Вы в начале наивно используете директиву Friend, но она вам никак не поможет с этой проблемой.

    Тогда вы уберёте обработчик Property Let вообще. И через 5 минут столкнётесь с проблемой, что непонятно, как инициировать поле pLevel при создании нового экземпляра объекта Node . «C хрена ли?» — скажете вы. Объясняю: у вас есть родительский Node . Находясь в нём, вы вызываете метод CreateChild , в котором создаёте новый экземпляр класса Node . Но вы не можете передать туда информацию. Вы можете менять только Public или Friend свойства, открытые на запись! А мы как раз хотим от них избавиться. WTF?

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

    Интерфейс класса

    первое, что необходимо сделать, это объявить класс-предок или класс-интерфейс. В нём мы объявляем пустое публичное свойство Let — то есть именно то свойство, которое мы хотели бы скрыть в реализации класса Node.

    Далее при объявлении наших основных классов, в частности Node, мы должны сослаться на наш интерфейс:

    Ну и сам механизм, ради которого всё это затевалось:

    Почему мы имеем право присвоить переменной TempINode значение CreateChild ? Не смотря на то, что это переменные разных классов, класс Node — потомок класса INode , поэтому мы можем переменной родительского класса присвоить ссылку на экземпляр класса-потомка. Наоборот нельзя.

    Далее мы помним, что свойство Level в классе Inode объявлено публичным, поэтому мы легко меняем его, но поскульку в TempINode у нас экземпляр класса Node , то фактически мы меняем свойство pLevel переменной CreateChild . Вот и всё.

    Если вы полезете в код моих классов, то именно этого примера вы не найдёте, но обнаружите массу свойств и методов, которые объявлены в INode , и, используя описанный выше механизм,

    Резюмирую: мы смогли избавиться от метода Let Level на уровне класса Node . Теперь никто не сможет нарушить целостность вашей структуры за счёт присвоения Level -у неправильного значения, а вы избавлены от утомительных проверок. Таким образом всё, что мы хотим спрятать пробрасывается через класс-предок INode . Пользователи не будут создавать экземпляры INode , поэтому нам наплевать, что там «намусорено», нам важно, что всё, что мы хотели скрыть или закрыть на запись, скрыто и закрыто.

    Конвееры

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

    Скачать PerfectTree

    Файл XLSM (версия 0.20 от 22.05.2017)

    ZIP архив с CLS файлами (для импорта классов в ваш файл)

    Принимаются заявки на исправление ошибок и реализацию новой функциональности.

    История изменений

    Версия 0.19 от 19.05.2017. Первая опубликованная версия.

    Версия 0.20 от 22.05.2017. Исправлены ошибки в Node.CreateChild, в Nodes.FilterByName. На отладочную печать теперь выводится Payload. Добавлены методы Nodes.GetArrayOfPayload, Nodes.GetArrayDistinctName.

    Версия 0.21 от 23.05.2017. Пересобрал проект из-за непонятных багов в 0.20.

    Приехали.

    К моему глубокому огорчению, данное решение работает нестабильно. При запуске файла, если нажать кнопку «Создать дерево» на листе Data, то вы скорее всего получите ошибку Type mismatch или произойдёт крах Excel. При этом я почти на 99% уверен, что ошибок в коде нет. Если войти в IDE и начать делать ничего не значащие изменения, перекомпиляции, то код начинает работать. Всё это происходит скорее всего из-за ошибок в реализации ООП в MS Office. Если кто-то сможет мне указать на работающие способы заставить классы работать без существенной переделки архитектуры классов (например, я категорически не хочу отказываться от интерфейсных классов), то буду очень признателен, но что-то мне подсказывает, что этого не случится.

    Группировка данных в Microsoft Excel

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

    Настройка группировки

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

      Переходим во вкладку «Данные».

  • Открывается окно настройки группировки. Как видим по умолчанию установлено, что итоги и наименования по столбцам располагаются справа от них, а по строкам – внизу. Многих пользователей это не устраивает, так как удобнее, когда наименование размещается сверху. Для этого нужно снять галочку с соответствующего пункта. В общем, каждый пользователь может настроить данные параметры под себя. Кроме того, тут же можно включить автоматические стили, установив галочку около данного наименования. После того, как настройки выставлены, кликаем по кнопке «OK».
  • На этом настройка параметров группировки в Эксель завершена.

    Группировка по строкам

    Выполним группировку данных по строкам.

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

    Выделяем строки, которые нужно сгруппировать, кроме итоговой строки. Переходим во вкладку «Данные».

    На ленте в блоке инструментов «Структура» кликаем по кнопке «Группировать».

    На этом создание группы завершено. Для того, чтобы свернуть её достаточно нажать на знак «минус».

    Чтобы заново развернуть группу, нужно нажать на знак «плюс».

    Группировка по столбцам

    Аналогичным образом проводится и группировка по столбцам.

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

    Выделяем ячейки в столбцах, которые собираемся сгруппировать, кроме столбца с наименованием. Кликаем на кнопку «Группировать».

  • В открывшемся окошке на этот раз ставим переключатель в позицию «Столбцы». Жмем на кнопку «OK».
  • Группа готова. Аналогично, как и при группировании столбцов, её можно сворачивать и разворачивать, нажимая на знаки «минус» и «плюс» соответственно.

    Создание вложенных групп

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

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

    Разгруппирование

    Если вы хотите переформатировать или просто удалить группу, то её нужно будет разгруппировать.

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

  • В появившемся окошке выбираем, что именно нам нужно разъединить: строки или столбцы. После этого, жмем на кнопку «OK».
  • Теперь выделенные группы будут расформированы, а структура листа примет свой первоначальный вид.

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

    Отблагодарите автора, поделитесь статьей в социальных сетях.

    Многоуровневая группировка строк

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

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

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

    • бюджетировании — статьи доходов/расходов группируются в блоки (cost centers) или по географическому признаку (страна-край-город)
    • управлении проектами — этапы проектов разбиты обычно на более мелкие подзадачи и действия
    • строительных сметах — похожим образом обычно расписываются расчеты расхода материалов и их стоимости при строительстве
    • и т.д. — дальше придумайте сами.

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

    Нажмите сочетание клавиш ALT+F11, чтобы открыть редактор Visual Basic. В нем выберите в меню команду Insert — Module, чтобы вставить новый модуль и скопируйте туда текст макроса:

    При необходимости, текст можно слегка подкорректировать под ваши особенности, а именно изменить:

    • FIRST_ROW — номер первой строки списка, начиная с которой пойдет группировка. Если у вас шапка не из одной строки или над таблицей есть данные — меняйте.
    • FIRST_COLUMN — номер первого столбца списка, с которого начинается анализ и группировка. Если слева от вашей таблицы есть еще колонки, то эту константу также нужно изменить.
    • NUMBER_OF_LEVELS — количество уровней (столбцов) для анализа. В приведенном выше примере мы хотим проанализировать три первых столбца, поэтому значение этой константы =3

    Важно! Макрос предполагает, что:

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

    Чтобы запустить добавленный макрос для списка на текущем листе, нажмите сочетание клавиш ALT+F8, выберите в списке наш макрос Multilevel_Group и нажмите кнопку Выполнить (Run) .

    Читать еще:  Поиск значения в массиве excel
    Ссылка на основную публикацию
    Adblock
    detector