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

Вход

Регистрация

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

 

= Мир MS Excel/Подсчёт периодов между датами с точностью до дня! - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Подсчёт периодов между датами с точностью до дня! (Макросы/Sub)
Подсчёт периодов между датами с точностью до дня!
Treider01 Дата: Понедельник, 10.11.2014, 17:58 | Сообщение № 1
Группа: Пользователи
Ранг: Участник
Сообщений: 50
Репутация: 1 ±
Замечаний: 0% ±

Excel 2003
Добрый вечер.

Необходимо подсчитать кол-во целых периодов между двумя датами. Период - 6 месяцев.

[vba]
Код
d3 = 07.05.2014
d1 = 03.11.2014
freq = 6
Int = Int(DateDiff("m", d3, d1) / freq)
[/vba]

Задача проста - узнать сколько раз по 6 содержится в разнице между этими двумя датами. По мнению екселя минимум один раз. Потом что считается кол-во целых месяцев без учёта дней, а мне надо чтобы считалось именно с учётом дней. Т.е. чтобы в примере только 7 числа настал полный один раз.
 
Ответить
СообщениеДобрый вечер.

Необходимо подсчитать кол-во целых периодов между двумя датами. Период - 6 месяцев.

[vba]
Код
d3 = 07.05.2014
d1 = 03.11.2014
freq = 6
Int = Int(DateDiff("m", d3, d1) / freq)
[/vba]

Задача проста - узнать сколько раз по 6 содержится в разнице между этими двумя датами. По мнению екселя минимум один раз. Потом что считается кол-во целых месяцев без учёта дней, а мне надо чтобы считалось именно с учётом дней. Т.е. чтобы в примере только 7 числа настал полный один раз.

Автор - Treider01
Дата добавления - 10.11.2014 в 17:58
buchlotnik Дата: Понедельник, 10.11.2014, 18:01 | Сообщение № 2
Группа: Заблокированные
Ранг: Участник клуба
Сообщений: 3442
Репутация: 929 ±
Замечаний: 20% ±

2010, 2013, 2016 RUS / ENG
Где пример? Вообще не понятно, что должно получиться
 
Ответить
СообщениеГде пример? Вообще не понятно, что должно получиться

Автор - buchlotnik
Дата добавления - 10.11.2014 в 18:01
Treider01 Дата: Понедельник, 10.11.2014, 18:16 | Сообщение № 3
Группа: Пользователи
Ранг: Участник
Сообщений: 50
Репутация: 1 ±
Замечаний: 0% ±

Excel 2003
пример
К сообщению приложен файл: Book123.xls (21.0 Kb)
 
Ответить
Сообщениепример

Автор - Treider01
Дата добавления - 10.11.2014 в 18:16
Pelena Дата: Понедельник, 10.11.2014, 18:30 | Сообщение № 4
Группа: Админы
Ранг: Местный житель
Сообщений: 19196
Репутация: 4423 ±
Замечаний: ±

Excel 365 & Mac Excel
РАЗНДАТ() у Вас немного неверно записано
Код
=ОТБР(РАЗНДАТ(B2;B3;"m")/6)
К сообщению приложен файл: 3884993.xls (31.5 Kb)


"Черт возьми, Холмс! Но как??!!"
Ю-money 41001765434816
 
Ответить
СообщениеРАЗНДАТ() у Вас немного неверно записано
Код
=ОТБР(РАЗНДАТ(B2;B3;"m")/6)

Автор - Pelena
Дата добавления - 10.11.2014 в 18:30
Treider01 Дата: Понедельник, 10.11.2014, 18:34 | Сообщение № 5
Группа: Пользователи
Ранг: Участник
Сообщений: 50
Репутация: 1 ±
Замечаний: 0% ±

Excel 2003
РАЗНДАТ() у Вас немного неверно записано

=ОТБР(РАЗНДАТ(B2;B3;"m")/6)


Надеюсь что у меня, в моём старом екселе, эта функция будет в вба тоже представлена.

Итак

Sub or function not defined

Ещё идеи ?

Ещё вопрос - в той формуле, что я предоставил вычисляется ведь целое кол-во месяцев, разве нет? Почему тогда в формуле Pelena 0 а у меня 1 ? Отрицательных чисел нет. Инт нужен чтобы округлить в меньшую сторону, если число месяцев скажем 9 или 10 разница.


Сообщение отредактировал Treider01 - Понедельник, 10.11.2014, 18:43
 
Ответить
Сообщение
РАЗНДАТ() у Вас немного неверно записано

=ОТБР(РАЗНДАТ(B2;B3;"m")/6)


Надеюсь что у меня, в моём старом екселе, эта функция будет в вба тоже представлена.

Итак

Sub or function not defined

Ещё идеи ?

Ещё вопрос - в той формуле, что я предоставил вычисляется ведь целое кол-во месяцев, разве нет? Почему тогда в формуле Pelena 0 а у меня 1 ? Отрицательных чисел нет. Инт нужен чтобы округлить в меньшую сторону, если число месяцев скажем 9 или 10 разница.

Автор - Treider01
Дата добавления - 10.11.2014 в 18:34
Pelena Дата: Понедельник, 10.11.2014, 18:45 | Сообщение № 6
Группа: Админы
Ранг: Местный житель
Сообщений: 19196
Репутация: 4423 ±
Замечаний: ±

Excel 365 & Mac Excel
Эм-м, не уверена, но в VBA она не так работает, по-моему


"Черт возьми, Холмс! Но как??!!"
Ю-money 41001765434816
 
Ответить
СообщениеЭм-м, не уверена, но в VBA она не так работает, по-моему

Автор - Pelena
Дата добавления - 10.11.2014 в 18:45
Treider01 Дата: Понедельник, 10.11.2014, 18:48 | Сообщение № 7
Группа: Пользователи
Ранг: Участник
Сообщений: 50
Репутация: 1 ±
Замечаний: 0% ±

Excel 2003
Эм-м, не уверена, но в VBA она не так работает, по-моему


Я знаю, но нет, я не могу её вызвать.

Сначала подумал, что это просто оператор о котором я не знал. Но вызов через объект WorksheetFunction тоже не помог. У меня её нет.


Сообщение отредактировал Treider01 - Понедельник, 10.11.2014, 18:50
 
Ответить
Сообщение
Эм-м, не уверена, но в VBA она не так работает, по-моему


Я знаю, но нет, я не могу её вызвать.

Сначала подумал, что это просто оператор о котором я не знал. Но вызов через объект WorksheetFunction тоже не помог. У меня её нет.

Автор - Treider01
Дата добавления - 10.11.2014 в 18:48
Pelena Дата: Понедельник, 10.11.2014, 18:49 | Сообщение № 8
Группа: Админы
Ранг: Местный житель
Сообщений: 19196
Репутация: 4423 ±
Замечаний: ±

Excel 365 & Mac Excel
Попробуем обойтись без неё
Код
=ОТБР((МЕСЯЦ(B3)-МЕСЯЦ(B2)-(ДЕНЬ(B3)<ДЕНЬ(B2)))/6)


"Черт возьми, Холмс! Но как??!!"
Ю-money 41001765434816
 
Ответить
СообщениеПопробуем обойтись без неё
Код
=ОТБР((МЕСЯЦ(B3)-МЕСЯЦ(B2)-(ДЕНЬ(B3)<ДЕНЬ(B2)))/6)

Автор - Pelena
Дата добавления - 10.11.2014 в 18:49
Treider01 Дата: Понедельник, 10.11.2014, 18:53 | Сообщение № 9
Группа: Пользователи
Ранг: Участник
Сообщений: 50
Репутация: 1 ±
Замечаний: 0% ±

Excel 2003
Попробуем обойтись бе неё

=ОТБР((МЕСЯЦ(B3)-МЕСЯЦ(B2)-(ДЕНЬ(B3)<ДЕНЬ(B2)))/6)


Я могу хранить результаты значений переменных в ячейках листа екселя, но это уже сложно. Идеально было бы какие-нибуть решение чисто из VBA. Хотя ваше решение мне нравится. Попробую его реализовать. Спасибо большое.
 
Ответить
Сообщение
Попробуем обойтись бе неё

=ОТБР((МЕСЯЦ(B3)-МЕСЯЦ(B2)-(ДЕНЬ(B3)<ДЕНЬ(B2)))/6)


Я могу хранить результаты значений переменных в ячейках листа екселя, но это уже сложно. Идеально было бы какие-нибуть решение чисто из VBA. Хотя ваше решение мне нравится. Попробую его реализовать. Спасибо большое.

Автор - Treider01
Дата добавления - 10.11.2014 в 18:53
nilem Дата: Понедельник, 10.11.2014, 19:18 | Сообщение № 10
Группа: Авторы
Ранг: Старожил
Сообщений: 1613
Репутация: 563 ±
Замечаний: 0% ±

Excel 2013, 2016
может, как-то так
[vba]
Код
Sub abc()
Dim a As Date, b As Date, k As Integer
Dim int1 As Integer, freq As Integer
a = Cells(2, 2)
b = Cells(3, 2)
freq = 6
Do
       a = DateAdd("m", freq, a)
       k = k + 1
Loop While a <= b
Cells(2, 3) = k - 1
End Sub
[/vba]

edited
или даже так
[vba]
Код
Sub abcd()
Dim a As Date, b As Date, k As Integer
Dim int1 As Integer, freq As Integer
a = Cells(2, 2)
b = Cells(3, 2)
freq = 6
Cells(3, 3) = Int((DateDiff("m", a, b) + (Day(a) > Day(b))) / freq)
End Sub
[/vba]


Яндекс.Деньги 4100159601573

Сообщение отредактировал nilem - Понедельник, 10.11.2014, 19:28
 
Ответить
Сообщениеможет, как-то так
[vba]
Код
Sub abc()
Dim a As Date, b As Date, k As Integer
Dim int1 As Integer, freq As Integer
a = Cells(2, 2)
b = Cells(3, 2)
freq = 6
Do
       a = DateAdd("m", freq, a)
       k = k + 1
Loop While a <= b
Cells(2, 3) = k - 1
End Sub
[/vba]

edited
или даже так
[vba]
Код
Sub abcd()
Dim a As Date, b As Date, k As Integer
Dim int1 As Integer, freq As Integer
a = Cells(2, 2)
b = Cells(3, 2)
freq = 6
Cells(3, 3) = Int((DateDiff("m", a, b) + (Day(a) > Day(b))) / freq)
End Sub
[/vba]

Автор - nilem
Дата добавления - 10.11.2014 в 19:18
AndreTM Дата: Вторник, 11.11.2014, 04:34 | Сообщение № 11
Группа: Друзья
Ранг: Старожил
Сообщений: 1762
Репутация: 500 ±
Замечаний: 0% ±

2003 & 2010
Сначала подумал, что это просто оператор о котором я не знал. Но вызов через объект WorksheetFunction тоже не помог. У меня её нет.
=РАЗНДАТ()/=DATEDIF - это функция листа. Её нет в справке, но, тем не менее, её можно использовать в формулах. Только НА ЛИСТЕ. ЕМНИП, она есть даже в Excel2000... И да, её нет в контейнере WorksheetFuncton.
DATEDIFF() - это функция VBA. Её можно использовать только в коде (макросах).
Синтаксис функции для листа и функции для кода - различен и напрямую не взаимозаменяем.


Skype: andre.tm.007
Donate: Qiwi: 9517375010
 
Ответить
Сообщение
Сначала подумал, что это просто оператор о котором я не знал. Но вызов через объект WorksheetFunction тоже не помог. У меня её нет.
=РАЗНДАТ()/=DATEDIF - это функция листа. Её нет в справке, но, тем не менее, её можно использовать в формулах. Только НА ЛИСТЕ. ЕМНИП, она есть даже в Excel2000... И да, её нет в контейнере WorksheetFuncton.
DATEDIFF() - это функция VBA. Её можно использовать только в коде (макросах).
Синтаксис функции для листа и функции для кода - различен и напрямую не взаимозаменяем.

Автор - AndreTM
Дата добавления - 11.11.2014 в 04:34
Treider01 Дата: Вторник, 11.11.2014, 11:41 | Сообщение № 12
Группа: Пользователи
Ранг: Участник
Сообщений: 50
Репутация: 1 ±
Замечаний: 0% ±

Excel 2003
=РАЗНДАТ()/=DATEDIF - это функция листа. Её нет в справке, но, тем не менее, её можно использовать в формулах. Только НА ЛИСТЕ. ЕМНИП, она есть даже в Excel2000... И да, её нет в контейнере WorksheetFuncton.
DATEDIFF() - это функция VBA. Её можно использовать только в коде (макросах).
Синтаксис функции для листа и функции для кода - различен и напрямую не взаимозаменяем.


Хмммм =РАЗНДАТ/=DATEDIFF - у меня только в VBA. Если говорит об втором операторе, то в ангийской версии (в моей) это =TRUNC. В более поздних версиях её подключают через Application. WorkSheetFunction. и т.д. У меня не работает как и целая куча других. Поэтому мне их приходится писать вручную.

nilem,

Один вопрос (возможно глупый) - а зачем во втором случае (Day(a) > Day(b) ? Разве можно прибавить неравенство?

И извините промазал с плюсом.


Сообщение отредактировал Treider01 - Вторник, 11.11.2014, 11:44
 
Ответить
Сообщение
=РАЗНДАТ()/=DATEDIF - это функция листа. Её нет в справке, но, тем не менее, её можно использовать в формулах. Только НА ЛИСТЕ. ЕМНИП, она есть даже в Excel2000... И да, её нет в контейнере WorksheetFuncton.
DATEDIFF() - это функция VBA. Её можно использовать только в коде (макросах).
Синтаксис функции для листа и функции для кода - различен и напрямую не взаимозаменяем.


Хмммм =РАЗНДАТ/=DATEDIFF - у меня только в VBA. Если говорит об втором операторе, то в ангийской версии (в моей) это =TRUNC. В более поздних версиях её подключают через Application. WorkSheetFunction. и т.д. У меня не работает как и целая куча других. Поэтому мне их приходится писать вручную.

nilem,

Один вопрос (возможно глупый) - а зачем во втором случае (Day(a) > Day(b) ? Разве можно прибавить неравенство?

И извините промазал с плюсом.

Автор - Treider01
Дата добавления - 11.11.2014 в 11:41
SAGE Дата: Вторник, 11.11.2014, 12:06 | Сообщение № 13
Группа: Пользователи
Ранг: Новичок
Сообщений: 25
Репутация: 5 ±
Замечаний: 0% ±

Excel 2007
Treider01, думаю что вы вообще правильно выбрали функцию, только не прочитали справку по ней. Если вы считаете количество периодов днях то в параметр также должен быть в днях
DateDiff
[vba]
Код
Синтаксис = DateDiff(interval, date1, date2[, firstdayofweek[, firstweekofyear]])
[/vba]
Возвращает значение типа Variant (Long), указывающее число временных интервалов между двумя датами. Функция DateDiff предназначена для определения числа указанных временных интервалов между двумя датами. Например, с помощью этой функции можно вычислить число дней между двумя датами или число недель между текущей датой и концом года. Для вычисления числа дней между датами date1 и date2 можно использовать временные интервалы типа день года ("y") или день месяца ("d"). Если interval задается как день недели ("w"), возвращается число недель между двумя датами. Если date1 соответствует понедельнику, подсчитывается число понедельников между date1 и date2. При этом date2 учитывается, а date1 нет. Если interval задается в неделях ("ww"), функция DateDiff возвращает число календарных недель между двумя датами, т.е. число воскресений между date1 и date2. При этом дата date2 учитывается (если ей соответствует воскресенье), а date1 нет (даже если ей соответствует воскресенье).
Если date1 определяет дату, более позднюю, чем date2, возвращается отрицательное значение. Аргумент firstdayofweek влияет на вычисления, использующие временные интервалы типа "w" и "ww". Если дата задается как литерал даты, указанный год становится постоянной частью даты. Однако если дата заключается в прямые кавычки (" "), а год опущен, то при каждом вычислении выражения даты в него будет подставляться текущий год. Это позволяет написать код, который может использоваться в течение нескольких лет.
При сравнении дат 31 декабря и 1 января следующего года функция DateDiff для интервала типа год ("yyyy") возвращает значение 1, хотя разница между датами составляет всего один день.
Параметр interval может принимать одно их следующих значений: yyyy -Год, q - Квартал, m - Месяц, y - День года, d - День месяца, w - День недели, ww - Неделя, h - Часы, n - Минуты, s - Секунды.

вам необходимо было посчитать кол-во целых дней недели а у вас стоит месяц

[vba]
Код

a = Cells(2, 2)
b = Cells(3, 2)

freq = 6
int1 = Int(DateDiff("y", a, b) / freq)

Cells(2, 3) = int1
[/vba]


Best regards,
SAGE


Сообщение отредактировал SAGE - Вторник, 11.11.2014, 12:24
 
Ответить
СообщениеTreider01, думаю что вы вообще правильно выбрали функцию, только не прочитали справку по ней. Если вы считаете количество периодов днях то в параметр также должен быть в днях
DateDiff
[vba]
Код
Синтаксис = DateDiff(interval, date1, date2[, firstdayofweek[, firstweekofyear]])
[/vba]
Возвращает значение типа Variant (Long), указывающее число временных интервалов между двумя датами. Функция DateDiff предназначена для определения числа указанных временных интервалов между двумя датами. Например, с помощью этой функции можно вычислить число дней между двумя датами или число недель между текущей датой и концом года. Для вычисления числа дней между датами date1 и date2 можно использовать временные интервалы типа день года ("y") или день месяца ("d"). Если interval задается как день недели ("w"), возвращается число недель между двумя датами. Если date1 соответствует понедельнику, подсчитывается число понедельников между date1 и date2. При этом date2 учитывается, а date1 нет. Если interval задается в неделях ("ww"), функция DateDiff возвращает число календарных недель между двумя датами, т.е. число воскресений между date1 и date2. При этом дата date2 учитывается (если ей соответствует воскресенье), а date1 нет (даже если ей соответствует воскресенье).
Если date1 определяет дату, более позднюю, чем date2, возвращается отрицательное значение. Аргумент firstdayofweek влияет на вычисления, использующие временные интервалы типа "w" и "ww". Если дата задается как литерал даты, указанный год становится постоянной частью даты. Однако если дата заключается в прямые кавычки (" "), а год опущен, то при каждом вычислении выражения даты в него будет подставляться текущий год. Это позволяет написать код, который может использоваться в течение нескольких лет.
При сравнении дат 31 декабря и 1 января следующего года функция DateDiff для интервала типа год ("yyyy") возвращает значение 1, хотя разница между датами составляет всего один день.
Параметр interval может принимать одно их следующих значений: yyyy -Год, q - Квартал, m - Месяц, y - День года, d - День месяца, w - День недели, ww - Неделя, h - Часы, n - Минуты, s - Секунды.

вам необходимо было посчитать кол-во целых дней недели а у вас стоит месяц

[vba]
Код

a = Cells(2, 2)
b = Cells(3, 2)

freq = 6
int1 = Int(DateDiff("y", a, b) / freq)

Cells(2, 3) = int1
[/vba]

Автор - SAGE
Дата добавления - 11.11.2014 в 12:06
Treider01 Дата: Вторник, 11.11.2014, 12:26 | Сообщение № 14
Группа: Пользователи
Ранг: Участник
Сообщений: 50
Репутация: 1 ±
Замечаний: 0% ±

Excel 2003
SAGE,

Всё класнно пока вы используете стандартный календарь. К сожалению в моём календаре 360 дней, поэтому стандартные способы решения задач мне не подходят.
 
Ответить
СообщениеSAGE,

Всё класнно пока вы используете стандартный календарь. К сожалению в моём календаре 360 дней, поэтому стандартные способы решения задач мне не подходят.

Автор - Treider01
Дата добавления - 11.11.2014 в 12:26
Pelena Дата: Вторник, 11.11.2014, 12:28 | Сообщение № 15
Группа: Админы
Ранг: Местный житель
Сообщений: 19196
Репутация: 4423 ±
Замечаний: ±

Excel 365 & Mac Excel
Разве можно прибавить неравенство?

Неравенство в результате даёт True (-1) или False (0). Если месяц не истёк, то день более поздней даты будет меньше, чем день более ранней. И в этом случае отнимется лишняя единица


"Черт возьми, Холмс! Но как??!!"
Ю-money 41001765434816
 
Ответить
Сообщение
Разве можно прибавить неравенство?

Неравенство в результате даёт True (-1) или False (0). Если месяц не истёк, то день более поздней даты будет меньше, чем день более ранней. И в этом случае отнимется лишняя единица

Автор - Pelena
Дата добавления - 11.11.2014 в 12:28
SAGE Дата: Вторник, 11.11.2014, 12:30 | Сообщение № 16
Группа: Пользователи
Ранг: Новичок
Сообщений: 25
Репутация: 5 ±
Замечаний: 0% ±

Excel 2007
Treider01,
хммм, а куда делись еще 5 дней?
Тогда нужны дополнительные условия, к примеру не лунный календарь вы используете :o

Ведь по любому в 180 днях будет 30 периодов по 6 дней
а в 179 днях будет 29 периодов
или у вас по другому как-то должно получаться?


Best regards,
SAGE


Сообщение отредактировал SAGE - Вторник, 11.11.2014, 12:46
 
Ответить
СообщениеTreider01,
хммм, а куда делись еще 5 дней?
Тогда нужны дополнительные условия, к примеру не лунный календарь вы используете :o

Ведь по любому в 180 днях будет 30 периодов по 6 дней
а в 179 днях будет 29 периодов
или у вас по другому как-то должно получаться?

Автор - SAGE
Дата добавления - 11.11.2014 в 12:30
Treider01 Дата: Вторник, 11.11.2014, 12:49 | Сообщение № 17
Группа: Пользователи
Ранг: Участник
Сообщений: 50
Репутация: 1 ±
Замечаний: 0% ±

Excel 2003
Pelena,

Спасибо, буду знать, помогли мне сэкономитьвремя и кучу строк где я бы ставил проверки условий.

SAGE,

Но не в каждых 180 днях будет полных 6 месяцев (:
Может я не совсем верно сформулировал задачу - мне всего то нужен был способ решения, Pelena нашла достаточно изящный способ.
Спасибо вам за проявленное внимание.
 
Ответить
СообщениеPelena,

Спасибо, буду знать, помогли мне сэкономитьвремя и кучу строк где я бы ставил проверки условий.

SAGE,

Но не в каждых 180 днях будет полных 6 месяцев (:
Может я не совсем верно сформулировал задачу - мне всего то нужен был способ решения, Pelena нашла достаточно изящный способ.
Спасибо вам за проявленное внимание.

Автор - Treider01
Дата добавления - 11.11.2014 в 12:49
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Подсчёт периодов между датами с точностью до дня! (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

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