|
|
      С первого взгляда, может показаться, что задача определения суммы процентов по кредиту, начисленных за определенный период, не стоит и выеденного яйца. Конечно, в идиеале все просто: определяем, сколько дней в периоде отняв от конечной даты начальную, умножаем на сумму и процентную ставку, и делим на количество дней в году. Но подумайте, легко ли, например, в Excel построить универсальную формулу, учитывающую такие подводные камни:
- необходимо учесть область совпадения заданного периода со сроком кредита. Например, договор может начинаться до начала нового периода, а заканчиваться в середине или наоборот. Что от чего отнимать?
- если дата погашения попадает на заданный период, то последний день не включается. Если же нет, то включается.
- если речь идет о кредите "интрадэй" (с сегодня на сегодня), то срок кредита все равно учитывается как 1 день.
- так как для кредитов в гривне при расчете процентов считается фактическое количество дней в году, то нужно учитывать високосный год или нет.
- даже в течение небольшого срока кредит может переходить с високосного на не високосный год. Например, с 21.12.2000 по 21.01.2001. Так как доходы по кредиту насчитываются в конце календарного месяца, считать процент нужно с учетом срока кредита в високосном и в не високосном году.
      Каждую из этих проблем по отдельности после небольших размышлений можно решить с помощью комплекса операторов "ЕСЛИ" в Excel или многоуровневых запросов в Access. Но нагромождение вложенных операторов или штук 20-и запросов для одной задачи лично меня приводят в уныние.
      В то же время существует простой и элегантный способ решения этой проблемы или любой другой подобной с использованием VBA. Достаточно в независимом модуле написать свою функцию, которая учитывает все эти тонкости и выдает нужный результат, а потом пользоваться ей так же, как и встроенной функцией. Например, у Вас есть функция, складывающая два числа:
Public Function A_Plus_B (ByVal A, ByVal B)
      A_Plus_B = A + B
End Function
      Для складывания ячейки A1 и B1 достаточно вписать формулу "=A_Plus_B(A1;B1)". Для вычисления в SQL запросе на основе таблицы TABLE1 с полями А и B: "SELECT A, B, A_Plus_B([A];[B]) AS aAndb FROM TABLE1".
В нашем случае используется функция:
ProfitCalc(Сумма; Ставка; Начало договора; Окончание договора; Начало периода; Конец периода).
      Ниже приведены ссылки на файлы-примеры в Excel и Access. Думаю дальнейшие объяснения не нужны. Потренируйтесь с ними, и во всем разберетесь.
      Пример в MS Excel;
      Пример в MS Access.
      ! ОГРАНИЧЕНИЯ:
В Excel данная формула относиться к категории "невыключаемых". Это означает, что защиту от макровирусов включать бесполезно.
      Драйвер ODBC, который используется, например, в связывании данных запроса с Excel не поддерживает пользовательских функций ни в прямом запросе, ни в подлежащем. Только сам Access воспринимает эти функции в своей среде. |
|