Шаг 180.
VBA в MSExcel. Практические приемы программирования на VBA. Тема: расчет маргинальной процентной ставки. Практика

    На этом шаге мы рассмотрим основные моменты создания указанного приложения.

    Для решения задачи нахождения текущего объема вклада и нахождения маргинальной процентной ставки с помощью редактора пользовательских форм создадим диалоговое окно Маргинальная процентная ставка (рисунок 1).


Рис.1. Диалоговое окно Маргинальная процентная ставка

    Обсудим, как приведенная ниже программа решает перечисленные выше задачи и что происходит в программе.

UserForm_Initialize
  1. Активизирует диалоговое окно.
  2. Запрещает ввод данных пользователем в поля Текущий объем ссуды и Маргинальная процентная ставка.
  3. Назначает клавише Esc функцию кнопки Отмена, а клавише Enter - Вычислить.
  4. Связывает с кнопками Вычислить и Отмена всплывающие подсказки.

Нажатие кнопки Вычислить запускает на выполнение процедуру CommandButton1_Click
  1. Проверяет, являются ли вводимые данные числами. Если хотя бы одно из них не является числом, то на экране отображается соответствующее информационное сообщение с установкой фокуса на поле, где произведен некорректный ввод данных.
  2. Проверяет, будет ли ссуда меньше, чем возвращаемая сумма денег. Если ссуда больше этой суммы, то отображается сообщение с указанием, на сколько ссуда меньше возвращаемой суммы денег (рисунок 2).


    Рис.2. Сообщение о некорректном вводе данных

  3. Используя финансовую функцию рабочего листа, ПС (PV) вычисляет чистый текущий объем ссуды при введенной процентной ставке.
  4. Используя метод GoalSeek (подбор параметра), находит маргинальную процентную ставку, т.е. ставку, при которой чистый текущий объем ссуды равен величине самой ссуды.
  5. Подготавливает рабочий лист для вывода результатов вычислений. Выводит полученные данные на рабочий лист и в диалоговое окно (рисунок 3).


    Рис.3. Отчет, выводимый на рабочем листе программой расчета маргинальной процентной ставки

Нажатие кнопку Отмена запускает на выполнение процедуру CommandButton2_Click
Закрывает диалоговое окно.

    Приведем текст приложения.

Private Sub CommandButton1_Click()
  ' Процедура расчета маргинальной процентной ставки
  Dim i As Double
  Dim p As Double
  Dim A As Double
  Dim iMarg As Double
  Dim pPure As Double
  Dim n As Integer
  ' n - число выплат
  ' p - размер ссуды
  ' A - размер одной выплаты
  ' i - процентная ставка
  ' pPure - текущий объем ссуды,
  ' на рабочем листе вычисляется функцией ПЗ
  ' iMarg - маргинальная процентная ставка
  
  ' Проверка того, чтобы введенные
  ' в диалоговое окно данные являются числами
  If IsNumeric(TextBox1.Text) = False Then
    MsgBox "Ошибка в числе выплат", _
         vbInformation, "Маргинальная ставка"
    TextBox1.SetFocus
    Exit Sub
  End If
  If IsNumeric(TextBox2.Text) = False Then
    MsgBox "Ошибка в размере ссуды", _
       vbInformation, "Маргинальная ставка"
    TextBox2.SetFocus
    Exit Sub
  End If
  If IsNumeric(UserForm1.TextBox3.Text) = False Then
    MsgBox "Ошибка в размере одной выплаты", _
       vbInformation, "Маргинальная ставка"
    TextBox3.SetFocus
    Exit Sub
  End If
  If IsNumeric(TextBox4.Text) = False Then
    MsgBox "Ошибка в процентной ставке", _
       vbInformation, "Маргинальная ставка"
    TextBox4.SetFocus
    Exit Sub
  End If
  ' Ввод данных в переменные из диалогового окна
  n = CInt(TextBox1.Text)
  p = CDbl(TextBox2.Text)
  A = CInt(TextBox3.Text)
  i = CInt(TextBox4.Text) / 100
  ' Проверка согласованности ввода данных
  If n * А < р Then
    MsgBox "Возвращается на " & CStr(Format(р - n * A, "Fixed")) _
       & " меньше размера ссуды", vbExclamation, "Маргинальная ставка"
    TextBox1.SetFocus
    Exit Sub
  End If
  ' Изменение ширины столбцов и задание режима ввода
  ' текста с переносом
  ActiveSheet.Columns("A:A").Select
  With Selection
    .ColumnWidth = 20
    .WrapText = True
  End With
  ActiveSheet.Columns("B:B").Select
  Selection.ColumnWidth = 12
  ' Выбор ячейки В2 для того, чтобы снять выделение со столбца В
  ActiveSheet.Range("B2").Select
  ' Ввод названий записей на рабочем листе
  With ActiveSheet
    .Range("A2").Value = "Число выплат"
    .Range("A3").Value = "Размер ссуды"
    .Range("A4").Value = "Размер одной выплаты"
    .Range("A5").Value = "Процентная ставка"
    .Range("A6").Value = "Текущий объем ссуды"
    .Range("A7").Value = "Маргинальная процентная ставка"
    .Range("A8").Value = "Маргинальный чистый текущий объем ссуды"
    .Range("B8").Activate
  End With
  ' Расчет чистого текущего объема ссуды
  pPure = Application.PV(i, n, -A)
  ' Нахождение маргинальной процентной ставки
  ' с помощью команды Подбор параметра.
  ' Ввод данных в ячейки активного рабочего листа
  ' и задание процентного и денежного форматов в ячейках
  With ActiveSheet
    .Range("B2").Value = n
    .Range("B3").NumberFormat = "#,##0$"
    .Range("B3").Value = p
    .Range("B4").NumberFormat = "#,##0$"
    .Range("B4").Value = A
    .Range("B5").NumberFormat = "0.00%"
    .Range("B5").Value = i
    .Range("B7").NumberFormat = "0.00%"
    ' Ввод начального приближения для маргинальной процентной ставки
    .Range("B7").Value = i
    ' Ввод формулы расчета
    .Range("B8").FormulaLocal = "=ПС(B7;B2;-B4)"
    .Range("B6").Value = .Range("B8").Value
    ' Выполнение команды Подбор параметра
    .Range("B8").GoalSeek Goal:=p, ChangingCell:=.Range("B7")
    ' Присвоение найденного значения маргинальной процентной ставки
    ' переменной iMarg
    iMarg = .Range("B7").Value
  End With
  ' Переформатирование найденных значений
  ' и вывод их в диалоговом окне
  TextBox5.Text = CStr(Format(pPure, "Fixed"))
  TextBox6.Text = CStr(Format(iMarg * 100, "Fixed"))
End Sub
Private Sub CommandButton2_Click()
  ' Процедура закрытия диалогового окна
  UserForm1.Hide
End Sub
Private Sub UserForm_Initialize()
  ' Процедура вызова диалогового окна.
  ' Поля
    ' Чистый текущий объем ссуды
    ' и Маргинальная процентная ставка
    ' доступны для вывода информации, но не для ее ввода
  TextBox5.Enabled = False
  TextBox6.Enabled = False
  ' Клавише <Enter> назначена функция кнопки Вычислить
  ' Кнопке Вычислить назначен текст всплывающей подсказки
  With CommandButton1
    .Default = True
    .ControlTipText = "Расчет и составление отчета на рабочем листе"
  End With
  ' Клавише <Esc> назначена функция кнопки Отмена
  ' Кнопке Отмена назначен текст всплывающей подсказки
  With CommandButton2
    .Cancel = True
    .ControlTipText = "Кнопка отмены"
  End With
  UserForm1.Show
End Sub
Текст этого примера можно взять здесь.

    На следующем шаге мы закончим изучение этого вопроса.




Предыдущий шаг Содержание Следующий шаг