logo
Разработка программного модуля на языке VBA для расчета и сравнения простых и сложных процентов по депозитам

4. СТРУКТУРА ДАННЫХ И ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ

В разработанном программном модуле на языке VBA для расчета простых и сложных процентов по депозитам используются функция вызова (UserForm_.Show) и функция закрытия (Unload Me) пользовательских форм:

Private Sub OptionButton1_Click()

Unload Me

UserForm2.Show

End Sub

Private Sub OptionButton2_Click()

Unload Me

UserForm3.Show

End Sub

Private Sub OptionButton3_Click()

Unload Me

UserForm4.Show

End Sub

При написании подпрограммы на пользовательскую форму расчета суммы инвестированного капитала (Rn) по схеме простого процента используется подпрограмма с использованием формулы:

Rn = Fix(P * (1 + i * R / 100))

Функция Fix позволяет отбросить дробную часть числа, что является актуальным в условиях действующей системы округления в банковской сфере.

При написании программы на пользовательскую форму расчета депозита по схеме простого процента используется следующая подпрограмма, в которой используются макросы (выделены зеленым цветом) вывода таблицы на печать и формирования таблицы:

Private Sub CheckBox1_Click()

If Not CheckBox1 Then

Exit Sub

End If

End Sub

Private Sub CommandButton1_Click()

Dim P As Double

Dim R As Double

Dim n As Double

Dim str_P

Dim Rn As Double

Dim str_R

Dim str_n

Dim a As String, b As String, c As String, d As String

Dim i As Integer

Dim st As String

str_n = TextBox1.Value

If IsGoodNum1(str_n) = False Then

MsgBox (NotNumberГод(str_n))

Exit Sub

End If

str_P = TextBox2.Value

If IsGoodNum2(str_P) = False Then

MsgBox (NotNumberКап(str_P))

Exit Sub

End If

str_R = TextBox3.Value

If IsGoodNum3(str_R) = False Then

MsgBox (NotNumberПроц(str_R))

Exit Sub

End If

Worksheets("Лист1").Range("B1") = "Простой процент"

Worksheets("Лист1").Range("A1") = "Год"

Worksheets("Лист1").Range("A3") = 0

Worksheets("Лист1").Range("B2") = "Сумма"

Worksheets("Лист1").Range("B3") = TextBox2.Value

P = Val(str_P)

n = Val(str_n)

R = Val(str_R)

For i = 1 To n

Rn = Fix(P * (1 + i * R / 100))

a = "Инвестируемый капитал Rn за " + Chr(10)

b = "-й год по схеме простого процента равен" + Str(Rn)

st = st + Str(i) + b + Chr(10)

Cells(i + 3, 1) = i

Cells(i + 3, 2) = Rn

Next i

Unload Me

формирование таблицы

Range("A1:A2").Select

With Selection

.HorizontalAlignment = xlCenter

.VerticalAlignment = xlCenter

.WrapText = False

.Orientation = 0

.AddIndent = False

.IndentLevel = 0

.ShrinkToFit = False

.ReadingOrder = xlContext

.MergeCells = False

End With

Selection.Merge

Range("A1:B8").Select

Selection.Borders(xlDiagonalDown).LineStyle = xlNone

Selection.Borders(xlDiagonalUp).LineStyle = xlNone

With Selection.Borders(xlEdgeLeft)

.LineStyle = xlContinuous

.ColorIndex = 0

.TintAndShade = 0

.Weight = xlThin

End With

With Selection.Borders(xlEdgeTop)

.LineStyle = xlContinuous

.ColorIndex = 0

.TintAndShade = 0

.Weight = xlThin

End With

With Selection.Borders(xlEdgeBottom)

.LineStyle = xlContinuous

.ColorIndex = 0

.TintAndShade = 0

.Weight = xlThin

End With

With Selection.Borders(xlEdgeRight)

.LineStyle = xlContinuous

.ColorIndex = 0

.TintAndShade = 0

.Weight = xlThin

End With

With Selection.Borders(xlInsideVertical)

.LineStyle = xlContinuous

.ColorIndex = 0

.TintAndShade = 0

.Weight = xlThin

End With

With Selection.Borders(xlInsideHorizontal)

.LineStyle = xlContinuous

.ColorIndex = 0

.TintAndShade = 0

.Weight = xlThin

End With

Range("A1:A2").Select

MsgBox (a & st)

c = InputBox("Введите название банка")

d = InputBox("Введите название депозита")

Worksheets("Лист1").Range("C1") = c

Worksheets("Лист1").Range("C2") = d

вывод на печать

If CheckBox1 Then

Application.Visible = True

Unload Me

Range("A1:M30").Select

ActiveWindow.SelectedSheets.PrintPreview

End If

End Sub

Private Sub CommandButton2_Click()

Unload Me

UserForm1.Show

End Sub

При написании подпрограммы на пользовательскую форму расчета инвестированного капитала (Fn) по схеме сложного процента используется аналогичная подпрограмма только с использованием другой формулы:

Fn = Fix(P * (1 + R / 100) ^ i)

При написании подпрограммы на пользовательскую форму сравнительного анализа расчета депозитов по схемам простого и сложного процентов используется следующая подпрограмма, которая соединяет в себе расчет двух видов процента (с использованием двух указанных выше формул) и макрос построения результирующего графика:

Dim g As String

Private Sub CheckBox1_Click()

If Not CheckBox1 Then

Exit Sub

End If

End Sub

Public Sub grafik()

Dim n As Integer

n = Application.CountA(Worksheets(1).Range("A:A"))

График Макрос

Range("B3:C8").Select

ActiveSheet.Shapes.AddChart.Select

ActiveChart.SetSourceData Source:=Range("Лист1!$B$3:$C$8")

ActiveChart.ChartType = xlBarClustered

ActiveChart.Axes(xlCategory).Select

ActiveChart.SeriesCollection(1).XValues = "=Лист1!$A$3:$A$8"

ActiveChart.SeriesCollection(1).Name = "=Лист1!$B$1"

ActiveChart.SeriesCollection(2).Name = "=Лист1!$C$1"

ActiveChart.ApplyLayout (8)

ActiveChart.Axes(xlCategory).AxisTitle.Select

ActiveChart.Axes(xlCategory, xlPrimary).AxisTitle.Text = "Год"

ActiveChart.Axes(xlValue).AxisTitle.Select

ActiveChart.Axes(xlValue, xlPrimary).AxisTitle.Text = "Сумма"

ActiveChart.ChartTitle.Select

ActiveChart.ChartTitle.Text = "Сравнение процентов"

ActiveChart.Export "grafic.gif" экспортируем в картинку

g = "grafic.gif" переменной присваиваем имя картинки

Image1.Picture = LoadPicture(g) загружаем картинку в image1 на форме

Worksheets(1).ChartObjects.Delete

End Sub

Private Sub CommandButton1_Click()

Dim P As Double

Dim Rn As Double

Dim Fn As Double

Dim R As Double

Dim n As Double

Dim a As String, b As String, c As String, d As String, e As String, f As String

Dim i As Integer

Dim Rt As String

Dim Ft As String

Dim str_P

Dim str_R

Dim str_n

Worksheets("Лист1").Range("B1") = "Простой процент"

Worksheets("Лист1").Range("A1") = "Год"

Worksheets("Лист1").Range("A3") = 0

Worksheets("Лист1").Range("B2") = "Сумма"

Worksheets("Лист1").Range("C2") = "Сумма"

Worksheets("Лист1").Range("B3") = TextBox2.Value

Worksheets("Лист1").Range("C1") = "Сложный процент"

Worksheets("лист1").Range("C3") = TextBox2.Value

str_n = TextBox1.Value

If IsGoodNum1(str_n) = False Then

MsgBox (NotNumberГод(str_n))

Exit Sub

End If

str_P = TextBox2.Value

If IsGoodNum2(str_P) = False Then

MsgBox (NotNumberКап(str_P))

Exit Sub

End If

str_R = TextBox3.Value

If IsGoodNum3(str_R) = False Then

MsgBox (NotNumberПроц(str_R))

Exit Sub

End If

P = Val(str_P)

n = Val(str_n)

R = Val(str_R)

For i = 1 To n

Rn = Fix(P * (1 + i * R / 100))

Fn = Fix(P * (1 + R / 100) ^ i)

a = "Инвестируемый капитал Rn за " + Chr(10)

b = "-й год по схеме простого процента равен " + Str(Rn)

Rt = Rt + Str(i) + b + Chr(10)

c = "Инвестируемый капитал Fn за " + Chr(10)

d = "-й год по схеме сложного процента равен " + Str(Fn)

Ft = Ft + Str(i) + d + Chr(10)

Cells(i + 3, 1) = i

Cells(i + 3, 2) = Rn

Cells(i + 3, 3) = Fn

Next i

формирование таблицы

Range("A1:A2").Select

With Selection

.HorizontalAlignment = xlCenter

.VerticalAlignment = xlBottom

.WrapText = False

.Orientation = 0

.AddIndent = False

.IndentLevel = 0

.ShrinkToFit = False

.ReadingOrder = xlContext

.MergeCells = False

End With

Selection.Merge

With Selection

.HorizontalAlignment = xlCenter

.VerticalAlignment = xlCenter

.WrapText = False

.Orientation = 0

.AddIndent = False

.IndentLevel = 0

.ShrinkToFit = False

.ReadingOrder = xlContext

.MergeCells = True

End With

Range("A1:C8").Select

Selection.Borders(xlDiagonalDown).LineStyle = xlNone

Selection.Borders(xlDiagonalUp).LineStyle = xlNone

With Selection.Borders(xlEdgeLeft)

.LineStyle = xlContinuous

.ColorIndex = 0

.TintAndShade = 0

.Weight = xlThin

End With

With Selection.Borders(xlEdgeTop)

.LineStyle = xlContinuous

.ColorIndex = 0

.TintAndShade = 0

.Weight = xlThin

End With

With Selection.Borders(xlEdgeBottom)

.LineStyle = xlContinuous

.ColorIndex = 0

.TintAndShade = 0

.Weight = xlThin

End With

With Selection.Borders(xlEdgeRight)

.LineStyle = xlContinuous

.ColorIndex = 0

.TintAndShade = 0

.Weight = xlThin

End With

With Selection.Borders(xlInsideVertical)

.LineStyle = xlContinuous

.ColorIndex = 0

.TintAndShade = 0

.Weight = xlThin

End With

With Selection.Borders(xlInsideHorizontal)

.LineStyle = xlContinuous

.ColorIndex = 0

.TintAndShade = 0

.Weight = xlThin

End With

Range("A1:A2").Select

grafik

MsgBox (a & Rt & c & Ft)

e = InputBox("Введите название банка")

f = InputBox("Введите название депозита")

Worksheets("Лист1").Range("D1") = e

Worksheets("Лист1").Range("D2") = f

График Макрос

Range("B3:C8").Select

ActiveSheet.Shapes.AddChart.Select

ActiveChart.SetSourceData Source:=Range("Лист1!$B$3:$C$8")

ActiveChart.ChartType = xlBarClustered

ActiveChart.Axes(xlCategory).Select

ActiveChart.SeriesCollection(1).XValues = "=Лист1!$A$3:$A$8"

ActiveChart.SeriesCollection(1).Name = "=Лист1!$B$1"

ActiveChart.SeriesCollection(2).Name = "=Лист1!$C$1"

ActiveChart.ApplyLayout (8)

ActiveChart.Axes(xlCategory).AxisTitle.Select

ActiveChart.Axes(xlCategory, xlPrimary).AxisTitle.Text = "Год"

ActiveChart.Axes(xlValue).AxisTitle.Select

ActiveChart.Axes(xlValue, xlPrimary).AxisTitle.Text = "Сумма"

ActiveChart.ChartTitle.Select

ActiveChart.ChartTitle.Text = "Сравнение процентов"

вывод на печать

If CheckBox1 Then

Application.Visible = True

Unload Me

Range("A1:M30").Select

ActiveWindow.SelectedSheets.PrintPreview

End If

End Sub

Private Sub CommandButton2_Click()

Unload Me

UserForm1.Show

End Sub

В следующем программном модуле, который проверяет правильность ввода данных, используются функции для проверки данных. Данные проверяются с помощью функций, вызываемых подпрограммой. Если переменная не удовлетворяет определенным условиям (ввод отрицательного числа, ввод символов, отсутствие ввода и количество лет, не превышающее 5-ти лет), то подпрограмма выдает название ошибки и совершает преждевременный выход из подпрограммы. В функциях используются условия, которые определяют ошибку в зависимости от введенных данных. Такая функция используется для проверки каждой из входных данных. Данные функции написаны в «Module1»:

проверка n

Public Function IsGoodNum1(var_n) As Boolean

If IsNumeric(var_n) = True And Val(var_n) > 0 And Val(var_n) < 6 Then

IsGoodNum1 = True

Else

IsGoodNum1 = False

End If

End Function

Public Function NotNumberГод(var_n) As String

NotNumber = "Ошибка ввода данных"

If var_n = "" Then

NotNumberГод = "Вы не ввели количество лет"

End If

If Val(var_n) > 5 Then

NotNumberГод = "Период не более 5-ти лет"

End If

If Val(var_n) < 0 Then

NotNumberГод = "Вы ввели отрицательное число"

End If

If IsNumeric(var_n) = False Then

NotNumberГод = "Вы ввели не число"

End If

End Function

проверка P

Public Function IsGoodNum2(var_P) As Boolean

If IsNumeric(var_P) = True And Val(var_P) > 0 Then

IsGoodNum2 = True

Else

IsGoodNum2 = False

End If

End Function

Public Function NotNumberКап(var_P) As String

NotNumberКап = "Ошибка ввода данных"

If var_P = "" Then

NotNumberКап = "Вы не ввели капитал"

If Val(var_P) < 0 Then

NotNumberКап = "Вы ввели отрицательное число"

End If

If IsNumeric(var_P) = False Then

NotNumberКап = "Вы ввели не число"

End If

End Function

проверка R

Public Function IsGoodNum3(var_R) As Boolean

If IsNumeric(var_R) = True And Val(var_R) > 0 Then

IsGoodNum3 = True

Else

IsGoodNum3 = False

End If

End Function

Public Function NotNumberПроц(var_R) As String

NotNumberПроц = "Ошибка ввода данных"

If var_R = "" Then

NotNumberПроц = "Вы забыли ввести процент"

End If

If Val(var_R) < 0 Then

NotNumberКап = "Вы ввели отрицательное число"

End If

If IsNumeric(var_R) = False Then

NotNumberПроц = "Вы ввели не число"

End If

End Function

К кнопкам управления (CommandButton1 - «РАСЧЕТ СТОИМОСТИ ДЕПОЗИТА», CommandButton2 - «УДАЛИТЬ»), находящихся на листе Excel, привязаны следующие подпрограммы, с использованием макросов удаления данных и очищения форматированной таблицы:

Private Sub CommandButton1_Click()

UserForm1.Show

End Sub

Private Sub CommandButton2_Click()

удаление данных с листа

Cells.Select

Selection.ClearContents

Range("A1").Select

очищение форматированной таблицы

Range("A1:C8").Select

With Selection

.HorizontalAlignment = xlGeneral

.VerticalAlignment = xlCenter

.WrapText = False

.Orientation = 0

.AddIndent = False

.IndentLevel = 0

.ShrinkToFit = False

.ReadingOrder = xlContext

.MergeCells = True

End With

Selection.UnMerge

Selection.Borders(xlDiagonalDown).LineStyle = xlNone

Selection.Borders(xlDiagonalUp).LineStyle = xlNone

Selection.Borders(xlEdgeLeft).LineStyle = xlNone

Selection.Borders(xlEdgeTop).LineStyle = xlNone

Selection.Borders(xlEdgeBottom).LineStyle = xlNone

Selection.Borders(xlEdgeRight).LineStyle = xlNone

Selection.Borders(xlInsideVertical).LineStyle = xlNone

Selection.Borders(xlInsideHorizontal).LineStyle = xlNone

Range("A1").Select

End Sub

Для того, чтобы книга Excel открывада сразу пользовательскую форму «Выбор схемы процента» (UserForm1) в «ЭтаКнига» была записана следующая подпрограмма:

Private Sub Workbook_Open()

Application.Visible = False

UserForm1.Show

End Sub