Андрей VG, спасибо! "К реализации приступить!" ©
VBA динамически скрыть/показать вкладки на ленте (Ribbon)
VBA динамически скрыть/показать вкладки на ленте (Ribbon)
07.08.2019 20:50:07
Добрый день.
Поиск (см. сабж) мне вывел под сотню результаов, но все не о том. Прошу ткнуть носом в правильную тему. Задача: есть надстройка (AddIn), которая содержи две вкладки на Риббоне. Нужно, чтобы при переключении с книги на книгу (событие Application WorkbookActivate или еще что-то), одна из вкладок показывалась, а другая скрывалась. Вкладки, естествено, оформлены через <tab id="premiere_01"... т.д.
Изменено: |
|
|
VBA разные методы автофильтра по дате - работает для ">=", но не работает для "=" (и наоборот)
VBA разные методы автофильтра по дате - работает для ">=", но не работает для "=" (и наоборот)
05.08.2019 13:54:42
sokol92, приветствую!
Итак, после энного количества экспериментов, публикую что получилось, и для себя лично считаю тему автофильтра по дате закрытой. Кстати, занятно, что поиски инфы по Criteria2 вчера привели меня туда же, куда и вас - на excelcampus.com )) И таки да, никаких "трюков" не надо - массив вполне отрабатывает (см.ниже). Интересный факт: функции корректно отрабатывают и на формате даты США, и на формате даты "yyyy-mm-dd'. Специально для проверки этого сделал таблицу, которая состоит из дат в разном формате. В прошлых экспериментах (см. тред выше) не все выходило хорошо с конверсией в разный формат, но это, очевидно, зависело от того, какой способ автофильтра применялся. С правильными методами все работает! Разделил функции на две части - по периоду и по множественным датам. Можно было объединить в одну, но тогда уже совсем неинтуитивный интерфейс получается. Примеры использования - в функции TestFilter. Все вместе - в приложенном файле. До кучи функции возвращают количество отфильтрованных строк, просто на всякий случай.
Теперь пояснения о Criteria2. Как уже сказал выше, меня, как и Владимира, поиск привел на excelcampus. Приведу свой адатированный перевод интересующей на части:
Изменено: |
|||||
|
VBA разные методы автофильтра по дате - работает для ">=", но не работает для "=" (и наоборот)
VBA разные методы автофильтра по дате - работает для ">=", но не работает для "=" (и наоборот)
02.08.2019 20:55:14
Изменено: |
|||||
|
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
Изменено: |
|||||
|
VBA разные методы автофильтра по дате - работает для ">=", но не работает для "=" (и наоборот)
02.08.2019 19:34:28
Когда перебирал варианты работы с датами, пришел в голову один трюк, но увы - с датам он не отработал. А вот с числами - пожалуйста! Причем и на равно, и на диапазон: (и кажется, я наконец не забыл про кириллицу в копипасте)
Изменено: |
|||||
|
VBA разные методы автофильтра по дате - работает для ">=", но не работает для "=" (и наоборот)
VBA разные методы автофильтра по дате - работает для ">=", но не работает для "=" (и наоборот)
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 для изучения результата. Мораль: надежного метода фильтра по условию "равно" (а соответственно, и по несвязанному массиву дат) пока НЕ найдено. Если, конечно, я где-то не ошибся в коде, знатоков приглашаю посмотреть и отругать.
Изменено: |
|||
|
VBA разные методы автофильтра по дате - работает для ">=", но не работает для "=" (и наоборот)
02.08.2019 12:37:38
|
|||
|
VBA разные методы автофильтра по дате - работает для ">=", но не работает для "=" (и наоборот)
VBA разные методы автофильтра по дате - работает для ">=", но не работает для "=" (и наоборот)
02.08.2019 12:26:02
Пока что единственный выход, который работает на всех форматах даты - это вместо "=" использовать двойной критерий ">=" AND "<=" (функция SetDateFilterEqual_HitroTryuk в примере). Главный недостаток этой функции - работать будет только на функции по одной дате, ее нельзя будет использовать для фильтра по массиву несвязанных дат. PS Думаю, что эта тема (про сравнение "равно") не так часто встречается потому, что чаще всего мы дело имеем с диапазоном дат или со сравнениями "до даты", "после даты", а это все отлично работает с форматом даты США.
Изменено: |
|||
|
VBA разные методы автофильтра по дате - работает для ">=", но не работает для "=" (и наоборот)
VBA разные методы автофильтра по дате - работает для ">=", но не работает для "=" (и наоборот)
02.08.2019 11:35:04
Цель: использовать одну и ту же функцию для установки автофильтра по дате (в дальнейшем это должен быть метод класса).
На форуме тема "АФ по дате" поднималась неоднократно (поиск пролопачен), но вот с какой проблемой я столкнулся. Самый популярный совет - при установке фильтра преобразовывать дату в формат даты США, т.е. "m/d/yyyy" - в моем случае работает только с операторами сравнения больше/меньше, но не работает с оператором "="! Два других рекомендованных метода - преобразовывать дату через Format(varDate, "Short Date") или через CStr(varDate). Но с ними тоже фокусы: во-первых, они как раз НЕ работают на операторах сравнения, отличных от "=", а во-вторых, они НЕ работают на формате даты, отличном от "Short Date". Чтобы разобраться окончательно, соорудил испытательный файл (приложен). В нем две одинаковых таблицы, одна с датой в коротком формате, другая с длинным форматом даты. Функция Sub FilterEqualOrMore запускает последовательно автофильтр ">=" на обоих таблицах по всем трем методам (DateToUS, "Short Date", Cstr(), после каждого запуска Stop для просмотра результата). Функция Sub FilterEqual делает тоже самое, но автофильтр по "=". Резюме: 1) DateToUS - работает на ">=", не работает на "=" (верно для обоих форматов даты) 2) "Short Date" и CStr() не работают на ">=", работает на "=" (но только на таблице с датой в кратком формате) Вопрос знатокам: (1) может быть, я что-то упустил, и DateToUS() при некотором шаманстве все же будет работать на сравнение "="? (2) Может быть, есть другой способ унификации такого автофильтра? (3) Как все-таки быть, если формат даты отличен от "краткого" (см. Трюк ниже)? PS Естественно, что возможны два варианта "обмануть Excel": (1) функция SetDateFilter, выставляющая фильтр, просто будет подставлять разные преобразования в зависимости от оператора сравнения ("Short Date" для "равно", DateToUS для других). Но это все равно не будет работать на других форматах даты, кроме краткого. (2) ТРЮК: Пользоваться DateToUS, а если встретится оператор "=", заменять его на двойной, ">=" AND "<=". Работает (см. файл примера), причем на всех форматах даты (проверено), но... (а) так мы не сможем выставить фильтр на НЕСКОЛЬКО несвязанных дат (а хотелось бы для полноты, иногда надо бывает), (б) кто знает, где еще будет подложена свинья? Хотелось бы универсального метода.
Изменено: |
|||
|
Найти значения родительских PivotItem выделенной ячейки
07.05.2019 11:50:51
|
|||
|
Найти значения родительских PivotItem выделенной ячейки
Найти значения родительских 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, должны получиться следующие пары:
Изменено: |
|||
|
Найти значения родительских PivotItem выделенной ячейки
06.05.2019 09:44:50
Андрей VG, спасибо, получилось. Вот код, если кому пригодится. В коллекции cll собираются массивы пар (поле, значение) для каждого "родительского" элемента
Одно НО PivotCell.RowItems работает только для областей значений. Куда копать, чтобы получить то же самое, но для областей строк, к примеру?
Изменено: |
|||
|
Найти значения родительских PivotItem выделенной ячейки
06.05.2019 09:25:52
Спасибо!!! Сейчас покопаем!
|
|||||||
|
Найти значения родительских PivotItem выделенной ячейки
06.05.2019 09:07:29
Итак, задача по файлу-примеру: Выделена ячейка E9. Нужна функция, которая примет два параметра - Range E9 (т.е., ячейку в составе сводной таблицы) и строку "Код заказа" (название одного из полей сводной таблицы). Функция должна вернуть значение "2019-03-01 Fuji" - соответствующее значение указанного поля сводной таблицы для указанной ячейки.
Изменено: |
|||
|
Найти значения родительских PivotItem выделенной ячейки
06.05.2019 08:59:09
А хотелось бы, в идеале, получить значения всех "родительских" полей. То есть, код был бы типа:
Изменено: |
|||||
|