Самоучитель VBA

         

Цель урока



В уроке разрабатывается приложение, позволяющее управлять размерами диалогового окна и вычислять текущий объем вклада при равномерных выплатах и постоянной процентной ставке. Конструируя данное приложение, вы узнаете, как:

Управлять размерами диалогового окна

Задавать последовательности элементов управления в виде массива объектов

Определять текущий объем вклада

Задавать параметры счетчика

Кроме того, в этом уроке приведены примеры, показывающие, как можно управлять размерами элементов управления, перемещать их программно и при помощи метода drag-and-drop по поверхности диалогового окна.



Перемещение элемента управления при помощи операции drag-and-drop


Рассмотрим диалоговое окно новые похождения колобка (рис. У6.5), с которым связана ниже приведенная программа, дающая два простых примера программирования операций drag-and-drop.

Рис. У6.5. Диалоговое окно Новые похождения Колобка

Если расположить указатель мыши на Колобке и нажать правую кнопку становится печальным Если далее перемещать указатель мыши при нажатой правой кнопке по поверхности диалогового окна, то колобок будет передвигаться вслед за указателем мыши. Настроение колобка запрограммировано в процедурах веселыйКолобок и печальныйколобок. Изменение настроения колобка при нажатии и отпускании правой клавиши мыши запрограммировано в процедурах Image1_MouseDown и Image1_MouseUp, а перемещение — в Imagel_MouseMove.

Если расположить указатель мыши на надписи колобок и переместить указатель мыши при нажатой правой кнопке в область второй надписи, обведенной рамкой, а там уже отпустить правую клавишу мыши, то во вторую надпись будет скопирован текст колобок. Процедура Labeli_MouseMove копирует заголовок первой надписи в объект Dataobject, играющий роль буфера обмена, процедура Label2_BeforeDragOver контролирует операции drag-and-drop во время перемещения указателя мыши, a Label2_BeforeDropOrPaste в момент отпускания правой кнопки мыши.

'

' Определение переменной уровня модуля



Dim Kono6oкDataObject As DataObject

'

Private Sub imagel_MouseDown(ByVal Button As Integer,

ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)

If Button = 1 Then

'ПечальныйКолобок

End If

End Sub

Private Sub Imagel_MouseUp(ByVal Button As Integer,

ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)

If Button = 1 Then ВеселыйКолобок

End If

End Sub

Private Sub Imagel_MouseMove(ByVal Button As Integer,

ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)

If Button = 1 Then

IfX^2+Y^2 = 0 Then A = 0 В = 0

Else

A = X / Sqr(X л 2 + Y л 2) В = Y / SqrtX л 2 + Y л 2)

End if With Imagel

.Top = Imagel.Top + В

.Left = Imagel.Left + A


End With

End If

End Sub

'

Private Sub Labell_MouseMove(ByVal Button As Integer,

ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single)

If Button = 1 Then

Set КoлoбoкDataObject = New DataObject

Dim ТипПеремещения As Integer

Kono6oKDataObject.SetText Labell.Caption

ТипПеремещения = КoлoбoкDataObject.StartDrag

End If

End Sub

Private Sub Label2_BeforeDragOver(ByVal Cancel As MSForms.ReturnBoolean,

ByVal Data As MSForms.DataObject,

ByVal X As Single, ByVal Y As Single,

ByVal DragState As Long,

ByVal Effect As MSForms.ReturnEffeet,

ByVal Shift As Integer)

Cancel = True

Effect = fmDropEffectCopy

End Sub

Private Sub Label2_BeforeDropOrPaste(ByVal Cancel

As MSForms.ReturnBoolean,

ByVal Action As Long,

ByVal Data As MSForms.DataObject,

ByVal X As Single,

ByVal Y As Single,

ByVal Effect As MSForms.ReturnEffeet,

ByVal Shift As Integer)

Cancel = True

Effect = fmDropEffectCopy

Label2. Caption = KолoбoкDataObject .GetText

End Sub

Private Sub UserForm_Initialize()

'

Labell.BorderStyle = fmBorderStyleSingle

Label2.BorderStyle = fmBorderStyleSingle

With Imagel

.PictureAlignment = fmPictureAlignmentTopLeft

.PictureSizeMode = fmPictureSizeModeZoom

.BorderStyle = fmBorderStyleNone End With

'ВеселыйКолобок

End Sub

Sub ВесельйКолобок()

Imagel.Picture = LoadPicture("Dot_a.bmp")

End Sub

'

Sub ПечальныйКолобок()

Image1.. Picture = LoadPicture ("Dotl_a.bmp"

) End Sub




Практика



Для решения задачи нахождения чистого текущего объема инвестиций и управления размером диалогового окна с помощью редактора пользовательских форм cоздадим диалоговое окно Чистый текущий объем инвестиций (рис. У6.1). Отметим, что данное приложении предназначено для расчета до шести финансовых операций (инвестиций и прибыли).

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

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

Рис. У6.1. Диалоговое окно Чистый текущий объем инвестиций

Рис. У6.2. Диалоговое окно

Чистый текущий объем инвестиций со значением счетчика

Число операций равным 4


UserForm_Initialize

Активизирует диалоговое окно.

Назначает клавише <Esc> функцию кнопки отмена, а клавише <Enter> — вычислить.

Устанавливает максимальное и минимальное значения счетчика, а также его значение при инициализации диалогового окна.

Нажатие кнопки вычислить запускает на выполнение процедуры

CoramandButtonl_Click

Создает массив, элементами которого являются инвестиции и прибыли, и массив лет, когда совершались операции. 5. Проверяет корректность ввода данных. 6. Вычисляет чистый текущий объем инвестиций.

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

CoramandButton2_Click

Закрывает диалоговое окно.

SpinButtonl Change

Изменяет при помощи счетчика размер диалоге вого окна благодаря управлению свойством width в зависимости от введенного числа операций.

'

' Переменная уровня модуля

'

Dim n As Integer

'

' n - число операций

'

Private Sub CommandButtonl_Click()

'

' Процедура расчета чистого текущего объема инвестиций


'

Dim Операции(1 То 6) As Double

Dim Годы(1 То 6) As Byte

Dim Процент As Double

Dim i As Integer

Dim ТекущийОбъем As Double

' Операции - массив инвестиций и прибылей

' Годы - массив лет, когда совершались операции

' Процент - годовая процентная ставка

' ТекущийОбъем - объем чистого начального.вклада

' i - вспомогательная переменная

'

Dim ПолеВвода(1 То 6, 1 To 2) As Object

'

' Вспомогательный массив объектов, который будет

' использоваться при вводе данных из полей ввода

' Задание компонент массива объектов

'

Set ПолеВвода(1, 1) = TextBoxl

Set ПолеВвода (2, 1) = TextBox2

Set ПолеВвода(3, 1) = TextBox3

Set ПолеВвода(4, 1) = TextBox4

Set ПолеВвода(5, 1) = TextBox5

Set ПолеВвода(6, 1) = TextBox6

Set ПолеВвода(1, 2) = TextBoxl0

Set ПолеВвода(2, 2),= TextBoxl1

Set ПолеВвода(3, 2) '= TextBoxl2

Set ПолеВвода(4, 2) = TextBoxl3

Set ПолеВвода(5, 2) = TextBoxl4

Set ПолеВвода(6, 2) = TextBoxl5

'

' Проверка того, являются ли введенные в диалоговом окне значения числами

'

For i = 1 То n

If IsNumeric(ПолеВвода(i, 1).Text) = False Then

MsgBox "Ошибка в размере прибыли или инвестиции",

vblnformation, "Расчет инвестиции" ПолеВвода(i, l).SetFocus

Exit Sub

End If

Next i

For i = 1 To n

If IsNumeric(ПолеВвода(i, 2).Text) = False Then

MsgBox "Ошибка в годе", vblnformation, "Расчет инвестиции" ПолеВвода(i, 2).SetFocus Exit Sub End If Next i

If isNumeric(TextBoxS.Text) = False Then

MsgBox "Ошибка в процентной ставке", vblnformation,

"Расчет инвестиции" TextBoxS.SetFocus

Exit Sub

End If

' Ввод в массивы Операции и Годы данных из диалогового окна

'

For i = 1 То n

Операции(i) = CDbl(ПолеВвода(i, l).Text)

Годы(1) = CByte(ПолеВвода(i, 2).Text) Next i

'

' Ввод процентной ставки '

Процент = CDbl(TextBoxS.Text) / 100

' Расчет чистого текущего объема инвестиции

ТекущийОбъем = 0 For i = 1 То п

ТекущийОбъем = ТекущийОбъем + Операции(i) / (1 + Процент) ^ Годы(1)



Next i

' Вывод в диалоговом окне величины чистого текущего объема инвестиций

'

ТекущийОбъем = Format(ТекущийОбъем, "Fixed")

TextBox9.Text = CStr(ТекущийОбъем)

End Sub

Private Sub CommandButton2_Click()

'

' Процедура закрывает диалоговое окно

'

UserForml.Hide End Sub

'

Private Sub SpinButtonl_Change()

'

' Процедура изменения размера диалогового окна

' в зависимости от введенного числа операций

' Вывод числа операций со счетчика в поле ввода

'

TextBoxV.Text = CStr(SpinButtonl.Value)

'

' Присвоение значения переменной n (числа операций) из поля ввода

n = CInt(TextBox7.Text)

'

' Изменение размера диалогового окна

'

UserForml.Width = 120 + (n - 1) * 50

'

End Sub

'

Private Sub UserForm_Initialize()

'

' Процедура активизации диалогового окна Чистый текущий объем инвестиций

'

' Устанавливается первоначальное значение счетчика

SpinButtonl.Value = 2

' Запрет не программного ввода данных в поля Процентная ставка

' и Чистый текущий объем инвестиций

'

TextBox7.Enabled = False TextBox9.Enabled = False

' Назначение клавише <Enter> функции кнопки Вычислить

'

CommandButtonl.Default = True

' Назначение функции клавиши <Esc> кнопке Отмена

'

CommandButton2.Cancel = True

' Установка максимального и минимального

' допустимого значений счетчика, а также текста всплывающей подсказки

With SpinButton1

.Max = 6

.Min = 1

.ControlTipText = "Ввод числа операций"

End With

End Sub


Пример управления размером


и перемещением элемента управления

Рассмотрим простой пример диалогового окна похождения колобка (рис. У6.3), в котором при нажатии на кнопку катись! Колобок перемещается по поверхности формы, а при нажатии на кнопку Расти \ он начинает увеличиваться в размерах. На рис. У6.4 показан вид Колобка после нескольких нажатий на кнопки катись! и Расти!. Приведенная ниже программа позволяет реализовать описанные выше действия Колобка.

Рис. У6.3. Диалоговое окно Похождения Колобка

Рис. У6.4. Вид Колобка после нескольких движений

Private Sub CommandButtonl_Click()

'

' Передвижение Колобка по поверхности формы

'

If Imagel.Top > 0 And Imagel.Left > 0 Then

Imagel.Move Imagel.Left - 5, Imagel.Top - 6

Else

Imagel.Visible = False

End If

End Sub

'

Private Sub CommandButton2_Click()

'

' Изменение размера Колобка

'

Imagel.Height = Imagel.Height + 3 Imagel. Width = Imagel.Width + 3

End Sub

Private Sub UserForm_Initialize()

'

' Инициализация диалогового окна Похождения Колобка

'

With Imagel

'

' Изображение колобка хранится в файле Dot.bmp

.Picture = LoadPicture("Dot.bmp")

.PictureAlignment = fmPictureAlignmentTopLeft

.PictureSizeMode = fmPictureSizeModeZoom

.BorderStyle = fmBorderStyleNone

.Visible = True End With End Sub



Самостоятельное задание


Разработать приложение с диалоговым окном сумма квадратов (рис. У6.6), которое позволит:

При помощи счетчиков управлять шириной и высотой диалогового окна.

Вычислять сумму квадратов элементов, введенных в поля ввода данных.

Рис. У6.6. Диалоговое окно Сумма квадратов



Теория



В первый свой рабочий день в банке молодой программист Нестор Щукин получил задание от менеджера составить приложение, вычисляющее чистый текущий объем инвестиций от вкладов банка. Допустим, что с помощью этого приложения необходимо найти чистый текущий объем инвестиции 10 000 руб. при 7% годовой ставке, при которой банк получает годовые доходы 2 000 руб., 4 000 руб. и 7 000 руб. в последующие три года после вложения денег в инвестиционный проект.

Прежде чем описывать, с какими мыслями тялся за выполнение своего первого задания Нестор Щукин, поговорим немного о том, что же такое чистый текущий объем инвестиции. Предположим, что банк осуществляет некоторый инвестиционный проект, который через k1 год приносит прибыль или требует дополнительных капиталовложений в объеме Pk1денег, через k-i года приносит прибыль или требует дополнительных капиталовложений в объеме Pk денег и т. д., через kn лет приносит прибыль или требует

дополнительных капиталовложений в объеме /V денег. Тогда чистый текущий объем инвестиции при i% годовой ставке равен:

Pk1/(1+i)k1 + ... + Pkn(d+i)kn,

где Рkn , которые соответствуют прибыли, входят в формулу со знаком плюс, а те, которые соответствуют дополнительным инвестициям - со знаком минус.

Итак, мы разобрались с тем, что должен подготовить Нестор Щукин. Осталось только узнать, как он это сделал. Нестор Щукин был амбициозным молодым человеком и, что само собой разумеется, решением своей первой задачи он хотел произвести наиболее благоприятное впечатление на менеджера, в надежде доказать свою незаменимость и необходимость, а может быть даже повышения зарплаты. На пользователей обычно впечатляюще действуют всевозможные динамические штучки, которые можно производить с диалоговым окном и элементами управления. Поэтому Нестор решил создать приложение с диалоговым окном, изменяющим свой размер в зависимости от числа членов в формуле, вычисляющей чистый текущий объем инвестиции.



УПРАВЛЕНИЕ РАЗМЕРОМ И ПЕРЕМЕЩЕНИЕМ ЭЛЕМЕНТОВ УПРАВЛЕНИЯ


УРОК 6. ТЕМА: УПРАВЛЕНИЕ РАЗМЕРОМ И ПЕРЕМЕЩЕНИЕМ ЭЛЕМЕНТОВ УПРАВЛЕНИЯ

ЦЕЛЬ УРОКА

ТЕОРИЯ

ПРАКТИКА

Пример управления размером и перемещением элемента управления

Перемещение элемента управления при помощи операции drag-and-drop

САМОСТОЯТЕЛЬНОЕ ЗАДАНИЕ

Урок 6

Тема: Управление размером и перемещением элементов управления