Количество ячеек с датами из заданного интервала

Автор kompilainenn, 30 августа 2015, 22:28

0 Пользователи и 1 гость просматривают эту тему.

kompilainenn

Есть столбец с датами (формат ячеек ДАТА ессно). В отдельной ячейке нужно посчитать, сколько ячеек с датами попали в заданный интервал. Первая и последняя дата в вопросе должны быть учтены при подсчете, то есть "включая начальную и конечную даты".
Поддержать разработчиков LibreOffice можно тут, а наш форум вот тут

rami

Цитата: kompilainenn от 30 августа 2015, 20:28Есть столбец с датами (формат ячеек ДАТА ессно). В отдельной ячейке нужно посчитать, сколько ячеек с датами попали в заданный интервал. Первая и последняя дата в вопросе должны быть учтены при подсчете, то есть "включая начальную и конечную даты".
Для твоего примера подойдёт формула:=DATEDIF(A3,A13,"d")+1

Функция DATEDIF есть только в LibreOffice, в Apache OpenOffice её нет.

kompilainenn

хм... rami, это в столбце в примере даты идут одна за другой, на самом деле (некорректный пример видимо да) дата в вопросе может быть какой угодно (и начальная и конечная) и вовсе не обязательно она будет присутствовать в списке в столбце А! А сами даты в столбце А могут дублироваться по нескольку раз
Поддержать разработчиков LibreOffice можно тут, а наш форум вот тут

rami

Цитата: kompilainenn от 30 августа 2015, 21:20хм... rami, это в столбце в примере даты идут одна за другой, на самом деле (некорректный пример видимо да) дата в вопросе может быть какой угодно (и начальная и конечная) и вовсе не обязательно она будет присутствовать в списке в столбце А! А сами даты в столбце А могут дублироваться по нескольку раз
Ну, так сформулируй вопрос как надо. Сделай так: в столбце A список дат и правильный ответ, в столбце B другой список дат и соответствующий ответ и т.д. для разных случаев

rami

Тогда наверно так:=COUNTIFS(A1:A16,">=" & "19/08/15",A1:A16,"<=" & "29/08/15")

Алексей2015

Пожалуйста, помогите. В моем случае не даты, но нечто подобное. Нужно срочно сделать работу. Имеется большая таблица с данными: возраст, пол. Нужно посмотреть распределение по возрастным интервалам до 1 г, 1-3 года, 4-6 лет, 7-17 лет и по полу: м-ж. Использовал функцию countifs. Проблема в том, что возраст в таблицу внесен по разному: 6м, 6 м, 6 мес, 6мес, 1г, 1 г, 1 г 3 м, 1г3м, 1 г 3 мес и т.д.  Как правильно задать в этом случае критерий отбора? Или совсем безнадежно?

JohnSUN

Сложно. Особенно если таблица действительно ОЧЕНЬ большая. Фрагмент таблицы для примера можно увидеть? Не всю, строк двадцать-тридцать, но с разными вариантами написания возрастов... Скорее всего придётся писать макрос. Впрочем, возможно удастся обойтись фильтром и одними только формулами. Смотреть надо...
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Алексей2015

2г   м
9мес   ж
6 мес   ж
3г   м
11 мес   ж
3г   ж
9 лет   м
2г   ж
15 лет   м
2 г 11 мес   ж
3 г 10 мес   ж
1 г 10 мес   м
14 лет   ж
4 мес   ж
11 лет   ж
8 мес   м
11 лет   м
14 лет   м
12 лет   м
9л   ж
2г   ж
6 мес   ж
13 лет   м
3г5мес   ж
В основном два типа записей.

JohnSUN

Ну, я поступил следующим образом.
1. Выделил колонку Возраст, выбрал в меню Данные - Фильтр - Стандартный фильтр..., задал условие "Возраст = не пусто", в дополнительных параметрах попросил "Без повторений" и результат скопировал в новое место. Из 24 вариантов получилось 18.
2. Потом проделал самую скучную часть работы - рядом с каждым из значений вписал возраст в месяцах. Именно этот кусок я планировал реализовать макросом, но для небольшого объёма данных это можно сделать и вручную. Получил таблицу

ВозрастМесяцев
1 г 10 мес22
11 лет132
11 мес11
12 лет144
13 лет156
14 лет168
15 лет180
2 г 11 мес35
24
3 г 10 мес46
36
3г5мес41
4 мес4
6 мес6
8 мес8
9 лет108
108
9мес9
Эта таблица у меня находится по адресу $F$2:$G$19 (этот адрес будет использован в формуле)
3. Дальше уже проще. Дополняю таблицу данных колонкой Категория, в которую вписываю формулу
=CHOOSE(MATCH(VLOOKUP(A2;$F$2:$G$19;2;1);{0;12;36;72;204};1);"До 1 года";"От 1 до 3 лет";"От 4 до 7 лет";"Старше 7 лет")
Растягиваю формулу до конца таблицы и получаю таблицу в таком виде

ВозрастПолКатегория
мОт 1 до 3 лет
9месжДо 1 года
.........
6 месжДо 1 года
13 летмСтарше 7 лет
3г5месжОт 4 до 7 лет
4. Осталось натравить на получившиеся данные конструктор сводных таблиц (меню Данные - Сводная таблица - Создать) и получить окончательный ответ

КатегорияжмИтог
До 1 года516
От 1 до 3 лет325
От 4 до 7 лет314
Старше 7 лет369
Результат141024
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Алексей2015

Огромное спасибо, Владислав. Без Вашей помощи, хоть вручную считай :) , а времени нет.

JohnSUN

А макрос для "перевода" текстовых возрастов в количество месяцев оказался не очень-то и сложным.
Эта функция хорошо справилась со всеми комбинациями из примера.
Function getMonthes(sourceTxt As String) As Integer
Const Digits = "0123456789"
Dim dig1&, dig2&, i&
Dim tS$, tC&
dig1=0
dig2=0
tS = Trim(sourceTxt)
REM Пропустить не цифры - возможны какие-то знаки до первого числа
i = 1
Do While (i <= Len(tS)) And (InStr(Digits,Mid(tS, i, 1))=0)
i = i + 1
Loop
REM Собираем из идущих подряд цифр первое число
Do While (i <= Len(tS)) And (InStr(Digits,Mid(tS, i, 1))>0)
dig1 = dig1 * 10 + Val(Mid(tS, i, 1))
i = i + 1
Loop
REM Пропустить пробелы (если есть)
Do While (i <= Len(tS)) And (Mid(tS, i, 1)=" ")
i = i + 1
Loop
REM Не на букву ли "М" (мес) натолкнулись?
REM На латинскую M тоже проверяем
If (UCase(Mid(tS, i, 1))="М") Or (UCase(Mid(tS, i, 1))="M") Then
getMonthes = dig1
Exit Function
EndIf
REM Пропустить все не цифры
Do While (i <= Len(tS)) And (InStr(Digits,Mid(tS, i, 1))=0)
i = i + 1
Loop
REM Собираем из идущих подряд цифр второе число
Do While (i <= Len(tS)) And (InStr(Digits,Mid(tS, i, 1))>0)
dig2 = dig2 * 10 + Val(Mid(tS, i, 1))
i = i + 1
Loop
REM Первое число (годы) переводим в месяцы и добавляем второе число
getMonthes = dig1 * 12 + dig2
End Function
Хоть задача и решена, но макрос пусть полежит здесь - авось, ещё кому сгодится
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

rami

Можно сделать проще:
1. Выделить данные возраста и с помощью найти и заменить см. снимок Найти и заменить.png
найти:([:digit:]*)( *)(г|лет|л)(.*)
заменить на:$1
2. В дополнительном столбце группы пишем формулу:=IF(ISNUMBER(A2),IF(A2>3,IF(A2>6,"от семи до семнадцати","от четырёх до семи"),"от года до четырёх"),"до года")и растягиваем до низу см. снимок Результат.png
3. Создаём сводную таблицу по столбцам группы и пол

Алексей2015

Прошу прощения, при попытке вставить формулу на последнем этапе =IF(ISNUMBER(A2),IF(A2>3,IF(A2>6,"от семи до семнадцати","от четырёх до семи"),"от года до четырёх"),"до года") ругается - ошибка 501

rami

Цитата: Алексей2015 от  3 сентября 2015, 23:19Прошу прощения, при попытке вставить формулу на последнем этапе =IF(ISNUMBER(A2),IF(A2>3,IF(A2>6,"от семи до семнадцати","от четырёх до семи"),"от года до четырёх"),"до года") ругается - ошибка 501
Для русской локали нужно запятые заменить на ; (точку с запятой) вот так:
=IF(ISNUMBER(A2);IF(A2>3;IF(A2>6;"от семи до семнадцати";"от четырёх до семи");"от года до четырёх");"до года")

JohnSUN

В мою предыдущую формулу вкралась досадная ошибка - массив {0;12;36;72;204} делит возраста на категории 0-1-3-6-17, а не 0-1-4-7-17, как требовалось в условии задачи. Сорри!
Окончательный вариант решения - в приложенном файле
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне