Страницы: 1
RSS
Определение даты которая отстоит на N дней от другой даты, если в году 360 дней и используется европейский метод
 
Добрый день,

В Excel легко определяется дата которая отстоит на N дней от другой даты, но только если использовать "фактические дни в году", необходимо просто к нужной дате прибавить необходимое количество дней (N).

Но мне необходимо определить тоже самое, но если "360 дней в году" и используя европейский метод расчета. Разницу между датами можно определить с помощью формулы "дней_между_датами=дней360(дата1;дата2;метод)".

Т.е. известны:
  • дата1
  • дней_между_датами
  • метод = европейский
необходимо найти: дата2 из формулы дней360

может быть уже имеется соответствующая формула в Excel или быть может кто-то уже сталкивался?
 
пример в файле набор разных дат с желаемым результатом
Лень двигатель прогресса, доказано!!!
 
Формулу вроде получилось построить, но получается слишком много промежуточных колонок.
Может есть способ упростить.
 
Zoynels, не всегда требуемую дату можно найти. Например
=ДНЕЙ360("09.01.2019";"28.02.2019";1) дает 49
=ДНЕЙ360("09.01.2019";"01.03.2019";1) дает 52
Это означает, что при дата1=09.01.2019 и дней_между_датами=50 или 51 невозможно найти дата2.
Попробуйте такую функцию, она возвращает дату или -1 в случае, описанном выше
Код
Function День360(дата1 As Date, днейМежду As Long) As Date
Dim n&, p&
  День360 = дата1 + Round(днейМежду * 1.015) 'оценка
  Do
    n = WorksheetFunction.Days360(дата1, День360, 1) - днейМежду
    If n = 0 Then
      Exit Function
    ElseIf n > 0 Then
      If p >= 0 Then День360 = День360 - 1: p = 1 Else Exit Do
    Else
      If p <= 0 Then День360 = День360 + 1: p = -1 Else Exit Do
    End If
  Loop
  День360 = -1 'ошибка
End Function
 
Благодарю, думал обойтись без макросов.
Привел к алгоритму: если число не найдено, то берем предыдущую дату.
Если следовать следующей логике:
=ДНЕЙ360("09.01.2019";"28.02.2019";1) дает 49
=ДНЕЙ360("09.01.2019";"01.03.2019";1) дает 52
то если для 01.03.2019 дает 52, то 51 должна быть в предыдущую дату. Аналогично для 49, 50.
можно конечно поспорить что 49, 50, 51 должна давать 01.03.2019 года, но это больше момент консенсуса с которым мы на работе пришли к утверждению.
Код
Function День360(дата1 As Date, днейМежду As Long) As Date
Dim n&, p&, count_n&
  День360 = дата1 + Round(днейМежду * 1.015) 'оценка
  n = 0
  count_n = 0
  Do
    count_n = count_n + 1
    If count_n >= 10 Then Exit Function
    n = WorksheetFunction.Days360(дата1, День360, 1) - днейМежду
    If n = 0 Then
      If Day(День360) = 31 Then День360 = День360 - 1
      Exit Function
    ElseIf n > 0 Then
      If p >= 0 Then
        День360 = День360 - 1
        p = 1
      Else
        днейМежду = днейМежду - 1
        p = 1
        'Exit Do
      End If
    Else
      If p <= 0 Then
        День360 = День360 + 1
        p = -1
      Else
        'Exit Do
        днейМежду = днейМежду - 1
        p = 1
      End If
    End If
  Loop
  День360 = -1 'ошибка
End Function
Изменено: Zoynels - 09.01.2019 11:46:04
 
вариант формулой в А5 кол-во дней по функции ДНЕЙ360, тестируйте
Код
=ЕСЛИ(ДЕНЬ(ПРОСМОТР(A5;ДНЕЙ360(A6;СТРОКА(ДВССЫЛ(A6&":"&A6+A5+365));1);СТРОКА(ДВССЫЛ(A6&":"&A6+A5+365))))=31;ПРОСМОТР(A5;ДНЕЙ360(A6;СТРОКА(ДВССЫЛ(A6&":"&A6+A5+365));1);СТРОКА(ДВССЫЛ(A6&":"&A6+A5+365)))-1;ПРОСМОТР(A5;ДНЕЙ360(A6;СТРОКА(ДВССЫЛ(A6&":"&A6+A5+365));1);СТРОКА(ДВССЫЛ(A6&":"&A6+A5+365))))
Изменено: Сергей - 09.01.2019 12:02:58 (нашел косяк без проверки не обойтись)
Лень двигатель прогресса, доказано!!!
 
поправил косяк в формуле по проверке 31 числа
Лень двигатель прогресса, доказано!!!
 
=ПРОСМОТР(2;1/(ДНЕЙ360(A1;A1+B2+СТРОКА($1:$100)-1)=B2);A1+B2+СТРОКА($1:$100)-1)

Зы. Формула сработает примерно на 18 лет между датами.
Изменено: Михаил С. - 09.01.2019 22:10:26
Страницы: 1
Наверх