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

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

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


Рис.1. Диалоговое окно Расчет амортизации

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

UserForm_Initialize
  1. Активизирует диалоговое окно.
  2. Запрещает ввод данных пользователем в поле Кратность метода.
  3. Назначает клавише Esc функцию кнопки Отмена, а клавише Enter - Вычислить.
  4. Назначает кнопке Вычислить сочетание клавиш Alt+B, а кнопке ОтменаAlt+O.
  5. В группе Тип амортизации при инициализации диалогового окна назначает выбор переключателя Стандартный метод. За счет выбора этого переключателя при инициализации диалогового окна не отображаются надпись кратность метода и соответствующие ей поле и счетчик (рисунок 2).


    Рис.2. Диалоговое окно Расчет амортизации при выбранном переключателе Стандартный метод

  6. Устанавливает для счетчика минимальное значение, равное 2, и шаг изменения значений счетчика, также равный 2, для убыстрения прокрутки счетчика. Промежуточные значения вводятся в поле Кратность метода не с помощью счетчика, а посредством клавиатуры.

SpinButton1_Change
Изменяет значение счетчика, которое вводится в поле Кратность метода.

OptionButton2_Click
Отображает в диалоговом окне надпись Кратность метода и соответствующие ей поле и счетчик.

OptionButton2_Click
Скрывает в диалоговом окне надпись Кратность метода и соответствующие ей поле и счетчик.

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



    Рис.3. Сообщения о несогласованности вводимых данных

  2. Используя финансовую функцию рабочего листа SYD (АМГД) и DDB (ДДОБ) вычисляет величину амортизации выбранным методом.
  3. Удаляет с рабочего листа все ранее созданные графические объекты и внедряет объект WordArt. Подготавливает рабочий лист для вывода результатов вычислений. Выводит полученные данные на рабочий лист и в диалоговое окно (рисунок 4).


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

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

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

Private Sub CommandButton1_Click()
  ' Процедура расчета амортизации
  Dim B As Double
  Dim E As Double
  Dim A As Double
  Dim Ye As Integer
  Dim Yc As Integer
  Dim k As Integer
  Dim Flag As Boolean
  ' В - первоначальная стоимость оборудования, для которого
  ' подсчитывается амортизация
  ' Е - остаточная стоимость оборудования
  ' Ye - время полной амортизации
  ' Yc - период, для которого рассчитывается амортизация
  ' Flag - логическая переменная, равная True, если амортизация
  ' рассчитывается стандартным методом, и False, если методом
  ' k-кратного учета
  Dim n As Integer
  Dim j As Integer
  ' n, j - вспомогательные переменные, используемые для удаления
  ' ранее созданных графических объектов

  ' Считывание в переменные из диалогового окна значений параметров
  B = CDbl(TextBox1.Text)
  E = CDbl(TextBox2.Text)
  Ye = CInt(TextBox3.Text)
  Yc = CInt(TextBox4.Text)
  
  ' Проверка согласованности вводимых данных
  If В < Е Then
    MsgBox "Остаток больше начальной стоимости", vbExclamation, "Амортизация"
    TextBox1.SetFocus
    Exit Sub
  End If

  If Ye < Yc Then
    MsgBox "Ошибка в сроке амортизации", vbExclamation, "Амортизация"
    TextBox3.SetFocus
    Exit Sub
  End If

  ' Определение выбранного переключателя:
  ' если Стандартный, то переменной Flag присваивается True;
  ' если k-кратного учета, то переменной Flag присваивается False
  If OptionButton1.Value = True Then
    Flag = True
  Else
    Flag = False
  End If

  ' Расчет амортизации в зависимости от выбранного метода
  If Flag = True Then
    ' Стандартным методом
    A = Application.SYD(В, Е, Ye, Yc)
  Else
    ' Методом k-кратного учета
    k = CInt(TextBox6.Text)
    A = Application.DDB(B, E, Ye, Yc, k)
  End If

  ' Вывод величины амортизации в диалоговом окне
  If A >= 0.01 Then
    A = Format(A, "Fixed")
  Else
    A = 0
  End If
  TextBox5.Text = CStr(A)

  ' Подготовка рабочего листа для ввода данных
  ' Определения общего числа объектов Shape на рабочем листе
  n = ActiveSheet.Shapes.Count
  ' Удаление с рабочего листа всех ранее созданных объектов Shape
  If n >= 1 Then
    For j = 1 To n
      ActiveSheet.Shapes(j).Select Selection.Delete
    Next j
  End If
  ' Создание объекта WordArt
  ActiveSheet.Shapes.AddTextEffect(msoTextEffect14, "Амортизация", _
    "Impact", 18#, msoTrue, msoFalse, 166.5, 105#).Select
  ' Сдвиг объекта WordArt
  Selection.ShapeRange.IncrementLeft 111#
  Selection.ShapeRange.IncrementTop -100.5
  ' Изменение ширины столбцов А и В и установка в
  ' них режима ввода текста с переносом
  ActiveSheet.Columns("A").Select
  With Selection
    .ColumnWidth = 30
    .WrapText = True
  End With
  ActiveSheet.Columns("B").Select
  With Selection
    .ColumnWidth = 20
    .WrapText = True
  End With
  ' Снятие выделения со столбца В выбором одной ячейки
  ActiveSheet.Range("B1").Select
  ' Ввод заголовков полей на рабочем листе
  With ActiveSheet
    .Range("A1").Value = "Начальная стоимость"
    .Range("A2").Value = "Остаточная стоимость"
    .Range("A3").Value = "Время полной амортизации"
    .Range("A4").Value = "Период, для которого рассчитывается амортизация"
    .Range("A5").Value = "Расчет выполнен"
    .Range("A6").Value = "Величина амортизации"
  End With
  ' Ввод данных в ячейки рабочего листа
  With ActiveSheet
    .Range("B1").Value = B
    .Range("B2").Value = E
    .Range("B3").Value = Ye
    .Range("B4").Value = Yc
    .Range("B6").Value = A
    .Range("B5").WrapText = True
    If Flag = True Then
      .Range("B5").Value = "стандартным методом"
    Else
      .Range("B5").Value = "методом " & CStr(k) & _
                      " кратного учета амортизации"

    End If
  End With
End Sub
Private Sub CommandButton2_Click()
  ' Процедура закрытия диалогового окна
  UserForm1.Hide
End Sub
Private Sub OptionButton1_Click()
  ' Процедура скрывает название, поле и счетчик для ввода
  ' кратности амортизации
  Label6.Visible = False
  TextBox6.Visible = False
  SpinButton1.Visible = False
End Sub
Private Sub OptionButton2_Click()
  ' Процедура делает видимыми название, поле для ввода
  ' кратности амортизации и счетчик
  Label6.Visible = True
  TextBox6.Visible = True
  SpinButton1.Visible = True
 End Sub
Private Sub SpinButton1_Change()
  ' Процедура вводит значение счетчика в поле ввода
  TextBox6.Text = CStr(SpinButton1.Value)
End Sub
Private Sub UserForm_Initialize()
  ' Процедура активизирует диалоговое окно Расчет амортизации
  ' При инициализации окна выбран первый переключатель
  OptionButton1.Value = True
  ' Первоначально название, поле и счетчик для ввода
  ' кратности амортизации не отображаются в диалоговом окне
  TextBox5.Enabled = False
  TextBox6.Visible = False
  Label6.Visible = False
  SpinButton1.Visible = False
  ' Минимальное значение и шаг,
  ' с которым изменяются значения счетчика
  With SpinButton1
    .Min = 2
    .SmallChange = 2
  End With
  ' Функция кнопки Отмена выполняется по умолчанию
  CommandButton2.Default = True
  ' Нажатие клавиши <Esc> эквивалентно нажатию кнопки Отмена
  CommandButton2.Cancel = True
  ' Функция кнопки Вычислить выполняется по нажатию клавиш <Alt>+<D>
  ' или на русской клавиатуре <Alt>+<B>
  CommandButton1.Accelerator = "D"
  ' Функция кнопки Отмена выполняется по нажатию клавиш <Alt>+<J>
  ' или на русской клавиатуре <Alt>+<0>
  CommandButton2.Accelerator = "J"
  UserForm1.Show
End Sub
Текст этого примера можно взять здесь.

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




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