Страницы: 1
RSS
Отбор нужных дат
 
Доброго времени суток. Фантазия закончилась, сдаюсь.
В таблице учёта рабочего времени в области D4:G134 заносятся данные по выработке.
В области AG2:BL8 собирается в упорядоченном виде выработка по дням.
В строке 2 этого массива появляется дата по последнюю, указанную в выработке и происходит отбор выработок. Проблема, дат в этой строке 31 шт., разрыв по дате бывает очень большой и приходится вручную протаскивать на большее количество дат или удалять пустые даты.
Хотелось бы, что-бы в строке 2 появлялись только те даты в которые происходила выработка.
За любую подсказку буду очень благодарен.
 
Здравствуйте.
Попробуйте вариант формулой массива
Код
=ЕСЛИОШИБКА(ИНДЕКС($D$5:$D$150; ПОИСКПОЗ(СУММПРОИЗВ(СЧЁТЕСЛИ($D$5:$D$150; $AG$2:AG$2)); СЧЁТЕСЛИ($D$5:$D$150; "<"&$D$5:$D$150); 0));"")
Изменено: gling - 24.08.2026 09:35:27
 
Код
Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address(0, 0, xlA1) <> "M2" Then Exit Sub
    
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    
    Dim ws As Worksheet
    Set ws = Target.Parent
    
    ' Отключаем фильтр, если он был включен ранее (сбрасываем скрытие строк)
    ws.AutoFilterMode = False
    
    Dim lastRow As Long
    ' Определяем последнюю заполненную строку по столбцу D
    lastRow = ws.Cells(ws.Rows.Count, "D").End(xlUp).Row
    
    If lastRow < 5 Then GoTo Cleanup
    
    If Not IsDate(Target.Value) Then
        ' Если дата не указана, просто выходим (строки уже отображены после сброса фильтра)
        GoTo Cleanup
    End If
    
    ' Диапазон фильтрации: с 4-й строки (заголовок) до последней заполненной
    Dim rngFilter As Range
    Set rngFilter = ws.Range("D4:D" & lastRow)
    ' Массовое скрытие строк за одну операцию с помощью автофильтра
    rngFilter.AutoFilter Field:=1, Criteria1:=Format(Target.Value, "dd.mm.yyyy")

Cleanup:
    Application.ScreenUpdating = True
    Application.EnableEvents = True
End Sub
Цитата
написал:
За любую подсказку буду очень благодарен.
Используйте автофильтр.
 
Спасибо. Накидали. Сейчас буду пробовать.
 
Можно ещё таким натыканным PQ
Код
let
    путь = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content]{0}[Путь],
    лист = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content]{0}[Лист],
    Источник = Excel.Workbook(File.Contents(путь), null, true),
    Лист1_Sheet = Источник{[Item=лист, Kind="Sheet"]}[Data],
    #"Удаленные верхние строки" = Table.Skip(Лист1_Sheet,3),
    #"Повышенные заголовки" = Table.PromoteHeaders(#"Удаленные верхние строки", [PromoteAllScalars=true]),
    #"Другие удаленные столбцы" = Table.SelectColumns(#"Повышенные заголовки",{"Дата", "Имя", "Часы"}),
    #"Строки с примененным фильтром" = Table.SelectRows(#"Другие удаленные столбцы", each ([Дата] <> null and [Дата] <> "Дата")),
    #"Измененный тип" = Table.TransformColumnTypes(#"Строки с примененным фильтром",{{"Дата", type date}, {"Часы", type number}, {"Имя", type text}}),
    #"Сортированные строки" = Table.Sort(#"Измененный тип",{{"Дата", Order.Ascending}}),
    #"Сведенный столбец" = Table.Pivot(Table.TransformColumnTypes(#"Сортированные строки", {{"Дата", type text}}, "ru-RU"), List.Distinct(Table.TransformColumnTypes(#"Сортированные строки", {{"Дата", type text}}, "ru-RU")[Дата]), "Дата", "Часы", List.Sum)
in
    #"Сведенный столбец"
 
Добрый день.
Вариант с двумя коллекциями пользовательских функций.
 
вариант:
=ЕСЛИОШИБКА(ИНДЕКС($D5:$D133;ПОИСКПОЗ(;ИНДЕКС(СЧЁТЕСЛИ($AG2:AG2;$D5:$D133)+ЕОШ(1/$D5:$D133););));"")
=ЕСЛИОШИБКА(ИНДЕКС(E$5:E$133;ПОИСКПОЗ(;ИНДЕКС(СЧЁТЕСЛИ(AG$2:AG2;E$5:E$133)+ЕОШ(1/D$5:D$133););));"")
=ОКРУГЛ(СУММЕСЛИМН($J$5:$J$133;$D$5:$D$133;AH$2;$E$5:$E$133;$AG3);2)
или 2021+:
=ТРАНСП(УНИК(ФИЛЬТР(D5:D133;ЕЧИСЛО(D5:D133))))
=УНИК(ФИЛЬТР(E5:E133;ЕЧИСЛО(D5:D133)))
=ОКРУГЛ(СУММЕСЛИМН(J5:J133;D5:D133;AH12#;E5:E133;AG13#);2)
или сводная
 
Добрый день. Спасибо всем за помощь.
ПавелW, подскажите, пока не понимаю как работает ПОИСКПОЗ(; без первого аргумента?
 
Фрезератор, пожалуйста
Цитата
как работает ПОИСКПОЗ(; без первого аргумента?
Вы суслика первый аргумент видите? - А он есть! )
Фрезератор, во многих (не во всех) функциях некоторые аргументы можно опустить и функция воспримет это как 0 (ноль)
Т.е. в данном случае функция ПОИСКПОЗ() ищет первый попавшийся ноль в массиве из единиц и нулей
 
Спасибо. Просто хотелось разобраться полностью как это работает.  
Страницы: 1
Читают тему
Наверх