Excel VBA: Фильтр в таблице по выбору в ячейках

Автор Raven2009, 30 мая 2016, 23:48

Raven2009

Доброго времени суток.

Есть в файле ячейки Date (Время) и Time (Дата) с обозначением наверху From (от) и To (по), задуманные для выбора интервала и фильтрации в таблице.

Возможно ли назначить такой код, чтобы при выборе интервала даты и времени в таблице включался бы фильтр по заданным значениям по полям в таблице Date Start и Time Start, при этом по времени достаточно было бы указать только часы?

Этот вопрос по аналогии с базой данных access, где такое было реализовано... Но возможно ли здесь такое?

[вложение удалено администратором]

Администратор

В E11:F11 должен быть формат "Общий" и время нужно вводить так: 18. Это означает 18:00.
Макрос использует автофильтр для скрытия строк.
Фильтрация идёт только по столбцу E, т.к. в нём есть и дата и время и нет смысла фильтровать ещё по столбцу F.
Файл в первом сообщении я заменил на другой; удалил в нём нижние строки и имена, чтобы файл быстрее открывался.

Макрос
Sub Макрос1()

    Dim tbl As Range, date1 As Date, date2 As Date
    Dim lr As Long
   
    '1. Отключение монитора.
    Application.ScreenUpdating = False
    '2. Поиск последней строки по столбцу "B".
    lr = Columns("B").Find(What:="*", LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, _
        SearchDirection:=xlPrevious, MatchCase:=False, SearchFormat:=False).Row
    '3. Удаление автофильтра, чтобы сбросить его.
    ActiveSheet.AutoFilterMode = False
    '4. Vba-именование фрагмента, в котором находится таблица.
    Set tbl = Range("B12:X" & lr)
    '5. Автофильтрация.
    date1 = Range("E10").Value & " " & Range("E11").Value & ":00"
    date2 = Range("F10").Value & " " & Range("F11").Value & ":00"
    date2 = DateAdd("h", 1, date2)
    tbl.AutoFilter Field:=4, Criteria1:=">=" & Format(date1, "yyyy-mm-dd hh:mm:ss"), Operator:=xlAnd, _
        Criteria2:="<" & Format(date2, "yyyy-mm-dd hh:mm:ss")
    '6. Включение монитора.
    Application.ScreenUpdating = True
   
End Sub
[свернуть]

Raven2009

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

Raven2009

Все отлично работает, спасибо вам!
Создал отдельную кнопку. Вот только снять фильтр тоже было бы неплохо. А есть способ снятия этого автофильтра по одной кнопке? Через запись макроса можно такое сделать?

Администратор

В самом экселе нет календаря; только с помощью VBA можно сделать. В VBA есть два варианта.

Вариант 1
Если у вас установлен Access, то на вкладке "Разработчик" (по умолчанию её нет, её нужно отобразить самостоятельно) - Элементы управления - раздел "Элементы ActiveX" - последняя кнопка (Другие элементы управления) - нужно найти календарь. Сам не могу посмотреть, т.к. у меня нет аксесса; кажется этот контрол содержит такой текст в своём названии "Data Picker". Или, насколько я помню, у аксесса два календаря - в конце посмотрите ещё контрол, который написан на русском "Календарь".

Вариант 2
Вам нужно самим сделать форму-календарь (UserForm) или можно скачать из интернета календарь, сделанный какими-то частным программистом (то есть не какой-то фирмой).
Или можно поискать календарь программы "Access", скачать его себе на компьютер и затем зарегистрировать. В этом случае не нужен аксесс.

Затем нужно сделать кнопку для открытия календаря.

Администратор

Вот такой вариант, как можно сбросить автофильтр. Причём этот вариант не только сбрасывает, но ещё и устанавливает автофильтр, если его нет.

Макрос
Sub Макрос1()

    Dim tbl As Range, lr As Long
   
    '1. Отключение монитора.
    Application.ScreenUpdating = False
    '2. Поиск последней строки по столбцу "B".
    lr = Columns("B").Find(What:="*", LookIn:=xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, _
        SearchDirection:=xlPrevious, MatchCase:=False, SearchFormat:=False).Row
    '3. Удаление автофильтра, чтобы сбросить его.
    ActiveSheet.AutoFilterMode = False
    '4. Vba-именование фрагмента, в котором находится таблица.
    Set tbl = Range("B12:X" & lr)
    '5. Просто установка автофильтра без какой-либо фильтрации.
    tbl.AutoFilter
    '6. Включение монитора.
    Application.ScreenUpdating = True
   
End Sub
[свернуть]

Raven2009

Спасибо, оба фильтра отлично работают!