Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Подсчёт интервала из пустых ячеек в строке между заполненных - Мир MS Excel

  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_, DrMini  
Подсчёт интервала из пустых ячеек в строке между заполненных
VichnyStudent Дата: Среда, 11.01.2017, 15:50 | Сообщение № 1
Группа: Пользователи
Ранг: Новичок
Сообщений: 20
Репутация: 0 ±
Замечаний: 20% ±

Excel 2010
Добрый день!

Подскажите пожалуйста, как в массиве данных посчитать минимальный интервал пустых ячеек, располагающихся между заполненными?
Есть график отпусков, надо формулой определить у каждого человека минимальный промежуток между периодами отпуска.
Эксперты, помогите пожалуйста, всю голову уже себе сломал.

Файл с примером прилагаю.

Была подобная тема, но там надо было подсчитать количество пустых ячеек между последними заполненными справа, мне же надо найти минимальный интервал
http://www.excelworld.ru/forum/2-19672-1
К сообщению приложен файл: grafik.xlsx (10.4 Kb)
 
Ответить
СообщениеДобрый день!

Подскажите пожалуйста, как в массиве данных посчитать минимальный интервал пустых ячеек, располагающихся между заполненными?
Есть график отпусков, надо формулой определить у каждого человека минимальный промежуток между периодами отпуска.
Эксперты, помогите пожалуйста, всю голову уже себе сломал.

Файл с примером прилагаю.

Была подобная тема, но там надо было подсчитать количество пустых ячеек между последними заполненными справа, мне же надо найти минимальный интервал
http://www.excelworld.ru/forum/2-19672-1

Автор - VichnyStudent
Дата добавления - 11.01.2017 в 15:50
Gustav Дата: Среда, 11.01.2017, 18:26 | Сообщение № 2
Группа: Админы
Ранг: Участник клуба
Сообщений: 2843
Репутация: 1194 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
Если процедурное решение (макрос) интересует, то у меня вот такое получилось, с довольно эффективным использованием Range.SpecialCells:
[vba]
Код
Sub calcMinIntervals()

    Dim rngSource As Range, rngTarget As Range
    Dim rngFilled As Range, rngEmpty As Range
    Dim cell1 As Range, cell2 As Range
    Dim rng As Range, area As Range
    Dim nMin As Integer
    
    Set rngSource = Range("B5:AE8") 'матрица отпускных дней всех сотрудников
    Set rngTarget = Range("AH5:AH8") 'колонка результатов (для всех сотрудников)
    
    For Each rng In rngSource.Rows 'цикл по строкам матрицы
        Set rngFilled = rng 'на случай если строка абсолютно пустая (без 1)
        On Error Resume Next
        Set rngFilled = rng.SpecialCells(xlCellTypeConstants, 23)
        On Error GoTo 0
   
        Set cell1 = rngFilled.Cells(1, 1)
        Set cell2 = rngFilled.Areas(rngFilled.Areas.Count).Cells(1, 1)
        
        Set rngEmpty = Range(cell1, cell2).SpecialCells(xlCellTypeBlanks)
        If Not rngEmpty Is Nothing And cell1.Address <> cell2.Address Then
            nMin = 1000 'заведомо большое число
            For Each area In rngEmpty.Areas
                nMin = WorksheetFunction.Min(nMin, area.Cells.Count)
            Next area
        Else
            nMin = 0
        End If
        
        rngTarget(rng.Row - rngSource.Row + 1) = nMin
    Next rng

End Sub
[/vba]

P.S. Но аналогичную пользовательскую функцию (UDF) по этим мотивам написать не смог! Точнее, написал, конечно, но она ни фига не хочет работать как надо - и именно SpecialCells :(


P.P.S. А вот и официальное подтверждение - SpecialCells не работает в UDF (ключевое уточнение - НА ЛИСТЕ!). Тут нашёл надпись английским по белому:
Цитата

SpecialCells does not work in UDFs. It's a limitation of Excel. Here's a list of things that don't work in UDFs.

http://www.decisionmodels.com/calcsecretsj.htm


И цитата из второй ссылки:
Цитата

UDF action being ignored.

Excel will not allow a UDF written in VBA to alter anything except the value of the cell in which it is entered.
You cannot make a VBA UDF which directly:
•Alters the value or formula or properties of another cell.
•Alters the formatting of the cell in which it is entered.
•Alters the environment of Excel. This includes the cursor.
•Uses FIND, SpecialCells, CurrentRegion, CurrentArray, GOTO, SELECT, PRECEDENTS etc : although you can use Range.End.
•Note you can use FIND in Excel 2002/2003.

И, оказывается, не только SpecialCells, но и любимый CurrentRegion невозможен. Про невозможность других знал и как-то даже интуитивно понятно, что никаких перемещений/выделений в функции быть не может. Но SpecialCells и CurrentRegion казались именно вычислительными методами, без каких-либо движений на листе. Ан нет, всё равно - низзя!

P.P.P.S. Еще раз акцентирую, что речь о неправильном (неожиданном) поведении SpecialCells в функциях, которые введены в формулы ячеек рабочего листа. Вне листа, возможно, что-то и работает. Во всяком случае я нашёл на форуме тему, в которой есть функция, содержащая SpecialCells и правильно работающая ВНЕ рабочего листа.


МОИ: Ник, Tip box: 41001663842605

Сообщение отредактировал Gustav - Среда, 11.01.2017, 20:57
 
Ответить
СообщениеЕсли процедурное решение (макрос) интересует, то у меня вот такое получилось, с довольно эффективным использованием Range.SpecialCells:
[vba]
Код
Sub calcMinIntervals()

    Dim rngSource As Range, rngTarget As Range
    Dim rngFilled As Range, rngEmpty As Range
    Dim cell1 As Range, cell2 As Range
    Dim rng As Range, area As Range
    Dim nMin As Integer
    
    Set rngSource = Range("B5:AE8") 'матрица отпускных дней всех сотрудников
    Set rngTarget = Range("AH5:AH8") 'колонка результатов (для всех сотрудников)
    
    For Each rng In rngSource.Rows 'цикл по строкам матрицы
        Set rngFilled = rng 'на случай если строка абсолютно пустая (без 1)
        On Error Resume Next
        Set rngFilled = rng.SpecialCells(xlCellTypeConstants, 23)
        On Error GoTo 0
   
        Set cell1 = rngFilled.Cells(1, 1)
        Set cell2 = rngFilled.Areas(rngFilled.Areas.Count).Cells(1, 1)
        
        Set rngEmpty = Range(cell1, cell2).SpecialCells(xlCellTypeBlanks)
        If Not rngEmpty Is Nothing And cell1.Address <> cell2.Address Then
            nMin = 1000 'заведомо большое число
            For Each area In rngEmpty.Areas
                nMin = WorksheetFunction.Min(nMin, area.Cells.Count)
            Next area
        Else
            nMin = 0
        End If
        
        rngTarget(rng.Row - rngSource.Row + 1) = nMin
    Next rng

End Sub
[/vba]

P.S. Но аналогичную пользовательскую функцию (UDF) по этим мотивам написать не смог! Точнее, написал, конечно, но она ни фига не хочет работать как надо - и именно SpecialCells :(


P.P.S. А вот и официальное подтверждение - SpecialCells не работает в UDF (ключевое уточнение - НА ЛИСТЕ!). Тут нашёл надпись английским по белому:
Цитата

SpecialCells does not work in UDFs. It's a limitation of Excel. Here's a list of things that don't work in UDFs.

http://www.decisionmodels.com/calcsecretsj.htm


И цитата из второй ссылки:
Цитата

UDF action being ignored.

Excel will not allow a UDF written in VBA to alter anything except the value of the cell in which it is entered.
You cannot make a VBA UDF which directly:
•Alters the value or formula or properties of another cell.
•Alters the formatting of the cell in which it is entered.
•Alters the environment of Excel. This includes the cursor.
•Uses FIND, SpecialCells, CurrentRegion, CurrentArray, GOTO, SELECT, PRECEDENTS etc : although you can use Range.End.
•Note you can use FIND in Excel 2002/2003.

И, оказывается, не только SpecialCells, но и любимый CurrentRegion невозможен. Про невозможность других знал и как-то даже интуитивно понятно, что никаких перемещений/выделений в функции быть не может. Но SpecialCells и CurrentRegion казались именно вычислительными методами, без каких-либо движений на листе. Ан нет, всё равно - низзя!

P.P.P.S. Еще раз акцентирую, что речь о неправильном (неожиданном) поведении SpecialCells в функциях, которые введены в формулы ячеек рабочего листа. Вне листа, возможно, что-то и работает. Во всяком случае я нашёл на форуме тему, в которой есть функция, содержащая SpecialCells и правильно работающая ВНЕ рабочего листа.

Автор - Gustav
Дата добавления - 11.01.2017 в 18:26
VichnyStudent Дата: Четверг, 12.01.2017, 08:13 | Сообщение № 3
Группа: Пользователи
Ранг: Новичок
Сообщений: 20
Репутация: 0 ±
Замечаний: 20% ±

Excel 2010
Спасибо огромное! за макрос, но мне надо сделать эту проверку именно формулой ((
 
Ответить
СообщениеСпасибо огромное! за макрос, но мне надо сделать эту проверку именно формулой ((

Автор - VichnyStudent
Дата добавления - 12.01.2017 в 08:13
Pelena Дата: Четверг, 12.01.2017, 09:25 | Сообщение № 4
Группа: Админы
Ранг: Местный житель
Сообщений: 19513
Репутация: 4632 ±
Замечаний: ±

Excel 365 & Mac Excel
Цитата VichnyStudent, 12.01.2017 в 08:13, в сообщении № 3 ()
именно формулой

Формула массива
Код
=МИН(ЕСЛИ(ЧАСТОТА(ЕСЛИ((B5:AE5=0)*(СТОЛБЕЦ(B5:AE5)-1>ПОИСКПОЗ(1;B5:AE5;0))*(СТОЛБЕЦ(B5:AE5)-1<ПРОСМОТР(2;1/(B5:AE5=1);СТОЛБЕЦ(B5:AE5)-1));СТОЛБЕЦ(B5:AE5)-1);ЕСЛИ(B5:AE5=1;СТОЛБЕЦ(B5:AE5)-1))>0;ЧАСТОТА(ЕСЛИ(B5:AE5=0;СТОЛБЕЦ(B5:AE5)-1);ЕСЛИ(B5:AE5=1;СТОЛБЕЦ(B5:AE5)-1))))
К сообщению приложен файл: 8767533.xlsx (11.4 Kb)


"Черт возьми, Холмс! Но как??!!"
Ю-money 41001765434816
 
Ответить
Сообщение
Цитата VichnyStudent, 12.01.2017 в 08:13, в сообщении № 3 ()
именно формулой

Формула массива
Код
=МИН(ЕСЛИ(ЧАСТОТА(ЕСЛИ((B5:AE5=0)*(СТОЛБЕЦ(B5:AE5)-1>ПОИСКПОЗ(1;B5:AE5;0))*(СТОЛБЕЦ(B5:AE5)-1<ПРОСМОТР(2;1/(B5:AE5=1);СТОЛБЕЦ(B5:AE5)-1));СТОЛБЕЦ(B5:AE5)-1);ЕСЛИ(B5:AE5=1;СТОЛБЕЦ(B5:AE5)-1))>0;ЧАСТОТА(ЕСЛИ(B5:AE5=0;СТОЛБЕЦ(B5:AE5)-1);ЕСЛИ(B5:AE5=1;СТОЛБЕЦ(B5:AE5)-1))))

Автор - Pelena
Дата добавления - 12.01.2017 в 09:25
Gustav Дата: Четверг, 12.01.2017, 11:59 | Сообщение № 5
Группа: Админы
Ранг: Участник клуба
Сообщений: 2843
Репутация: 1194 ±
Замечаний: ±

начинал с Excel 4.0, видел 2.1
[offtop]
Формула массива

Произведение искусства! И вот такую мегаформулу - да на сопровождение средней руки пишбарышней из бухгалтерии или персонала...


МОИ: Ник, Tip box: 41001663842605
 
Ответить
Сообщение[offtop]
Формула массива

Произведение искусства! И вот такую мегаформулу - да на сопровождение средней руки пишбарышней из бухгалтерии или персонала...

Автор - Gustav
Дата добавления - 12.01.2017 в 11:59
VichnyStudent Дата: Четверг, 12.01.2017, 12:00 | Сообщение № 6
Группа: Пользователи
Ранг: Новичок
Сообщений: 20
Репутация: 0 ±
Замечаний: 20% ±

Excel 2010
Pelena, спасибо огромное!!!
 
Ответить
СообщениеPelena, спасибо огромное!!!

Автор - VichnyStudent
Дата добавления - 12.01.2017 в 12:00
Pelena Дата: Четверг, 12.01.2017, 12:05 | Сообщение № 7
Группа: Админы
Ранг: Местный житель
Сообщений: 19513
Репутация: 4632 ±
Замечаний: ±

Excel 365 & Mac Excel
[offtop]
вот такую мегаформулу

Дык, за что боролись... :D [/offtop]


"Черт возьми, Холмс! Но как??!!"
Ю-money 41001765434816
 
Ответить
Сообщение[offtop]
вот такую мегаформулу

Дык, за что боролись... :D [/offtop]

Автор - Pelena
Дата добавления - 12.01.2017 в 12:05
_Boroda_ Дата: Четверг, 12.01.2017, 13:30 | Сообщение № 8
Группа: Админы
Ранг: Местный житель
Сообщений: 16886
Репутация: 6611 ±
Замечаний: ±

2003; 2007; 2010; 2013 RUS
А вот еще немассивный вариант
Код
=МИН(--ТЕКСТ(МУМНОЖ({-1;1};НАИМЕНЬШИЙ(B5:AE5*B$2:AE$2;СТОЛБЕЦ(B5:AD5)-{1:0}))-1;"0;99;99"))
К сообщению приложен файл: grafik_1.xlsx (10.9 Kb)


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
СообщениеА вот еще немассивный вариант
Код
=МИН(--ТЕКСТ(МУМНОЖ({-1;1};НАИМЕНЬШИЙ(B5:AE5*B$2:AE$2;СТОЛБЕЦ(B5:AD5)-{1:0}))-1;"0;99;99"))

Автор - _Boroda_
Дата добавления - 12.01.2017 в 13:30
VichnyStudent Дата: Четверг, 12.01.2017, 13:32 | Сообщение № 9
Группа: Пользователи
Ранг: Новичок
Сообщений: 20
Репутация: 0 ±
Замечаний: 20% ±

Excel 2010
Pelena, подскажите пожалуйста, длина обрабатываемого массива имеет значение? В маленькой табличке работает отлично, когда я вставляю в реальную таблицу на весь год формула почему-то начинает считать минимальный интервал с первой ячейки даже если введена всего одна единичка в строке. Либо я как-то криво умудрился заменить диапазон из Вашей формулы на реальный?
Пример приложил, в табличке Лист 2.
К сообщению приложен файл: _8767533.xlsx (16.4 Kb)
 
Ответить
СообщениеPelena, подскажите пожалуйста, длина обрабатываемого массива имеет значение? В маленькой табличке работает отлично, когда я вставляю в реальную таблицу на весь год формула почему-то начинает считать минимальный интервал с первой ячейки даже если введена всего одна единичка в строке. Либо я как-то криво умудрился заменить диапазон из Вашей формулы на реальный?
Пример приложил, в табличке Лист 2.

Автор - VichnyStudent
Дата добавления - 12.01.2017 в 13:32
Pelena Дата: Четверг, 12.01.2017, 13:48 | Сообщение № 10
Группа: Админы
Ранг: Местный житель
Сообщений: 19513
Репутация: 4632 ±
Замечаний: ±

Excel 365 & Mac Excel
Так как диапазон начинается с 10-го столбца, то надо везде заменить
Код
СТОЛБЕЦ(J5:NK5)-1
на
Код
СТОЛБЕЦ(J5:NK5)-9


"Черт возьми, Холмс! Но как??!!"
Ю-money 41001765434816
 
Ответить
СообщениеТак как диапазон начинается с 10-го столбца, то надо везде заменить
Код
СТОЛБЕЦ(J5:NK5)-1
на
Код
СТОЛБЕЦ(J5:NK5)-9

Автор - Pelena
Дата добавления - 12.01.2017 в 13:48
VichnyStudent Дата: Четверг, 12.01.2017, 13:56 | Сообщение № 11
Группа: Пользователи
Ранг: Новичок
Сообщений: 20
Репутация: 0 ±
Замечаний: 20% ±

Excel 2010
Pelena, Фух, заработало, спасибо огромное за помощь!
 
Ответить
СообщениеPelena, Фух, заработало, спасибо огромное за помощь!

Автор - VichnyStudent
Дата добавления - 12.01.2017 в 13:56
VichnyStudent Дата: Четверг, 12.01.2017, 13:58 | Сообщение № 12
Группа: Пользователи
Ранг: Новичок
Сообщений: 20
Репутация: 0 ±
Замечаний: 20% ±

Excel 2010
_Boroda_, спасибо большое за помощь!
 
Ответить
Сообщение_Boroda_, спасибо большое за помощь!

Автор - VichnyStudent
Дата добавления - 12.01.2017 в 13:58
_Boroda_ Дата: Четверг, 12.01.2017, 14:03 | Сообщение № 13
Группа: Админы
Ранг: Местный житель
Сообщений: 16886
Репутация: 6611 ±
Замечаний: ±

2003; 2007; 2010; 2013 RUS
В более общем случае вот так
Код
=МИН(--ТЕКСТ(МУМНОЖ({-1;1};НАИМЕНЬШИЙ(J5:NK5*J$2:NK$2;СТОЛБЕЦ(K5:NK5)-СТОЛБЕЦ(J5)-{0:-1}))-1;"0;999;999"))


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
СообщениеВ более общем случае вот так
Код
=МИН(--ТЕКСТ(МУМНОЖ({-1;1};НАИМЕНЬШИЙ(J5:NK5*J$2:NK$2;СТОЛБЕЦ(K5:NK5)-СТОЛБЕЦ(J5)-{0:-1}))-1;"0;999;999"))

Автор - _Boroda_
Дата добавления - 12.01.2017 в 14:03
sboy Дата: Четверг, 12.01.2017, 14:05 | Сообщение № 14
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2566
Репутация: 724 ±
Замечаний: 0% ±

Excel 2010
_Boroda_, Добрый день, расшифруйте пожалуйста что означает формат текста
"0;999;999"


Яндекс: 410016850021169
 
Ответить
Сообщение_Boroda_, Добрый день, расшифруйте пожалуйста что означает формат текста
"0;999;999"

Автор - sboy
Дата добавления - 12.01.2017 в 14:05
_Boroda_ Дата: Четверг, 12.01.2017, 14:08 | Сообщение № 15
Группа: Админы
Ранг: Местный житель
Сообщений: 16886
Репутация: 6611 ±
Замечаний: ±

2003; 2007; 2010; 2013 RUS
Добрый
Второй аргумент ТЕКСТа очень похож на обычное форматирование ячейки для числовых форматов (кроме раскраски текста - в ТЕКСТ она не работает)
ЧислоБольшеНуля; ЧислоМеньшеНуля; Ноль; Текст
Получаем для положительных чисел выводятся сами числа, для отрицательных и нулей -выводится 999

Поподробнее вот почитайте
http://www.excelworld.ru/publ/hacks/formatting/format_user/63-1-0-141


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995
 
Ответить
СообщениеДобрый
Второй аргумент ТЕКСТа очень похож на обычное форматирование ячейки для числовых форматов (кроме раскраски текста - в ТЕКСТ она не работает)
ЧислоБольшеНуля; ЧислоМеньшеНуля; Ноль; Текст
Получаем для положительных чисел выводятся сами числа, для отрицательных и нулей -выводится 999

Поподробнее вот почитайте
http://www.excelworld.ru/publ/hacks/formatting/format_user/63-1-0-141

Автор - _Boroda_
Дата добавления - 12.01.2017 в 14:08
sboy Дата: Четверг, 12.01.2017, 14:48 | Сообщение № 16
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2566
Репутация: 724 ±
Замечаний: 0% ±

Excel 2010
_Boroda_, Спасибо, добавил в избранное


Яндекс: 410016850021169
 
Ответить
Сообщение_Boroda_, Спасибо, добавил в избранное

Автор - sboy
Дата добавления - 12.01.2017 в 14:48
VichnyStudent Дата: Пятница, 13.01.2017, 07:40 | Сообщение № 17
Группа: Пользователи
Ранг: Новичок
Сообщений: 20
Репутация: 0 ±
Замечаний: 20% ±

Excel 2010
Pelena, я извиняюсь за назойливость, но можно ещё один вопрос: как заставить работать формулу если единички в клетки подставляются как результат функции "если" как в приложенном примере? Вариант _Boroda_ тоже не работает :(
К сообщению приложен файл: 3602093.xlsx (17.4 Kb)
 
Ответить
СообщениеPelena, я извиняюсь за назойливость, но можно ещё один вопрос: как заставить работать формулу если единички в клетки подставляются как результат функции "если" как в приложенном примере? Вариант _Boroda_ тоже не работает :(

Автор - VichnyStudent
Дата добавления - 13.01.2017 в 07:40
Pelena Дата: Пятница, 13.01.2017, 08:29 | Сообщение № 18
Группа: Админы
Ранг: Местный житель
Сообщений: 19513
Репутация: 4632 ±
Замечаний: ±

Excel 365 & Mac Excel
Теперь у Вас не совсем пустые ячейки, а содержащие пустую строку, поэтому замените в двух местах в формуле
Код
B5:AE5=0
на
Код
B5:AE5=""


"Черт возьми, Холмс! Но как??!!"
Ю-money 41001765434816
 
Ответить
СообщениеТеперь у Вас не совсем пустые ячейки, а содержащие пустую строку, поэтому замените в двух местах в формуле
Код
B5:AE5=0
на
Код
B5:AE5=""

Автор - Pelena
Дата добавления - 13.01.2017 в 08:29
VichnyStudent Дата: Пятница, 13.01.2017, 08:42 | Сообщение № 19
Группа: Пользователи
Ранг: Новичок
Сообщений: 20
Репутация: 0 ±
Замечаний: 20% ±

Excel 2010
Pelena, спасибо огромное, и как я сам не додумался, как всё кажется просто когда объяснят...
 
Ответить
СообщениеPelena, спасибо огромное, и как я сам не додумался, как всё кажется просто когда объяснят...

Автор - VichnyStudent
Дата добавления - 13.01.2017 в 08:42
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2025 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!