Страницы: 1
RSS
Автофильтр по дате, на VBA
 
Добрый день!
Помогите чайнику с VBA, пожалуйста.
Есть данные в таблице в с датами. Как посредством VBA установить фильтр на колонку с датами и отфильтровать по конкретному месяцу и году? И подсчитать получившееся количество строк? Например, установить фильтр на май 2023 и подсчитать количество получившихся строк.
Прикрепил файл с колонкой дат.
 
9 шт.
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
написал:
9 шт.
Здорово, но мне надо на VBA.
 
Можно и на VBA, все равно 9 шт. :)
Код
Sub Filtered_Counted()
    Dim oMR As Range
    Set oMR = Range("A1:A" & Cells(Rows.Count, 1).End(xlUp).Row)
    oMR.AutoFilter field:=1, Operator:=xlFilterValues, _
        Criteria2:=Array(1, Replace(Format(DateSerial(2023, 5, 31), "m/dd/yyyy"), ".", "/"))
    MsgBox "Отфильтрованный диапазон содержит " & oMR.SpecialCells(xlCellTypeVisible).Count - 1 & " ячеек"
    oMR.AutoFilter field:=1
End Sub

Изменено: Пытливый - 22.05.2023 16:54:17
Кому решение нужно - тот пример и рисует.
 
Цитата
Crowner написал:
Здорово, но мне надо на VBA.
Можно вообще и без фильтров и без VBA
Код
=СУММПРОИЗВ((A:A>=45047)*(A:A<=45077)*1)

Код
=СЧЁТЕСЛИМН(A:A;">=" & 45047;A:A;"<="&45077)
 
Цитата
написал:
Можно и на VBA, все равно 9 шт.
Код
    [URL=#]?[/URL]       1  2  3  4  5  6  7  8      Sub   Filtered_Counted()          Dim   oMR   As   Range          Set   oMR = Range(  "A1:A"   & Cells(Rows.Count, 1).  End  (xlUp).Row)          oMR.AutoFilter field:=1, Operator:=xlFilterValues, _              Criteria2:=Array(1, Replace(Format(DateSerial(2023, 5, 31),   "m/dd/yyyy"  ),   "."  ,   "/"  ))          MsgBox   "Отфильтрованный диапазон содержит "   & oMR.SpecialCells(xlCellTypeVisible).Count - 1 &   " ячеек"          oMR.AutoFilter field:=1    End   Sub   
 
Спасибо! Почти работает! Помогите доработать ваш код, пожалуйста.
Он прекрасно работает, если я его помещаю в один файл с данными.
Однако мне надо открывать макросом другой файл xlsx и в нем это делать.
Код
Sub ОбработкаДанных()

'Открываем файл
Dim wb As Workbook
Dim ws As Worksheet
Dim hs As Worksheet

Set hs = ThisWorkbook.Sheets("Обработка")
Application.ScreenUpdating = False
Set wb = Workbooks.Open("путь до файла.xlsx", 0, Password:="")
wb.Application.DisplayAlerts = False
wb.Application.AskToUpdateLinks = False

'Ставим фильтр (Это ваш код)
    Dim oMR As Range
    Set oMR = ws.Range("F1:F" & Cells(ws.Rows.Count, 14).End(xlUp).Row)
    oMR.AutoFilter field:=1, Operator:=xlFilterValues, _
        Criteria2:=Array(1, Replace(Format(DateSerial(2022, 4, 1), "m/dd/yyyy"), ".", "/"))
    hs.Range("A1")=oMR.SpecialCells(xlCellTypeVisible).Count - 1
    oMR.AutoFilter field:=1

'Закрываем файл
wb.Close
Application.ScreenUpdating = True
End Sub

На hs.Range("A1") вываливается ошибка Overflow.
Если поменять на MsgBox тоже таже ошибка.
 
Замените
Код
Set hs = ThisWorkbook.Sheets("Обработка")
на
Код
Set hs = wb.Sheets("Обработка")
 
,а как в ваш код добавить второй фильтр в соседний столбец? К примеру B. Чтобы отсортировал не только по датам, но и еще во втором столбце должно быть текстовое значение, например "Внутренний".
 
Код
Set oMR = ws.Range("F1:F" & Cells(ws.Rows.Count, 14).End(xlUp).Row)

ws какой объект содержит? Какой лист?
Кому решение нужно - тот пример и рисует.
 
Пытливый,я когда на форум копировал пропустил строку
ws это лист в том файле, который посторонний открываем и в нем фильтр применяем.
Изменено: Crowner - 23.05.2023 12:29:49
 
Crowner, попробуйте активировать книгу, потом уже фильтр на листе применять.
Кому решение нужно - тот пример и рисует.
 
,так и делаю :) С одним фильтром, как выше показали, все работает. Не могу понять, как добавить второй фильтр на соседний столбец.
 
Вот во вложении пример таблицы, которая грузится макросом. Из нее надо вычислить общее количество строк с 2я критериями:
1.За определенную дату. Например, февраль 2023;
2.Тип аудита, например "Внутренний".

Эти 2 параметра могут меняться произвольно. Т.е. они должны быть присвоены переменным.

И надо это сделать непременно на VBA.
 
Crowner, макрорекордером запишите установку двух фильтров, посмотрите код. Присобачьте к моему, я ж тоже рекордером писал, потом правил слегка.
Кому решение нужно - тот пример и рисует.
 
Приветствую товарищи.
Помогите с кодом VBA.
Необходимо чтобы при фильтрации "убирались" 2 предыдущих месяца от текущего.
Например, текущий месяц Июль 2026, то убрать из фильтра Июнь 2026 и Май 2026.

Использовал такую логику:
1. определить сначала предыдущие месяцы
Range("L1").Formula = "=DATE(YEAR(TODAY()),MONTH(TODAY())-1,1)"
Range("L2").Formula = "=DATE(YEAR(TODAY()),MONTH(TODAY())-2,1)"

2. убрать из фильтра месяцы из ячеек L1 и L2, что оказалось сложнее, чем я думал.
Нужно учитывать формат Range("L1").NumberFormat = "m/d/yyyy" и т.д.

Поюзал интернет, ИИ- не получилось.

Заранее благодарен!
 
Непонятно что нужно
Толи настроить автофильтр по Вашей логике, толи написать макрос для фильтрации?
Может просто отфильтровать все даты настраиваемым фильтром по дате - 'после 30.06.2026'?

Макрорекордер записал такой код для этого фильтра
Код
Sub Макрос1()
'
' Макрос1 Макрос
'

'
    ActiveSheet.Range("$A$7:$M$23").AutoFilter Field:=12, Criteria1:=">30.06.2026", Operator:=xlAnd
End Sub
Согласие есть продукт при полном непротивлении сторон
 
Роман Дементьев, Добрый день. Для вашего примера попробуйте такой макрос.
Код
Sub DateFilter()
  ActiveSheet.Range("$A$7:$M$23").AutoFilter Field:=12, _
    Criteria1:="<" & CDbl(DateSerial(Year(Date), Month(Date) - 2, 1)), _
    Operator:=xlOr, Criteria2:=">=" & CDbl(DateSerial(Year(Date), Month(Date), 1))
End Sub
Цитата
написал:
Нужно учитывать формат
Формат тут не при чем, это только визуальное отображение данных в удобном вам виде.
Изменено: Старичок - 04.07.2026 12:36:38
 
Цитата
написал:
Sub DateFilter()  ActiveSheet.Range("$A$7:$M$23").AutoFilter Field:=12, _    Criteria1:=" =" & CDbl(DateSerial(Year(Date), Month(Date), 1))End Sub
Данный код убирает из фильтрации два предыдущих месяца от текущего- то что нужно, но также убирает фильтр с 01.01.1900 и #Н/Д - эти два критерия должны отображаться при фильтрации (специально указал эти два параметра в приложенной таблице, т.к. в оригинальном файле от данных значений не избавиться).
По итогу, если из фильтра убрать Май 2026 и Июнь 2026, должно отобразиться 8 строк, а при использовании данного кода отображается 4 строки.
Можно еще что то придумать?

Была мысль задействовать доп. столбец, в котором проставлять отметку.
Например фильтруем столбец 12 по Июнь 2026- в доп. столбце ставится отметка- месяц1, фильтруем по Маю 2026- отметка месяц2.
Далее фильтруем доп столбец, оставив только значение "Пусто"....

Изменено: Роман Дементьев - 04.07.2026 14:42:15
 
Цитата
написал:
Макрорекордер записал такой код для этого фильтра
После кода фильтр работает некорректно, результат кода прилагаю.
Изменено: Роман Дементьев - 04.07.2026 14:47:45
 
Цитата
написал:
Непонятно что нужноТоли настроить автофильтр по Вашей логике, толи написать макрос для фильтрации?Может просто отфильтровать все даты настраиваемым фильтром по дате - 'после 30.06.2026'?
Нужен, код, после запуска которого устанавливается фильтр, и отображаются даты без двух предыдущих месяцев от текущего.
Запускаю код в Июле- отображаются все даты кроме Июня и Мая 2026.
Запускаю код в Августе- отображаются все даты кроме Июля и Июня 2026.
 
Роман Дементьев, А так?
Код
Option Explicit

Sub DateFilter()

    Dim dtFrom      As Date
    dtFrom = DateSerial(Year(Date), Month(Date) - 2, 1)

    Dim dtTo        As Date
    dtTo = DateSerial(Year(Date), Month(Date), 1)

    ActiveSheet.Range("$A$7:$M$23").AutoFilter _
            Field:=12, _
            Criteria1:="<" & CLng(dtFrom), _
            Operator:=xlOr, _
            Criteria2:=">=" & CLng(dtTo)
End Sub
 
Цитата
написал:
Роман Дементьев , А так?
Работает, но не до конца.
два предыдущих месяца не отображаются, но и также не отображаются 01.01.1900 и #Н/Д - которые нужно оставить для отображения.
Изменено: Роман Дементьев - 04.07.2026 16:18:16
 
Вариант с доп.столбцом, других нет
Код
Sub Макрос()
    Dim Sh As Worksheet
    Set Sh = ActiveSheet
    If Sh.AutoFilterMode Then Sh.Range("$A$7:$N$8").AutoFilter
    Sh.Range("$A$7:$N$7").AutoFilter
    LastRow = Sh.Cells(Sh.Rows.Count, 1).End(xlUp).Row
    Sh.Range("N8:N" & LastRow) = "=OR(IFERROR(RC[-2]<DATE(YEAR(TODAY()),MONTH(TODAY())-2,1),TRUE),IFERROR(RC[-2]>=DATE(YEAR(TODAY()),MONTH(TODAY()),1),TRUE))"
   Sh.Range("$A$7:$N$" & LastRow).AutoFilter Field:=14, Criteria1:="ИСТИНА"
End Sub
Изменено: doober - 04.07.2026 16:28:28
 
Цитата
написал:
Вариант с доп.столбцом, других нет
Спасибо!!! :)  
 
Вариант фильтрации по массивам критериев
Код
Sub SetFilter()
'ZVI: обновленная версия
  Dim v As Variant, vArr() As Variant, fArr() As Variant
  Dim i As Long, j As Long, fc As Long, dt1 As Date, dt2 As Date, dt3 As Date
  
  Const sRng = "A7:M23" ' Filter range
  fc = 12               ' Filter column number
  
  i = Application.InputBox("Текущий месяц: 1...12", "Условие фильрации", Month(Date), Type:=1)
  If i < 1 Or i > 12 Then
    MsgBox "Отмена ввода месяца", vbInformation, "Отмена действия"
    Exit Sub
  End If
  dt1 = DateSerial(Year(Date), i - 2, 1)
  dt2 = DateSerial(Year(Date), i, 1)
  dt3 = DateSerial(Year(Date), i + 1, 1) ' ограничение, чтобы не отображать следующие месяцы
  
  With ActiveSheet.Range(sRng)
    If .Worksheet.AutoFilterMode Then .Worksheet.AutoFilterMode = False
    vArr = .Columns(fc).Value
    ReDim fArr(1 To 2 * UBound(vArr))
    For i = 2 To UBound(vArr)
      v = vArr(i, 1)
      If IsDate(v) Then
        'If v < dt1 Or v >= dt2 Then ' <-- чтобы отображать и следующие месяцы, вместо строки ниже
        If v < dt1 Or (v >= dt2 And v < dt3) Then
          j = j + 1
          fArr(j) = 1
          j = j + 1
          fArr(j) = Format(v, "mm\/dd\/yyyy")
        End If
      End If
    Next
    If j = 0 Then
      MsgBox "Нет ячеек с требуемым критерием фильтрации", vbExclamation, "Отмена действия"
    Else
      ReDim Preserve fArr(1 To j)
      .AutoFilter Field:=fc, Criteria1:=Array("01.01.1900", "#Н/Д"), Operator:=xlFilterValues, Criteria2:=fArr
    End If
  End With
  
End Sub
Изменено: ZVI - 05.07.2026 13:34:16 (Обновил код, чтобы в автофильтре помечались соответствующие год и месяц))
 
Добрый день. Еще вариант.
 
Старичок, ZVI, всё работает как надо, спасибо огромное за помощь.
Страницы: 1
Читают тему
Наверх