Андрей VG, спасибо! "К реализации приступить!" ©
VBA динамически скрыть/показать вкладки на ленте (Ribbon)
VBA динамически скрыть/показать вкладки на ленте (Ribbon)
VBA разные методы автофильтра по дате - работает для ">=", но не работает для "=" (и наоборот)
|
05.08.2019 14:34:45
|
|||
|
|
|
VBA разные методы автофильтра по дате - работает для ">=", но не работает для "=" (и наоборот)
|
05.08.2019 13:54:42
sokol92, приветствую!
Итак, после энного количества экспериментов, публикую что получилось, и для себя лично считаю тему автофильтра по дате закрытой. Кстати, занятно, что поиски инфы по Criteria2 вчера привели меня туда же, куда и вас - на excelcampus.com )) И таки да, никаких "трюков" не надо - массив вполне отрабатывает (см.ниже). Интересный факт: функции корректно отрабатывают и на формате даты США, и на формате даты "yyyy-mm-dd'. Специально для проверки этого сделал таблицу, которая состоит из дат в разном формате. В прошлых экспериментах (см. тред выше) не все выходило хорошо с конверсией в разный формат, но это, очевидно, зависело от того, какой способ автофильтра применялся. С правильными методами все работает! Разделил функции на две части - по периоду и по множественным датам. Можно было объединить в одну, но тогда уже совсем неинтуитивный интерфейс получается. Примеры использования - в функции TestFilter. Все вместе - в приложенном файле. До кучи функции возвращают количество отфильтрованных строк, просто на всякий случай.
Теперь пояснения о Criteria2. Как уже сказал выше, меня, как и Владимира, поиск привел на excelcampus. Приведу свой адатированный перевод интересующей на части:
Изменено: - 05.08.2019 13:58:43
|
|||||
|
|
|
VBA разные методы автофильтра по дате - работает для ">=", но не работает для "=" (и наоборот)
|
02.08.2019 20:59:04
sokol92, и все-таки, у вас есть версия, почему в вашем (работающем!) варианте нужно (а) делать массив с числом 2 перед датой, и (б) еще и запихивать его в Criteria2 ?
|
|
|
|
|
VBA разные методы автофильтра по дате - работает для ">=", но не работает для "=" (и наоборот)
|
02.08.2019 20:55:14
Изменено: - 02.08.2019 20:56:06
|
|||||
|
|
|
VBA разные методы автофильтра по дате - работает для ">=", но не работает для "=" (и наоборот)
|
02.08.2019 20:45:44
И, как я написал выше, на самом деле вариант с "yyyy-mm-dd" отлично отрабатывает на фильтре по массиву несвязанных дат на всех форматах даты, я ошибся. К сожалению, этот формат не отрабатывает на простом условии "равно одной конкретной дате" (передача массива в фильтр не срабатывает), но этот случай можно отловить ХитрымТрюком из первого сообщения. Других вариантов на фильтр "равно" пока не вижу, если формат даты в столбце не известен заранее. |
|||
|
|
|
VBA разные методы автофильтра по дате - работает для ">=", но не работает для "=" (и наоборот)
|
02.08.2019 20:41:06
Одно НО, но оно большое "но". Дата, отформатированная по "yyyy-mm-dd" не отрабатывает на условии "равно" в столбце с кратким форматом даты ((((((((( Попробовал сделать на единичном значении, на значении в массиве Array(2, Дата) по Criteria2, на простом массиве Array(Дата) по Criteria1 - не работает. Но меня все же мучает вопрос - почему именно Criteria2? И почему такой странный формат массива - "2, значение1, 2, значение2" ?.... Резюме: (1) Если нужен фильтр по несвязанному массиву дат, использовать предложенный sokol92 вариант
(3) Если нужен фильтр по "больше/меньше" - практически любое из преобразований работает (см. сообщение #1) Как-то так. Поправьте, если кто что еще обнаружил. В приложенном файл тест всех упомянутых в треде вариантов. |
|||||
|
|
|
VBA разные методы автофильтра по дате - работает для ">=", но не работает для "=" (и наоборот)
|
02.08.2019 20:06:53
Изменено: - 02.08.2019 20:07:43
|
|||||
|
|
|
VBA разные методы автофильтра по дате - работает для ">=", но не работает для "=" (и наоборот)
|
02.08.2019 19:34:28
Когда перебирал варианты работы с датами, пришел в голову один трюк, но увы - с датам он не отработал. А вот с числами - пожалуйста! Причем и на равно, и на диапазон: (и кажется, я наконец не забыл про кириллицу в копипасте)
Изменено: - 02.08.2019 19:35:54
|
|||||
|
|
|
VBA разные методы автофильтра по дате - работает для ">=", но не работает для "=" (и наоборот)
|
02.08.2019 19:29:04
|
|||
|
|
|
VBA разные методы автофильтра по дате - работает для ">=", но не работает для "=" (и наоборот)
|
02.08.2019 19:16:57
UPD Но я даже успел исправиться до сообщения от модератора!
Изменено: - 05.08.2019 14:35:31
|
|||
|
|
|
VBA разные методы автофильтра по дате - работает для ">=", но не работает для "=" (и наоборот)
|
02.08.2019 19:11:53
sokol92, добрый вечер!
Спасибо за отзыв. Про диапазон - да, спасибо, с ним в общем все нормально, при небольшом допиливании приведенные функции справляются и с диапазоном дат (в пределах своей "компетенции", конечно). О числовом фильтре. Ага, тоже изрядно бесит. Особенно когда хочешь вручную просто найти все значения "цена = 1 950,00". Причем в VBA та же ерунда. Про массив дат и формат yyyy-mm-dd спасибо за наводку, встречал такой совет, только он у меня в каких-то ситуациях не отработал. Хотя это было, возможно, связано и с приступом острой криворукости )). Однако, вот результаты тестового прогона (файл прилагается):
Резюме: Преобразование в формат "yyyy-mm-dd" НЕ РАБОТАЕТ (( Точнее: (1) На операторе сравнения "=" - не отрабатывает на всех форматах даты (2) На операторах больше/меньше - отрабатывает на всех форматах даты. (3) На диапазоне - отрабатывает. Собственно, как и предполагалось - любой метод, который работает на "больше/меньше", сработает и на диапазоне. (4) На массиве значений. А вот тут я ловил челюсть: на таблице с кратким форматом даты отработал как задано (!! единственный пока отработавший метод), а на таблице с длинным форматом отработал не как массив, а как диапазон (от первого значения до второго). Так как мы заранее не знаем, какой будет формат даты в столбце, вывод - не работает ((( Точнее, работает только при определенных условиях. Проверка: запустите Sub FilterTestYMD, после каждого фильтра будет Stop для изучения результата. Мораль: надежного метода фильтра по условию "равно" (а соответственно, и по несвязанному массиву дат) пока НЕ найдено. Если, конечно, я где-то не ошибся в коде, знатоков приглашаю посмотреть и отругать.
Изменено: - 02.08.2019 19:16:11
(Приложен файл)
|
|||
|
|
|
VBA разные методы автофильтра по дате - работает для ">=", но не работает для "=" (и наоборот)
|
02.08.2019 12:37:38
|
|||
|
|
|
VBA разные методы автофильтра по дате - работает для ">=", но не работает для "=" (и наоборот)
|
02.08.2019 12:26:47
|
|||
|
|
|
VBA разные методы автофильтра по дате - работает для ">=", но не работает для "=" (и наоборот)
|
02.08.2019 12:26:02
Пока что единственный выход, который работает на всех форматах даты - это вместо "=" использовать двойной критерий ">=" AND "<=" (функция SetDateFilterEqual_HitroTryuk в примере). Главный недостаток этой функции - работать будет только на функции по одной дате, ее нельзя будет использовать для фильтра по массиву несвязанных дат. PS Думаю, что эта тема (про сравнение "равно") не так часто встречается потому, что чаще всего мы дело имеем с диапазоном дат или со сравнениями "до даты", "после даты", а это все отлично работает с форматом даты США.
Изменено: - 02.08.2019 12:28:20
(дополнено PS)
|
|||
|
|
|
VBA разные методы автофильтра по дате - работает для ">=", но не работает для "=" (и наоборот)
|
02.08.2019 12:20:20
|
|||
|
|
|
VBA разные методы автофильтра по дате - работает для ">=", но не работает для "=" (и наоборот)
Найти значения родительских PivotItem выделенной ячейки
|
07.05.2019 11:50:51
|
|||
|
|
|
Найти значения родительских PivotItem выделенной ячейки
|
07.05.2019 10:48:49
Похоже, перебор значений - действительно наш выбор. Спасибо, коллега! |
|||
|
|
|
Найти значения родительских PivotItem выделенной ячейки
|
07.05.2019 10:47:51
Так в этих семи строках один и тот же код заказа. Это и надо узнать. В этом как раз смысл и заключается (см. выше). Просто надо узнать этот самый код заказа. Правда, ув.Андрей VG говорит, что "в лоб", т.е. через pivot-related properties такого не наковыряешь, но код предложил знатный! |
|||||
|
|
|
Найти значения родительских PivotItem выделенной ячейки
|
06.05.2019 14:18:47
Вот в приложении чуть измененный пример. При дабл клике на ячейке С9 надо выяснить код заказа. Как - я пока не понимаю. PS Прошу прощения у всех за корявость объяснений! (( |
|||||
|
|
|
Найти значения родительских PivotItem выделенной ячейки
|
06.05.2019 14:04:24
|
|||||
|
|
|
Найти значения родительских PivotItem выделенной ячейки
|
06.05.2019 10:42:53
Jack Famous, вопрос только в пункте (1), если я правильно понял мысль. Как это сделать при дабл клике в области строк (в области значений и поиск по RowItems вполне работает).
|
|
|
|
|
Найти значения родительских PivotItem выделенной ячейки
|
06.05.2019 10:12:10
Jack Famous, вот-вот, в #13 как раз и написал...
Тем более, что функция вывода на одном листе всех строк исходной таблицы из любого массива ячеек сводки у меня уже есть |
|
|
|
|
Найти значения родительских PivotItem выделенной ячейки
|
06.05.2019 09:50:26
Jack Famous, спасибо, тоже лыко в строку. Метод тот же самый - PivotCell ячейки. И так же, как у вас в той ветке, возник вопрос - а что же делать, если ячейка не в области значений? RowItems для нее не получить...
Соответственно, немного переформулирую задачу. Пользователь делает дабл клик в любой ячейке сводной таблицы, отлавливаем по событие. Нужно получить (расшифровать) все значения полей сводной таблицы в виде "поле (или Caption)-значение". В приложенном примере, если происходит дабл-клик по ячейке D9, должны получиться следующие пары:
Изменено: - 06.05.2019 12:02:06
|
|||
|
|
|
Найти значения родительских PivotItem выделенной ячейки
|
06.05.2019 09:44:50
Андрей VG, спасибо, получилось. Вот код, если кому пригодится. В коллекции cll собираются массивы пар (поле, значение) для каждого "родительского" элемента
Одно НО
Изменено: - 06.05.2019 09:46:30
(форматирование кода - переводы строк)
|
|||
|
|
|
Найти значения родительских PivotItem выделенной ячейки
|
06.05.2019 09:25:52
Спасибо!!! Сейчас покопаем!
|
|||||||
|
|
|
Найти значения родительских PivotItem выделенной ячейки
|
06.05.2019 09:07:29
Итак, задача по файлу-примеру: Выделена ячейка E9. Нужна функция, которая примет два параметра - Range E9 (т.е., ячейку в составе сводной таблицы) и строку "Код заказа" (название одного из полей сводной таблицы). Функция должна вернуть значение "2019-03-01 Fuji" - соответствующее значение указанного поля сводной таблицы для указанной ячейки.
Изменено: - 06.05.2019 09:11:39
(уточнил формулировку)
|
|||
|
|
|
Найти значения родительских PivotItem выделенной ячейки
|
06.05.2019 08:59:09
А хотелось бы, в идеале, получить значения всех "родительских" полей. То есть, код был бы типа:
Изменено: - 06.05.2019 09:00:32
(слетело форматирование кода)
|
|||||
|
|
|