Задача проста - узнать сколько раз по 6 содержится в разнице между этими двумя датами. По мнению екселя минимум один раз. Потом что считается кол-во целых месяцев без учёта дней, а мне надо чтобы считалось именно с учётом дней. Т.е. чтобы в примере только 7 числа настал полный один раз.
Добрый вечер.
Необходимо подсчитать кол-во целых периодов между двумя датами. Период - 6 месяцев.
Задача проста - узнать сколько раз по 6 содержится в разнице между этими двумя датами. По мнению екселя минимум один раз. Потом что считается кол-во целых месяцев без учёта дней, а мне надо чтобы считалось именно с учётом дней. Т.е. чтобы в примере только 7 числа настал полный один раз.Treider01
Надеюсь что у меня, в моём старом екселе, эта функция будет в вба тоже представлена.
Итак
Sub or function not defined
Ещё идеи ?
Ещё вопрос - в той формуле, что я предоставил вычисляется ведь целое кол-во месяцев, разве нет? Почему тогда в формуле Pelena 0 а у меня 1 ? Отрицательных чисел нет. Инт нужен чтобы округлить в меньшую сторону, если число месяцев скажем 9 или 10 разница.
Надеюсь что у меня, в моём старом екселе, эта функция будет в вба тоже представлена.
Итак
Sub or function not defined
Ещё идеи ?
Ещё вопрос - в той формуле, что я предоставил вычисляется ведь целое кол-во месяцев, разве нет? Почему тогда в формуле Pelena 0 а у меня 1 ? Отрицательных чисел нет. Инт нужен чтобы округлить в меньшую сторону, если число месяцев скажем 9 или 10 разница.Treider01
Сообщение отредактировал Treider01 - Понедельник, 10.11.2014, 18:43
Я могу хранить результаты значений переменных в ячейках листа екселя, но это уже сложно. Идеально было бы какие-нибуть решение чисто из VBA. Хотя ваше решение мне нравится. Попробую его реализовать. Спасибо большое.
Я могу хранить результаты значений переменных в ячейках листа екселя, но это уже сложно. Идеально было бы какие-нибуть решение чисто из VBA. Хотя ваше решение мне нравится. Попробую его реализовать. Спасибо большое.Treider01
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]
может, как-то так [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
Сначала подумал, что это просто оператор о котором я не знал. Но вызов через объект WorksheetFunction тоже не помог. У меня её нет.
=РАЗНДАТ()/=DATEDIF - это функция листа. Её нет в справке, но, тем не менее, её можно использовать в формулах. Только НА ЛИСТЕ. ЕМНИП, она есть даже в Excel2000... И да, её нет в контейнере WorksheetFuncton. DATEDIFF() - это функция VBA. Её можно использовать только в коде (макросах). Синтаксис функции для листа и функции для кода - различен и напрямую не взаимозаменяем.
Сначала подумал, что это просто оператор о котором я не знал. Но вызов через объект WorksheetFunction тоже не помог. У меня её нет.
=РАЗНДАТ()/=DATEDIF - это функция листа. Её нет в справке, но, тем не менее, её можно использовать в формулах. Только НА ЛИСТЕ. ЕМНИП, она есть даже в Excel2000... И да, её нет в контейнере WorksheetFuncton. DATEDIFF() - это функция VBA. Её можно использовать только в коде (макросах). Синтаксис функции для листа и функции для кода - различен и напрямую не взаимозаменяем.AndreTM
=РАЗНДАТ()/=DATEDIF - это функция листа. Её нет в справке, но, тем не менее, её можно использовать в формулах. Только НА ЛИСТЕ. ЕМНИП, она есть даже в Excel2000... И да, её нет в контейнере WorksheetFuncton. DATEDIFF() - это функция VBA. Её можно использовать только в коде (макросах). Синтаксис функции для листа и функции для кода - различен и напрямую не взаимозаменяем.
Хмммм =РАЗНДАТ/=DATEDIFF - у меня только в VBA. Если говорит об втором операторе, то в ангийской версии (в моей) это =TRUNC. В более поздних версиях её подключают через Application. WorkSheetFunction. и т.д. У меня не работает как и целая куча других. Поэтому мне их приходится писать вручную.
nilem,
Один вопрос (возможно глупый) - а зачем во втором случае (Day(a) > Day(b) ? Разве можно прибавить неравенство?
=РАЗНДАТ()/=DATEDIF - это функция листа. Её нет в справке, но, тем не менее, её можно использовать в формулах. Только НА ЛИСТЕ. ЕМНИП, она есть даже в Excel2000... И да, её нет в контейнере WorksheetFuncton. DATEDIFF() - это функция VBA. Её можно использовать только в коде (макросах). Синтаксис функции для листа и функции для кода - различен и напрямую не взаимозаменяем.
Хмммм =РАЗНДАТ/=DATEDIFF - у меня только в VBA. Если говорит об втором операторе, то в ангийской версии (в моей) это =TRUNC. В более поздних версиях её подключают через Application. WorkSheetFunction. и т.д. У меня не работает как и целая куча других. Поэтому мне их приходится писать вручную.
nilem,
Один вопрос (возможно глупый) - а зачем во втором случае (Day(a) > Day(b) ? Разве можно прибавить неравенство?
Treider01, думаю что вы вообще правильно выбрали функцию, только не прочитали справку по ней. Если вы считаете количество периодов днях то в параметр также должен быть в днях DateDiff [vba]
[/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]
Treider01, думаю что вы вообще правильно выбрали функцию, только не прочитали справку по ней. Если вы считаете количество периодов днях то в параметр также должен быть в днях DateDiff [vba]
[/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 - Секунды.
вам необходимо было посчитать кол-во целых дней недели а у вас стоит месяц
Всё класнно пока вы используете стандартный календарь. К сожалению в моём календаре 360 дней, поэтому стандартные способы решения задач мне не подходят.
SAGE,
Всё класнно пока вы используете стандартный календарь. К сожалению в моём календаре 360 дней, поэтому стандартные способы решения задач мне не подходят.Treider01
Неравенство в результате даёт True (-1) или False (0). Если месяц не истёк, то день более поздней даты будет меньше, чем день более ранней. И в этом случае отнимется лишняя единица
Неравенство в результате даёт True (-1) или False (0). Если месяц не истёк, то день более поздней даты будет меньше, чем день более ранней. И в этом случае отнимется лишняя единицаPelena
"Черт возьми, Холмс! Но как??!!" Ю-money 41001765434816
Спасибо, буду знать, помогли мне сэкономитьвремя и кучу строк где я бы ставил проверки условий.
SAGE,
Но не в каждых 180 днях будет полных 6 месяцев (: Может я не совсем верно сформулировал задачу - мне всего то нужен был способ решения, Pelena нашла достаточно изящный способ. Спасибо вам за проявленное внимание.
Pelena,
Спасибо, буду знать, помогли мне сэкономитьвремя и кучу строк где я бы ставил проверки условий.
SAGE,
Но не в каждых 180 днях будет полных 6 месяцев (: Может я не совсем верно сформулировал задачу - мне всего то нужен был способ решения, Pelena нашла достаточно изящный способ. Спасибо вам за проявленное внимание.Treider01