Здравствуйте! Нужен совет о том, каким путем лучше пойти. Есть Excel-файл с кучей данных, необходимо, чтобы пользователь мог проверить у ребенка количество полных лет и месяцев исходя из текущей даты и даты рождения. До сих пор использовалась встроенная функция РАЗНДАТ(), но ради защиты от дурака и дополнительных удобств, хочется провернуть то же самое посредством макроса. К сожалению функция DateDiff() не дает разницу в виде полных лет. Существует ли аналог РАЗНДАТ() в VBA или придется городить огород, выстраивая логику вычисления "вручную"?
Здравствуйте! Нужен совет о том, каким путем лучше пойти. Есть Excel-файл с кучей данных, необходимо, чтобы пользователь мог проверить у ребенка количество полных лет и месяцев исходя из текущей даты и даты рождения. До сих пор использовалась встроенная функция РАЗНДАТ(), но ради защиты от дурака и дополнительных удобств, хочется провернуть то же самое посредством макроса. К сожалению функция DateDiff() не дает разницу в виде полных лет. Существует ли аналог РАЗНДАТ() в VBA или придется городить огород, выстраивая логику вычисления "вручную"?iraci
StoTisteg, эта формула хороша, если месяц рождения младше или равен месяцу той даты, на которую мы хотим узнать количество полных лет. Поставьте в дате рождения месяц старе настоящего, и получится не то, что хотелось бы увидеть. То есть правильнее было бы сказать, что эта формула не всегда дает разницу в виде полных лет. Можно конечно допилить, но вдруг есть более простое решение...
StoTisteg, эта формула хороша, если месяц рождения младше или равен месяцу той даты, на которую мы хотим узнать количество полных лет. Поставьте в дате рождения месяц старе настоящего, и получится не то, что хотелось бы увидеть. То есть правильнее было бы сказать, что эта формула не всегда дает разницу в виде полных лет. Можно конечно допилить, но вдруг есть более простое решение... iraci
Сообщение отредактировал iraci - Среда, 12.09.2018, 17:22
Неожиданно нашлось самое простое решение. Оказывается в Excel'е есть возможность, чтобы формула автоматически вставлялась в ячейку при добавлении строки в таблицу (все данные оформлены во встроенную таблицу) и при этом копируется не только формула, но и формат ячейки (ячейки с формулами ес-но защищены от изменений), то есть все ячейки в столбце таблицы окажутся защищаемыми и пользователь не сможет убить в них формулы. Хотя, вероятно, вставку формулы и определение формата ячейки можно осуществить и программно и это, мне кажется, было бы проще, чем корячиться с расчетом полных лет и месяцев вручную. Сейчас необходимости в этом уже нет, но учиться придется еще многому. Спасибо всем, кто принял участие в решении моей проблемы
Неожиданно нашлось самое простое решение. Оказывается в Excel'е есть возможность, чтобы формула автоматически вставлялась в ячейку при добавлении строки в таблицу (все данные оформлены во встроенную таблицу) и при этом копируется не только формула, но и формат ячейки (ячейки с формулами ес-но защищены от изменений), то есть все ячейки в столбце таблицы окажутся защищаемыми и пользователь не сможет убить в них формулы. Хотя, вероятно, вставку формулы и определение формата ячейки можно осуществить и программно и это, мне кажется, было бы проще, чем корячиться с расчетом полных лет и месяцев вручную. Сейчас необходимости в этом уже нет, но учиться придется еще многому. Спасибо всем, кто принял участие в решении моей проблемы iraci
Сообщение отредактировал iraci - Среда, 12.09.2018, 18:04
Function Возраст(ДатаРождения As Date) As Integer Dim flag As Boolean flag = CDate(Day(ДатаРождения) & "." & Month(ДатаРождения) & "." & Year(Date)) > Date Возраст = Year(Date) - Year(ДатаРождения) + flag End Function Function КолМесяцев(ДатаРождения As Date) As Integer Dim flag As Boolean flag = CDate(Day(ДатаРождения) & "." & Month(Date) & "." & Year(Date)) > Date КолМесяцев = DateDiff("m", CDate(ДатаРождения), Date) + flag End Function
Function Возраст(ДатаРождения As Date) As Integer Dim flag As Boolean flag = CDate(Day(ДатаРождения) & "." & Month(ДатаРождения) & "." & Year(Date)) > Date Возраст = Year(Date) - Year(ДатаРождения) + flag End Function Function КолМесяцев(ДатаРождения As Date) As Integer Dim flag As Boolean flag = CDate(Day(ДатаРождения) & "." & Month(Date) & "." & Year(Date)) > Date КолМесяцев = DateDiff("m", CDate(ДатаРождения), Date) + flag End Function
И ? Было 4 года и -3 месяца, т.е. 45 месяцев. По РАЗНДАТ получается 44 полных месяца, что близко и различие списывается, видимо, на округляющую способность DateDiff. Сейчас, после Abs, 4 года и 3 месяца, т.е. 51 месяц...
P.S. Моя версия в копилку: [vba]
Код
Sub test2() Cells(2, 2).Value = Evaluate("DATEDIF(" & CLng(Int(Cells(2, 1).Value)) & "," & CLng(Int(Now)) & ",""Y"")") Cells(2, 3).Value = Evaluate("DATEDIF(" & CLng(Int(Cells(2, 1).Value)) & "," & CLng(Int(Now)) & ",""YM"")") End Sub
И ? Было 4 года и -3 месяца, т.е. 45 месяцев. По РАЗНДАТ получается 44 полных месяца, что близко и различие списывается, видимо, на округляющую способность DateDiff. Сейчас, после Abs, 4 года и 3 месяца, т.е. 51 месяц...
P.S. Моя версия в копилку: [vba]
Код
Sub test2() Cells(2, 2).Value = Evaluate("DATEDIF(" & CLng(Int(Cells(2, 1).Value)) & "," & CLng(Int(Now)) & ",""Y"")") Cells(2, 3).Value = Evaluate("DATEDIF(" & CLng(Int(Cells(2, 1).Value)) & "," & CLng(Int(Now)) & ",""YM"")") End Sub
В VBA я - новичок, благодаря вам, дорогие участники этой темы, мне удалось почерпнуть много интересного и полезного, хотя признаюсь, что ясно пока не все, но дело сделано и на данный момент все работает правильно, еще раз спасибо
В VBA я - новичок, благодаря вам, дорогие участники этой темы, мне удалось почерпнуть много интересного и полезного, хотя признаюсь, что ясно пока не все, но дело сделано и на данный момент все работает правильно, еще раз спасибо iraci