Страницы: 1
RSS
Автоматическое выделение периодов в графике работы, Помогите пожалуйста.
 
Добрый день. Есть необходимость в автоматическом заполнении периодов в графике работы. Желаемый результат выделен желтым цветом. Помогите решить проблемку. (находил решение макросом, но мне нужна только формула).
 
Добрый
Алекс2378, какая версия эксель?
 
2016
 
Добрый день!
Доп лист, с кучей доп формул))
Не судите строго, полгода уже формулы не писала, причем вслепую на 2021-м, ну, зато работает... вроде)))
 
Анастасия, спасибо, что уделили время, на данный момент это единственный вариант.
Изменено: Алекс2378 - 24.04.2026 13:56:18
 
Алекс2378,  вот абсолютно то же самое кому то уже делал (слёту не нашел в поиске) с использованием диспетчера имен
сейчас такой вариант накидал если устроит:
формула
 
ПавелW, БЛАГОДАРЮ, это то, что мне нужно.

Проверил на полном файле, все работает как надо. Спасибо.  
Изменено: Алекс2378 - 24.04.2026 18:32:56
 
ПавелW,Добрый день. В процессе эксплуатации вылезла маленькая проблемка, если период составляет например с 1.02.2026  по 2.02.2026  (2 дня подряд) тогда между ними не ставится дефис. Возможно ли это исправить, Заранее благодарю.
 
Можно ещё пользовательской функцией
Код
Function Период_работы(rng_1 As Range, rng_2 As Range, atr As String) As String
    Dim arr_1, arr_2, sd As Object, m As Integer, dn, n As Integer
    arr_1 = rng_1.Value: arr_2 = rng_2.Value
    m = -1
    For n = 1 To UBound(arr_1, 2)
        If arr_1(1, n) = atr Then
            If m = -1 Then
                txt = txt & ", " & arr_2(1, n)
                dn = ""
            ElseIf m = n - 1 Then
                dn = arr_2(1, n)
            End If
            m = n
            If n = UBound(arr_1, 2) Then
                If dn <> "" Then txt = txt & " - " & dn
            End If
        Else
            If dn <> "" Then txt = txt & " - " & dn
            m = -1: dn = ""
        End If
    Next
    Период_работы = Mid(txt, 3)
End Function
 
Цитата
Алекс2378^   вылезла маленькая проблемка ... не ставится дефис ... 2 дня подряд
формула
 
Вариант с дополнительными столбцами.
 
Формула очень громоздкая и сложная для восприятия.

Можно написать это в макросе:

Код
Function ProcessDates(rowData As Range, dateRow As Range, checkValue As Variant) As Variant
    Dim result As String
    Dim i As Long, cols As Long
    
    Dim seriesStartCol As Long 
    Dim inSeries As Boolean   
    
    ' --- Инициализация ---
    cols = rowData.Columns.Count
    result = ""
    inSeries = False
    
    ' --- Основной цикл по всем столбцам ---
    For i = 1 To cols
        ' Проверяем текущую ячейку в строке данных
        If rowData.Cells(1, i).Value = checkValue Then
            
            ' Если не находимся внутри, значит это её начало
            If Not inSeries Then
                inSeries = True
                seriesStartCol = i ' Запоминаем, где началась
            End If
            
            ' --- Проверка: является ли эта ячейка КОНЦОМ? ---
            ' Условие 1: Это последняя ячейка в диапазоне?
            ' Условие 2: Следующая ячейка (если она есть)
            If (i = cols) Or (rowData.Cells(1, i + 1).Value <> checkValue) Then
                
                ' Вычисляем длину (сколько ячеек подряд подходило)
                Dim seriesLength As Long
                seriesLength = i - seriesStartCol + 1
                
                ' --- Формируем вывод в зависимости от длины ---
                If seriesLength = 1 Then
                    ' Если из одной ячейки - выводим только дату
                    result = result & " " & Format(dateRow.Cells(1, i).Value, "dd.mm.yyyy") & ";"
                Else
                    ' Если длинная - выводим интервал "С - ПО"
                    result = result & " " & Format(dateRow.Cells(1, seriesStartCol).Value, "dd.mm.yyyy")
                    result = result & " - " & Format(dateRow.Cells(1, i).Value, "dd.mm.yyyy") & ";"
                End If
                
                ' Сбрасываем флаг, чтобы начать поиск новой
                inSeries = False
                
            End If
            
        End If
    Next i

    ' --- Финальная обработка строки ---
    If Len(result) > 0 Then
        result = Trim(result) ' Убираем пробел в начале
        If Right(result, 1) = ";" Then
            result = Left(result, Len(result) - 1) ' Убираем точку с запятой в конце
        End If
    End If

    ProcessDates = result

End Function


В ячейке напишите: =ProcessDates(D6:AH6;D$4:AH$4;AJ$5)
Изменено: Олег м - 30.04.2026 15:40:46
 
Алекс2378, если обновитесь хотя бы до 2019-го:
=ПОДСТАВИТЬ(ПОДСТАВИТЬ(СЖПРОБЕЛЫ(ПОДСТАВИТЬ(ПОДСТАВИТЬ(СЖПРОБЕЛЫ(СЦЕП(ЕСЛИ($D6:$AH6=AJ$5;ЕСЛИ($D6:$AH6=$C6:$AG6;"-";"")&ЕСЛИ(($D6:$AH6<>$C6:$AG6)+($D6:$AH6<>$E6:$AI6);ТЕКСТ($D$4:$AH$4;"Д.ММ.ГГГ");"");" ")));" ";",");"-";" "));" ";" - ");",";", ")
 
Цитата
написал:
Ваши формулы очень громоздкие и сложные для восприятия.
Да чего уж там, не сдерживайтесь, напишите сразу :)
Скрытый текст
 
ПавелW, Спасибо, но обновления от меня не зависят. Ваша формула выше у меня не считает, можно Вас попросить вставить её в исходный файл, может я что то не так делаю.
 
Цитата
МатросНаЗебре написал:
Да чего уж там, не сдерживайтесь, напишите сразу

Зачем так грубо :)
Изменено: Олег м - 30.04.2026 15:56:52
 
...как писал выше можно задействовать диспетчер имен [1 (2) ]
Цитата
Алекс2378:  можно Вас попросить вставить её в исходный файл, может я что то не так делаю
ловите)
 
ПавелW, Спасибо.
Страницы: 1
Читают тему
Наверх