Добрый день! Условие такие. С 10 до 15 лет включительно расход на ребенка составляет 100 рублей за день, а с 16 до 21 – 150. Нужно указать дату рождения и период обучения, а скрипт бы определял сколько дней человек обучался в том или ином возрасте, ну и умножал количество дней на ставку. Например. ДР ребенка 10.01.2001. В период с 01.01.2013 по 10.04.2013 ему было 12 лет и он обучался 100 дней (365 дней в году). Здесь всё просто, потому что период обучения в пределах одного года, а если он обучался с 01.01.2013 по 31.12.2019? То есть в этот период часть дней посчитается по 100 рублей в день, а в 2017 году ему будет 16 лет и будет считаться по 150 в день. При этом, для расчета возраста принимается не дата рождения, а год, в котором ему исполнилось сколько-то лет. То есть, если ребенок 10.01.2001, то 2017 год будет весь считаться по 150, а не 10 дней по 100, а остальные – по 150. Сейчас это приходится вручную делить период по годам, определять високосность, чтобы не ошибиться. Допустим, 01.01.2016 по 10.04.2017. Беру, считаю весь 2016 по 100, затем смотрю дни в 2017 и считаю их по 150. А хотел бы просто указать дату рождения и период. Может кто-то делал что-то похожее или идеей поделится?
Добрый день! Условие такие. С 10 до 15 лет включительно расход на ребенка составляет 100 рублей за день, а с 16 до 21 – 150. Нужно указать дату рождения и период обучения, а скрипт бы определял сколько дней человек обучался в том или ином возрасте, ну и умножал количество дней на ставку. Например. ДР ребенка 10.01.2001. В период с 01.01.2013 по 10.04.2013 ему было 12 лет и он обучался 100 дней (365 дней в году). Здесь всё просто, потому что период обучения в пределах одного года, а если он обучался с 01.01.2013 по 31.12.2019? То есть в этот период часть дней посчитается по 100 рублей в день, а в 2017 году ему будет 16 лет и будет считаться по 150 в день. При этом, для расчета возраста принимается не дата рождения, а год, в котором ему исполнилось сколько-то лет. То есть, если ребенок 10.01.2001, то 2017 год будет весь считаться по 150, а не 10 дней по 100, а остальные – по 150. Сейчас это приходится вручную делить период по годам, определять високосность, чтобы не ошибиться. Допустим, 01.01.2016 по 10.04.2017. Беру, считаю весь 2016 по 100, затем смотрю дни в 2017 и считаю их по 150. А хотел бы просто указать дату рождения и период. Может кто-то делал что-то похожее или идеей поделится?aleksbar
Может и поделится, если кто-то, в свою очередь, не сочтет за труд прочесть правила форума.
Я никого не хотел как-то задеть, но мне показалось, я все сделал по правилам. Файла - примера у меня нет, потому что я считаю все построчно простыми формулами. А в других темах искал, даже на других форумах. Тем про исчисление дней и дат полно, но что-то, что мне поможет, я не нашел.
Может и поделится, если кто-то, в свою очередь, не сочтет за труд прочесть правила форума.
Я никого не хотел как-то задеть, но мне показалось, я все сделал по правилам. Файла - примера у меня нет, потому что я считаю все построчно простыми формулами. А в других темах искал, даже на других форумах. Тем про исчисление дней и дат полно, но что-то, что мне поможет, я не нашел.aleksbar
Здравствуйте! Какое-то решение формулами. Наверное тему нужно перенести
Здравствуйте! Спасибо. Правда у меня при подстановке более ранней даты рождения значения дней становятся отрицательными.
На счет реализации формулами, если это проще, чем VBA, наверное, не принципиально. Просто мне для себя интересно было бы понять решение через VBA. Но я готов прислушаться к мнению знающих людей
Здравствуйте! Какое-то решение формулами. Наверное тему нужно перенести
Здравствуйте! Спасибо. Правда у меня при подстановке более ранней даты рождения значения дней становятся отрицательными.
На счет реализации формулами, если это проще, чем VBA, наверное, не принципиально. Просто мне для себя интересно было бы понять решение через VBA. Но я готов прислушаться к мнению знающих людей aleksbar
Public Function СтоимостьОбучения(ДР, Начало As Date, Окончание As Date) Dim years(), ySt, ySp, yDR, f, tY, tVal, onYst, onYsp, dfDay, rez ySt = DateTime.Year(Начало) ySp = DateTime.Year(Окончание) yDR = DateTime.Year(ДР) ReDim years(ySp - ySt, 1) For f = 0 To ySp - ySt tY = ySt + f - yDR tVal = stavka(tY) years(f, 0) = ySt + f If tVal > 0 Then years(f, 1) = tVal Next f dfDay = DaysInYear(Начало, DateTime.DateSerial(ySt, 12, 31)) rez = dfDay * years(0, 1) For f = 1 To ySp - ySt - 1 dfDay = DaysInYear(DateTime.DateSerial(ySt + f, 1, 1), DateTime.DateSerial(ySt + f, 12, 31)) rez = rez + dfDay * years(f, 1) Next f dfDay = DaysInYear(DateTime.DateSerial(ySp, 1, 1), Окончание) rez = rez + dfDay * years(ySp - ySt, 1) СтоимостьОбучения = rez End Function Function stavka(old) Dim k With ActiveSheet.ListObjects("ставки") For k = 1 To .ListRows.Count If old >= .DataBodyRange(k, 1).Value And old <= .DataBodyRange(k, 2).Value Then stavka = .DataBodyRange(k, 3).Value: Exit Function Next k End With End Function Function DaysInYear(st, sp) DaysInYear = DateTime.DateDiff("d", st, sp) End Function
Public Function СтоимостьОбучения(ДР, Начало As Date, Окончание As Date) Dim years(), ySt, ySp, yDR, f, tY, tVal, onYst, onYsp, dfDay, rez ySt = DateTime.Year(Начало) ySp = DateTime.Year(Окончание) yDR = DateTime.Year(ДР) ReDim years(ySp - ySt, 1) For f = 0 To ySp - ySt tY = ySt + f - yDR tVal = stavka(tY) years(f, 0) = ySt + f If tVal > 0 Then years(f, 1) = tVal Next f dfDay = DaysInYear(Начало, DateTime.DateSerial(ySt, 12, 31)) rez = dfDay * years(0, 1) For f = 1 To ySp - ySt - 1 dfDay = DaysInYear(DateTime.DateSerial(ySt + f, 1, 1), DateTime.DateSerial(ySt + f, 12, 31)) rez = rez + dfDay * years(f, 1) Next f dfDay = DaysInYear(DateTime.DateSerial(ySp, 1, 1), Окончание) rez = rez + dfDay * years(ySp - ySt, 1) СтоимостьОбучения = rez End Function Function stavka(old) Dim k With ActiveSheet.ListObjects("ставки") For k = 1 To .ListRows.Count If old >= .DataBodyRange(k, 1).Value And old <= .DataBodyRange(k, 2).Value Then stavka = .DataBodyRange(k, 3).Value: Exit Function Next k End With End Function Function DaysInYear(st, sp) DaysInYear = DateTime.DateDiff("d", st, sp) End Function
Добрый день! Мне кажется, ближе, чем я когда-либо был Чтобы было нагляднее, я поставил обе ставке по 1, чтобы понять, как система считает дни. В Вашем скрипте вышло так Потом я посчитал всё руками по старинке. Единственное отличие, что у меня нет стоимости дня, а я отталкиваюсь от стоимости года (25000 и 50000 вместо 100 и 150). Но это не влияет на исчисление дней. И у меня получается на 4 дня больше. А еще проблема, что я считаю формулами, а мы тут про VBA. Извините, пытаюсь докопаться до истины. Файл с расчетом прилагаю.
Добрый день! Мне кажется, ближе, чем я когда-либо был Чтобы было нагляднее, я поставил обе ставке по 1, чтобы понять, как система считает дни. В Вашем скрипте вышло так Потом я посчитал всё руками по старинке. Единственное отличие, что у меня нет стоимости дня, а я отталкиваюсь от стоимости года (25000 и 50000 вместо 100 и 150). Но это не влияет на исчисление дней. И у меня получается на 4 дня больше. А еще проблема, что я считаю формулами, а мы тут про VBA. Извините, пытаюсь докопаться до истины. Файл с расчетом прилагаю.aleksbar