319

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

Серия Excelling at Excel

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

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

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

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

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

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

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

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

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

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

Конец цикла 1

Конец цикла 2

Конец цикла 3

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

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

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

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

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

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

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

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


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

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

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

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


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

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

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

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

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

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

6
DELETED
Автор поста оценил этот комментарий

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

Но я их находил, в основном, на пленетеэксель (не сочтите за рекламу).

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

Плюсану, конечно, но жду таки котиков и сисек, ну или байку какую нибудь )))

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

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

И увы, никаких котиков и сисек тут. Только эксель, только хардкор:)

показать ответы
0
Автор поста оценил этот комментарий

Пишем прототип бизнес-игры (экономическая стратегия для 24 пользователей по сети)

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

??? на VBA?? сетевая? браузерная? тогда уже сразу учите PHP. По-хорошему, туда же еще mySQL для работы с БД и javascript для красивой реализации на стороне пользователя. Ну и конечно html с CSS для верстки страниц... сам так запилил своему прошлому работодателю мини-ERP

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

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

WORKDAY(DATE(YEAR("год");MONTH("месяц");"число")=DATE(YEAR("год");MONTH("месяц");"число")

А суммирование рабочих дней и часов делается через СЧЁТЕСЛИ и СУММЕСЛИ, соответственно:

COUNTIF(N25:AC25;"Я") - на массив где Я и В

SUMIF(N25:AC25;"Я";N26:AC26) - массив где Я и В и массив с часами

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

Суммесли не подходит?

показать ответы
0
Автор поста оценил этот комментарий

Подобное вроде решается через индекс, счётесли и поискпоз, без каких-то дополнительных столбцов. Разве нет?

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

Приведите пример по возможности...

0
Автор поста оценил этот комментарий

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

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

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

показать ответы
0
Автор поста оценил этот комментарий

Готовый файл здесь:

https://cloud.mail.ru/public/4XxZ/2QcTbZm6G

0
Автор поста оценил этот комментарий

А где пример файла что бы вы живую поглядеть формулы?

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

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

0
Автор поста оценил этот комментарий

А не легче это все будет делать функциями SUMIFS , COUNTIFS и подобными (сорри, не в курсе как они на русском). Или версия екселя только старая доступна?

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

Уточните, пожалуйста, как Вы хотите использовать COUNTIFS (СЧЕТЕСЛИМН)?

показать ответы
0
Автор поста оценил этот комментарий

Вышел я сегодня значит первый день, взглянул на продукт и был поражен нестандартным подходом к разработке. Да, это реально сетевая игра для запуска по локалке, да, она реально работает на 24 пользователя, и да, она написана на VBA целиком и полностью. Выглядит как набор кнопок и всплывающих окон в экселе, но это реально работает. Обмен данными с сервером происходит через расшаренную на сервере папку с таблицами с данными для каждого конкретного пользователя. Так как это прототип, и у нас уже есть человек, который это все написал и поддерживает (я на нее сегодня чуть ли не молиться начал, когда увидел объем проделанной работы), буду договариваться с начальством о переводе всей этой фигни на нормальный стек технологий и буду учить, соответственно то, что ты написал)

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

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

В любом случае успехов! Но мой совет - не занимайтесь больше такими извращениями!

0
Автор поста оценил этот комментарий
пример некорректен

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

показать ответы
0
Автор поста оценил этот комментарий

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

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

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

0
Автор поста оценил этот комментарий

Да. Немного только шапку изменили. Твоя формула, к сожалению, не работает.

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

@NObiniak, попробуйте формулу массива.

Для получения дневных:

{=SUM(IFERROR(LEFT("массив данных";SEARCH("/";"массив данных")-1)/1;"массив данных"))}

для получения ночных:

=SUM(IFERROR(RIGHT("массив данных";LEN("массив данных")-SEARCH("/";"массив данных"))/1;0))

0
Автор поста оценил этот комментарий

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

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

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

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

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

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

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

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

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

@ArtemTabolin, привет!

Внезапно для решения рабочих вопросов потребовалось резко изучить VBA. Можешь подсказать книги/курсы/видео для поверхностного изучения синтаксиса и общей логики языка?

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

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

В интернете полно ресурсов, где можно почитать.

а так синтаксис довольно-таки простой. Через точку пишете адрес объекта, к которому обращаетесь или к свойству этого объекта. Например, ячейки: Лист.Адрес.Свойство:

Sheets("Лист1").Range("A1").Font

Каждая манипуляция записывается на отдельной строке

Вообще очень помогает макро-рекордер. Он правда часто пишет несколько более пространный код, но это удобно, если не знаешь как делать.

Из конструкций обязательно надо изучить IF ... Then и циклы...

Задача какая?

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

Во-первых, @ArtemTabolin, спасибо - делаешь хорошее дело!

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

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

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

Спасибо.

0
Автор поста оценил этот комментарий

Сложно объяснить, что мне нужно. Есть массив-строка из текста вида 11, 10, 7/5,4/2, 6/5 ,3/2 и так далее. Нужно отдельно посчитать сумму из целых чисел и чисел слева от слеша(дневные часы) и сумму правых от слеша чисел (ночные часы).

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

Попробуйте формулу массива сделать. А содержание типа: сумм если в ячейке есть / то значение левее слеша, если нет, то целиком

0
Автор поста оценил этот комментарий

Нифига не понял. Где можно про это почитать? Я сам "7/5" делаю текстовым, а в сумме возвращаю к числу через СУММЕСЛИ, но хочется чисто математическое решение.

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

У Вас проблема посчитать или данные представить? Если данные изменяемые в конечной ячейке, то формула выглядит к примеру так СУММЕСЛИ(...)&"/"&СУММЕСЛИ(...)

показать ответы
0
Автор поста оценил этот комментарий

Ребят, как табель в экселе посчитать, если руководство требует записей типа 7/5 в одной клетке (7 часов в день, из них 5 ночных)?

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

Легко. Формула выглядит так: [что-то1]&"/"&[что-то2], где вместо [что-то1] и [что-то2] формулы с расчетами или ссылки на ячейки. Например, A1&"/"&A2

показать ответы

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества

Недвижимость и ремонт

Теги

Популярные авторы

Сообщества