Страницы: 1
RSS
Группировка и копирование строк с одного листа на другой по несколким условиям
 
Добрый вечер, уважаемые форумчане.
Необходим макрос позволяющий решить одну нетривиальную задачу:
Имеется база по поездкам из нескольких сотен строк .
задача макроса переносить и группировать строки на другой лист "группировка"  при совпадении значений  по следующим полям (место отправления, место назначения, дата, время, причем с датой и временем необходимо учесть даты входящие в указанные диапазоны.
Так же необходимо предусмотреть возможность установления совпадения с учетом изменяемого  запаса в несколько часов/дней (ячейки B1,F1 на листе "группировка").
Желательна также возможность фильтра по месту отправления, а также разделение на листе "группировка" строкс одинаковым местом направления но разным местом назначения пустой строкой.
 
Grafff, все вполне тривиально - например, макрос с двумя циклами: по столбцам с проверкой выполнения условий и по строкам. Фильтровать можно и обычными фильтрами, и в сводной таблице, если нужна компаровка. Что именно у вас не получается?
Кстати, тут чуть ли не вообще одной сводной таблицей можно обойтись.
Изменено: Ungrateful - 19.09.2019 19:27:04
 
Проблема в том, что в макросах я не силен, есть опыт корректировки макросов, но не их написания с нуля.
Натыкался на замечательный макрос авто фильтр с мгновенной сортировкой по введенным полям, но это не совсем то, что нужно.
сводная таблица со срезами, также не удобна ввиду большого количества дат и  времени, так же та сводная которую я пытался построить требует дополнительных столбцов  в исходной базе с диапазонами "дат с запасом" о котором я писал в первом сообщении.  
 
Grafff,ну будучи в хорошем настроении сваял вот такое. Оставил все как у вас было, на основе этого и сделал. То есть: вводится только место отправления, по нему идет отбор. Дельту по времени и дате так и не понял к чему привязывать, поскольку у вас нигде эти время и дата не выбираются.
В целом, вы спокойно можете добавить поля для ввода доп информации для поиска, и в макросе вложить в единственный сейчас IF другие с соответствующими проверками. Дату через SerialDate корректировать на дельту.
 
Grafff, решил добить, вот что вышло. Вроде с датами и временем все верно, но не уверен на 100%.
Если поле выборки остается пустым, подразумевается, что нужно выбрать все строки по этому значению.
Дельту по времени и дате сделал +/-. То есть, если стоит дельта 2 часа, а выбрано 10:00, то будет искать с 8:00 по 12:00.
Изменено: Ungrateful - 20.09.2019 00:26:43
 
Огромнейшее спасибо, за труды!
Есть ли возможность приблизительного поиска по месту отправления ( со звёздочками)?

Сейчас буду тестить. Но предварительно все очень круто,
Спасибо, ещё раз!
 
Grafff, чтобы искало приблизительно, поставьте Like в условиях вместо равенства. И ещё UCase или LCase на оба аргумента.
 
Ungrateful, подскажите, пожалуйста, по поводу группировки выдаваемого списка, возможно ли это:
Интересует непосредственно группировка по месту назначения, желательно с разделением групп  друг от друга 1 пустой строкой, а также максимумом  3 строки  в одной группе. т.е. фильтруем по месту отправления, получаем результат, если у нас в результате 5 строк с одним местом отправления и одним местом назначения, то будет 2 группы в одной 3 строки, в другой 2.
Если место отправления 1, а мест назначения несколько,то все они группируются по месту назначения с максимумом в 3 строки и разделяются 1 пустой строкой.  
 
Grafff, как вариант, после выполнения макроса можно сделать сортировку по полю "место назначения", а потом пройти циклом в обратном направлении (step -1) по всем строкам таблицы, поставить счётчик (n=n+1). А дальше условия: если счётчик = 3 или смена места назначения (не равно предыдущему, но тут надо исключить первый цикл), вставляем пустую строку и обнуляем счётчик.
Но вообще пустые строки в таблице - не самый хороший вариант. Лучше уж выделять их цветом.
 
Как-то быстро сделалось, поэтому выкладываю.
В этом варианте, кстати, место отправления и назначения сортируются по части слова - звездочти в начале и в конце строки добавляются в самом коде, в ячейке их не надо вводить. Ну и к регистру не чувствительно.
 
Огромное спасибо, это очень, очень круто, и я не представляю сколько бы у меня ушло на это времени если бы не Вы.
Сейчас столкнулся с такой проблемой: при выборе места отправления: Париж
и дате выезда 14.01.2019 и погрешностью по дате 0 по идее должно выдавать 2 строки: 3 и 6 из листа «выгрузка»

по факту же не выдаёт ни одной строки, если погрешность по дате ставим 1, то выдает одну строку-6. А строку 3 с диапазоном дат с 11.01.2019 по 15.01.2019 куда входит 14.01.2019 не выдает.  
 
Grafff, да, там с датами и временем могут быть косяки, я об этом писал. Как будет время, посмотрю.
 
Grafff, ну, собственно, весь косяк был связан с тем, что у вас в графе с датами кроме самих дат отображалось еще и время. Добавил функцию с чистой датой (PureDate), заодно с помощью нее облагородил минимальную и максимальную даты. Теперь даже если в строке есть время, оно игнорируется. Проверил, фильтруется как надо.
Еще был недочет в разделении строк, его тоже поправил.
 
Ungrateful, спасибо, проверил, но теперь почему-то при заполнении поля погрешность по дате(например 1) выдает ошибку макроса (runtime error 6) и подсвечивает эту строку:   minDepDate = PureDate(DepDate.Value, , , -dDate.Value).

и так и не проходит фокус с Парижем (если указать дату 14.01.2019) -выскакивает только одна строка, вместо двух(я писал об этом ранее).  
Изменено: Grafff - 25.09.2019 00:05:09
 
Grafff, поменяйте в функции все Byte на Integer, там минусовые значения не воспринимались. А с Парижем все правильно выводит, у вас один от 11.01, а второй от 14.01
 
Ungrateful, спасибо!!!
Действительно, после замены на  Integer все за работало.
А вот по поводу Парижа добавлю несколько пояснений:
в колонке 5  указано начало  диапазона возможного выезда,
в колонке 6 конец диапазона возможного выезда:
НомерФИОМесто   отправленияМесто   назначенияДата выезда отДата выезда до
1563080КоляПарижТаганрог11.01.201915.01.2019
соответственно, при вводе в фильтр даты 14.01.2019  которая входит в этот диапазон необходимо, чтобы данная строка тоже копировалась на лист.

Ungrateful, еще при проверке столкнулся со следующим:
при вводе погрешности в 1 день - значения выдаются +-2,
соответсвенно, при вводе погрешности 2 дня выдаются  значения +-3 и так далее.
 
Grafff, а, так это у вас диапазон, я этого не понял ) В коде никак не задействован столбец "Дата выезда до". Я вообще думал, что это дата прибытия "до" точки нащначения. Поменяйте в значении maxDepDate номер столбца с "Дата выезда от" на "Дата выезда до". А если есть вероятность, что верхний предел диапазона может быть пустым, введите новую переменную (например, UDepDate), и перед условием проверки дат, поставьте ещё одно: что если "до" пусто, то UDepDate = ячейке "от", если нет, то равен ячейке "до.
Модет вместе с этим решится и второй вопрос. Погрешность по времени и дате сейчас идёт +/- дельта к значению в столбце "от". То есть, если это 12.01, то при погрешности 1 туда попадет промежуток с 11.01 по 13.01. После того как исправите, дельта минусоваться будет от первой даты и прибавляться ко второй.
 
Ungrateful, спасибо! Постарался сделать это, но что -то не совсем так как необходимо работает. Подскажите что исправить.
Кстати, немножечко подправил код фильтрации дат по аналогии с фильтрацией времени и все заработало как надо( касаемо дат и погрешности).  
 
Доброе утро , Ungrateful, ребята, подскажите что исправить , чтобы при заполненной  колонке 6 дельта по дате  считалась от неё, а при пустой 6, дельта по дате считалась от 5. Если строку прописать в след виде:
if UDepDate = ” ” Then выдаёт ошибку.
Изменено: Grafff - 30.09.2019 10:36:54
 
Вообщем, начал анализировать все возможные варианты пересечения диапазонов дат и вот что вышло:
1. R6>=maxDepDate; R5<=minDepDate
2. R6<=maxDepDate; R5>=minDepDate
3. R6<=maxDepDate; R5<=minDepDate
4. R6>=maxDepDate; R5>=minDepDate

Для каждой вариации подобрал необходимые условия фильтрации:
1. maxDepDate <= PureDate(wsv.Cells(r, 6)) And minDepDate >= PureDate(wsv.Cells(r, 5)) _
2. maxDepDate >= PureDate(wsv.Cells(r, 6)) And minDepDate <= PureDate(wsv.Cells(r, 5)) _
3. minDepDate <= PureDate(wsv.Cells(r, 6)) <= maxDepDate And minDepDate >= PureDate(wsv.Cells(r, 5)) _
4. minDepDate <= PureDate(wsv.Cells(r, 5)) <= maxDepDate And maxDepDate <= PureDate(wsv.Cells(r, 6)) _

Помогите, пожалуйста загнать это в код.
 
С тем что описано в предыдущем сообщении разобрался.
Изменено: Grafff - 30.09.2019 16:37:13
 
Тихо сам с собою...  Можно было открыть предыдущее сообщение,  удалить текст и  там написать,   что вопрос снимается.
Страницы: 1
Наверх