Excelling at Excel вып.2: Циклы в Excel без VBA

Excelling at Excel вып.2: Циклы в Excel без VBA Microsoft Excel, Excelling at Excel, Цикл, Без макросов, Длиннопост

Немного теории. Циклом называется конструкция, которая некоторое (определяемое) количество раз выполняет заданные действия. Например, Вам нужно перебрать некий массив данных и выделить в нем пустые поля. В программировании это реализуется при помощи циклов. В VBA наиболее частым вариантом является конструкция For i = 0 to n … Next i.

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

Excelling at Excel вып.2: Циклы в Excel без VBA Microsoft Excel, Excelling at Excel, Цикл, Без макросов, Длиннопост

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

Excelling at Excel вып.2: Циклы в Excel без VBA Microsoft Excel, Excelling at Excel, Цикл, Без макросов, Длиннопост

Задача: свести это в одну таблицу для последующей обработки через ту же сводную таблицу. То есть требовалось получить вот такое представление:

Excelling at Excel вып.2: Циклы в Excel без VBA Microsoft Excel, Excelling at Excel, Цикл, Без макросов, Длиннопост

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

И вот здесь и родилось это решение: цикл, а точнее несколько вложенных циклов. То есть нужно получить что-то вроде счетчика, который переключает старший разряд только после того, как достигнут максимум по младшему разряду.

В нашем примере получалось три цикла (в порядке от младшего к старшему): тип исполнителя (цикл 1), статья затрат (цикл 2), проект (цикл 3). Алгоритм выглядит примерно так:

Цикл 3 (проект)

Цикл 2 (статья)

Цикл 1 (тип исполнителя)

Конец цикла 1

Конец цикла 2

Конец цикла 3

Так бы примерно выглядела бы и структура кода VBA для реализации этих трех циклов, но в самом Excel так сделать нельзя. Что же делать?

Давайте еще раз обратимся к сути цикла: это повторение какого либо действия определенное количество раз. Теперь рассмотрим это на примере одного цикла – цикла 1 (тип исполнителя).

Допустим, у нас 4 возможных типа исполнителя. Они у нас на отдельном листе «Тип исполнителя». Соответственно, нам надо перебрать все эти четыре значения по одному. Как? Во-первых, мы должны определить, что их именно 4. Для этого воспользуемся функцией COUNTA (СЧЁТА).

Excelling at Excel вып.2: Циклы в Excel без VBA Microsoft Excel, Excelling at Excel, Цикл, Без макросов, Длиннопост

ВАЖНО! Не забудем вычесть заголовок.

Во-вторых, нам надо оформить перебор значений от 1 до 4. Вернее, до значения полученного из COUNTA (СЧЁТА). Это именно столько «шагов» должен сделать наш цикл.

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

Excelling at Excel вып.2: Циклы в Excel без VBA Microsoft Excel, Excelling at Excel, Цикл, Без макросов, Длиннопост

Получаем бесконечное повторение от 1 до 4. Теперь нам остается получить значение на каждому «шагу» цикла. Это можно сделать при помощи функции OFFSET (СМЕЩ), в которой значения столбца А мы будем использовать в качестве второго параметра (смещение по строкам).

Excelling at Excel вып.2: Циклы в Excel без VBA Microsoft Excel, Excelling at Excel, Цикл, Без макросов, Длиннопост

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


«Если значение типа исполнителя равно количество типов, то

если предыдущее значение статьи равно количеству статей, то 1,

если не равно, то предыдущее значение + 1,

если не равно, то предыдущее значение».


Вот так это выглядит в экселе:

Excelling at Excel вып.2: Циклы в Excel без VBA Microsoft Excel, Excelling at Excel, Цикл, Без макросов, Длиннопост

Цикл 3 (проект) оформляется схожим образом с циклом 2 (статья). Но «триггером» для переключения на новое значение будет уже два условия одновременно: максимальное значение количества статей и максимальное количество типов исполнителей. В формуле выполнение этих двух условий мы оформим через функцию AND (И) равную TRUE (ИСТИНА).

Excelling at Excel вып.2: Циклы в Excel без VBA Microsoft Excel, Excelling at Excel, Цикл, Без макросов, Длиннопост

Осталось только добавить формулы СМЕЩ в ячейки с данными.

Excelling at Excel вып.2: Циклы в Excel без VBA Microsoft Excel, Excelling at Excel, Цикл, Без макросов, Длиннопост

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

Excelling at Excel вып.2: Циклы в Excel без VBA Microsoft Excel, Excelling at Excel, Цикл, Без макросов, Длиннопост

Чтобы этого избежать в формуле в столбце А мы специально вставили в одном из возможных исходов значение «» (пусто), чтобы этим самым «остановить» бесконечный цикл. Теперь при протягивании формулы будут выводиться пустые ячейки. В формул остальных ячеек (в т.ч. со СМЕЩ) следует добавить:

Excelling at Excel вып.2: Циклы в Excel без VBA Microsoft Excel, Excelling at Excel, Цикл, Без макросов, Длиннопост

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

Excelling at Excel вып.2: Циклы в Excel без VBA Microsoft Excel, Excelling at Excel, Цикл, Без макросов, Длиннопост
Вы смотрите срез комментариев. Показать все
Автор поста оценил этот комментарий

Если честно, то меня эксел бесит :)

Просто бррр!..

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

Я прям благоговею перед их создателями, считаю их просто монстрами. И одновременно мне их жалко, жалко их потраченный впустую труд. Что люди не делают, лишь бы не изучать VBA  и SQL :)

И я показываю, им как все эти ужасные формулы на несколько строк переписываются маленьким скриптиком в VBA редакторе.

А если еще на компьютере есть MS Access то, тут вообще возможна истинная магия.

раскрыть ветку (8)
Автор поста оценил этот комментарий

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

раскрыть ветку (5)
Автор поста оценил этот комментарий
Очень я сомневаюсь, что нагромождение всяческих ВПР  и  СЦЕПИТЬ, ЕСЛИОШИБКА, ЧИСЛО

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

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

раскрыть ветку (4)
Автор поста оценил этот комментарий

Проведите эксперимент: объясните человеку формулу СУММЕСЛИ и код VBA с суммированием по условию через цикл. Для меня лично результат очевиден

раскрыть ветку (3)
Автор поста оценил этот комментарий
пример некорректен

Я могу использовать СУММЕСЛИ и в VBA, если знаю о её существовании.

В данном случае в VBA можно использовать функцию SumIf и объяснять человеку придется ровно тоже самое.

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

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

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

Уже тройное вложенное ЕСЛИ вызывает стойкое желание разбить монитор высчитывая эти скобочки и точку с запятой..

А если нужно 10 вложений... ничего кроме желания грязно выругаться это не вызывает. В VBA коде, хоть 15 вложений сделайте простым ctrl+C , ctrl+V

и всё это будет легко читаемо и прозрачно.

Собственно, я ни на чём не настаиваю, это чисто моё мнение. Но когда меня просят, сделать что-нибудь этакое, я по возможности стараюсь это запихнуть в VBA. Подход в стиле : "Нажми на кнопку, получишь результат"

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

раскрыть ветку (2)
Автор поста оценил этот комментарий

Всю Вашу головную боль я понимаю. Но при моделировании в эксель и составлении отчетности неоднократно получал от пользователя/заказчика запрос на формульное прозрачное решение. VBA обывателю кажется черным ящиком.

раскрыть ветку (1)
Автор поста оценил этот комментарий
Наивные люди ;)
Автор поста оценил этот комментарий

Учить этот ваш VBA труд ещё больший. ну всем дано программистами быть. Для меня это все - пытка просто.

раскрыть ветку (1)
Автор поста оценил этот комментарий

я знаю, я сам через это прошел.

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