Модернизация первого проекта VBA.

1. Начальные установки в программе.

Продолжаем разрабатывать проект программы. Запустим программу из файла "RRasch2.xls", где было добавлено поле txtD для ввода значения диаметра провода. Введём значение сопротивления 1 Ом и попробуем нажать кнопку "Расчёт". Программа прекращает работу из-за ошибочной ситуации - "несоответствие типа", т.к. нужно было ещё внести значение диаметра провода. Произошла ошибочная ситуация в программе, когда поле txtD осталось незаполненым и произошло неправильное преобразование в числовую форму. Избежать это можно если занести в поля ввода нули. Начальные установки, которые бывают необходимы в программе удобно производить в момент инициализации формы, когда происходит событие UserForm_Initialize. Для данного события допишем следующий код:

Private Sub UserForm_Initialize()
txtR.Value = 0
txtD.Value = 0
End Sub

Теперь поговорим о навигации по нашей форме. В VBA есть возможность переходить от одного элемента управления к другому при помощи клавиши "TAB". Попробуем запустить программу и понажимать клавишу "TAB". Последовательность перехода следующая: поле ввода сопротивления-txtR,кнопка "расчёт"-cmdR и поле ввода диаметра провода-txtD. А удобнее было бы : поля ввода txtR,txtD и кнопка "расчёт"-cmdR. Порядок перехода задаётся в свойстве . Можно задать значение свойства для каждого элемента управления вручную в окне свойств, а можно это задать программно как это было сделано для свойства Value. Выбирем второй вариант. Тогда программный код для UserForm_Initialize() будет следующим:

Private Sub UserForm_Initialize()
txtR.Value = 0
txtD.Value = 0
txtR.TabIndex = 0
txtD.TabIndex = 1
cmdR.TabIndex = 2
End Sub
Теперь проверим работу нашей программы. Если сделано всё правильно, то вводить данные будет удобнее.(последовательность перехода должна измениться по второму варианту.)

2. Элемент управления "поле со списком".

Программа производит расчёт длины для медного провода. А если нужно произвести расчёт для провода из другого материала? Добавим ещё одно поле, как это было сделано для диаметра провода(См. пример "RRasch2.xls") и будем вводить коэффициент, учитывающий материал провода(удельное сопротивление), но это не очень удобно. Лучшим решением данной задачи будет применение элемента управления "Поле со списком"(ComboBox). Работа элемента управления в нашей программе поясню на рис.1:

[Image]

Рис.1 Схема работы элемента управления:

1. инициализация:

В двух массивах kf(10) и nkf(10) организуем справочник удельного сопротивления материалов (нумерация элементов массивов начинается с 0).

2.Выбор материала:

Названия материала заносим из nkf(10) в список элемента "Поле со списком" . При выборе материала из списка в свойство Value заносится индексный номер.

3.Установить значение коэффициента:
Значение коэффициента P берём из массива kf(10). Индекс элемента массива берем из свойства Value элемента "Поле со списком" . И если "Поле со списком" назовём cmdMat , то коэффициенту P значение из массива будет присвоено так :

P=kf(cmdMat.Value)

И так продолжаемдоработку нашего проекта. Добавим на форму элемент "Поле со списком" идобавим пояснительную надпись, как показно на рис.2 :

[Image]

Рис.2 Добавление элемента "поле со списком".

Для данного элемента управления в окне "Свойства" установим значение Name = CmbMat.

В окне кодов добавим программный код (что добавлено выделено жирным шрифтом):

Dim R, D, P, S, L As Single

Dim kf(0 To 9) As Single

Dim nkf(0 To 9) As String

Private Sub UserForm_Initialize()

nkf(0) = "Алюминий"

nkf(1) = "Вольфрам"

nkf(2) = "Латунь"

nkf(3) = "Константан"

nkf(4) = "Манганин"

nkf(5) = "Медь"

nkf(6) = "Никель"

nkf(7) = "Нихром"

nkf(8) = "Серебро"

nkf(9) = "Сталь"

kf(0) = 0.026

kf(1) = 0.055

kf(2) = 0.07

kf(3) = 0.0049

kf(4) = 0.42

kf(5) = 0.0175

kf(6) = 0.07

kf(7) = 1.1

kf(8) = 0.016

kf(9) = 0.1

For I = 0 To 9 'Заполняем

cmbMat.AddItem nkf(I) 'список

Next I 'в элементе "поле со списком"

cmbMat.BoundColumn = 0

cmbMat.ListIndex = 5 ' Устанавливаем начальное

' значение "Медь"

txtR.Value = 0

txtD.Value = 0

txtR.TabIndex = 0

txtD.TabIndex = 1

cmdR.TabIndex = 2

End Sub

Private Sub cmbMat_Click()

P = kf(cmbMat.Value) 'выбираем нужный коэф.

'из массива

End Sub

И ещё. Нужно закомментировать строку P=0.0175 в процедуре :

Private Sub cmdR_Click()

R = TransD(txtR.Value) 'ВВОД

D = TransD(txtD.Value)

'P = 0.0175 ########### ЗАКОМЕНТИРУЕМ ОПРЕДЕЛЕНИЕ КОЭФ.

'***** Р А С Ч Ё Т

S = (3.1415926 * D ^ 2) / 4

L = S * R / P

'*****************

lblL.Caption = Format(L, "0.000") ' В Ы В О Д

End Sub

Готовый пример модернизации :

../Primer3.rar

3. Вставка рисунков в программу.

Иногда для пояснения сути расчёта нужно добавить рисунок. Чтобы поместить рисунок на форму программы можно применить элемент управления Рисунок (Image). Важными свойствами ( по крайней мере в нашем случае ) для данного объекта являются :
- Picture ................../указать путь к рисунку/;

- PictureSizeMode..../выбрать один из трёх вариантов/ ( удобно применять вариант 1 - frmPictureModeStretch рисунок подгоняется по размеру окна объекта Рисунок (Image) )

И так приступим к доработке примера нашей программы (его можно взять из архива Primer3.rar) . Сначала создадим рисунок , например такой :

[Image]

Открываем проект VBA c нашим примером и увеличив размеры формы программы, поместим элемент управления Рисунок (Image) .

Установим размер объекта примерно равным размеру нашего рисунка. Переходим в окно "Свойства" и для свойства Picture выбираем наш рисунок. А для PictureSizeMode выбираем значение 1 - frmPictureModeStretch . Отрегулируем размер объекта Рисунок (Image) так как Вам нужно.

Рис.3. Рисунок для добавления.

И должно получиться примерно следующее :

[Image]

Рис. 4. Добавлен рисунок с помощью элемента управления " Рисунок "(Image).

4. Элемент управления -Кнопка выбора (OptionButton).

Иногда нужно рассчитать по длине провода его сопротивление. И если добавить в нашу программу такую возможность, то можно будет смело завершать данный проект, т.к. основные расчётные возможности программы будут реализованы.

Сравним две расчётные формулы : где :

Расчёт длины провода - L=S * R / p L- длина провода (м);

Расчёт сопротивления провода - R=L * p / S S- Сечение провода (мм2);

R- Сопротивление провода(Ом);

p- Удельное сопротивление.

Чтобы произвести расчёт сопротивления провода по длине провода достаточно изменить формулу, а переменные для ввода расчётной величины(R) и вывода результата (L) оставить без изменения. Тогда алгоритм расчёта будет следующим:

ЕСЛИ рассчитываем

длину провода по заданному сопротивлению ТО :

L=R *S / p , где L -длина провода(М) ; R-сопротивление(Ом) ;

ЕСЛИ рассчитываем

сопротивление провода по заданной длине ТО :

L=R *p / S , где L - сопротивление(Ом); R- длина провода(М);

На форме нужно поменять пояснительные надписи и заменить рисунок как показано на Рис.5 :

[Image]

Рис. 5. Пояснение изменений на форме.

Для выбора вида расчёта, в нашем случае, идеально подходят элементы управления " Кнопка выбора (OptionButton) " и рамка (Frame). Сделаем копию с файла "RRasch22.xls" и переименуем в "RRasch22.xls". Приступаем к доработке. Поместим на форму Рамку и две кнопки выбора, как показано на Рис.6:

[Image]

Рис. 6. Элементы управления для выбора вида расчёта.

Изменим свойства для кнопок выбора.

Для OptionButton1 Name= Opb1

Для OptionButton2 Name=Opb2

В процедуре UserForm_Initialize() (в конце)допишем для данных элементов управления код инициализации:

Private Sub UserForm_Initialize()

.. .. .. .. .. ....

.. .. .. .. .. ....

'***** Начальные установки для "ВЫБОРА ВИДА РАСЧЁТА"

Frame1.Caption = "Что будем рассчитывать?"

Opb1.Caption = "Длину" ' Заголовок элемента

Opb2.Caption = "Сопротивление" ' Заголовок элемента

Opb1.Value = True ' Появится точка выбора

'***************************************************

End Sub

Значение свойства Value, для кнопки выбора, может принимать только значение True или False . При изменении значения свойства Value происходит событие Change(). Для каждой кнопки выбора напишем код программы :

Private Sub Opb1_Click()

If Opb1.Value = True Then

Opb2.Value = False

Label3.Caption = " Длина (M)"

Label1.Caption = "Сопротивление(Ом)"

lblL.Caption = " "

Me.Caption = "Расчёт длины провода."

Else

Opb2.Value = True

End If

'***** Загрузить картинку ******

PathProecta = Application.Workbooks(1).Path & "\" '***** Определяем путь проекта *****

PPic1 = PathProecta + "R01.jpg"

Image1.Picture = LoadPicture(PPic1)

End Sub

Private Sub opb2_Change()

If Opb2.Value = True Then

Opb1.Value = False

Label1.Caption = " Длина (M)"

Label3.Caption = "Сопротивление(Ом)"

lblL.Caption = " "

Me.Caption = "Расчёт сопротивления провода."

Else

Opb1.Value = True

End If

PathProecta = Application.Workbooks(1).Path & "\" '***** Определяем путь проекта *****

PPic1 = PathProecta + "R02.jpg"

Image1.Picture = LoadPicture(PPic1)

End Sub

Для изменения заголовка на форме проекта нужно изменить в форме свойство Caption.

При обращении к форме применяем обращение :

Me.Caption = "Расчёт сопротивления провода."

Для изменения картинки применяем команду LoadPicture(PPic1), путь к проекту определяем при помощи команды :Application.Workbooks(1).Path . Да приходится обращаться к объекту Workbooks Excel , что бы узнать местонахождение наших картинок:

[Image] [Image]

Рис.7. Расчёт длины провода. Рис. 8. Расчёт сопротивления провода.

А теперь главное - код для расчётов (Добавлено всего четыре строчки !!!):

Private Sub cmdR_Click()

R = TransD(txtR.Value) ' ВВОД

D = TransD(txtD.Value)

'P = 0.0175 ########### ЗАКОМЕНТИРУЕМ ОПРЕДЕЛЕНИЕ КОЭФ.

'***** Р А С Ч Ё Т

S = (3.1415926 * D ^ 2) / 4

If Opb1.Value = True Then ' Добавлено

L = S * R / P

Else 'Добавлено

L = R * P / S ' Добавлено

End If ' Добавлено

'*****************

lblL.Caption = Format(L, "0.000") ' В Ы В О Д

End Sub

Проверить работу программы можно так:

вносим сопротивление, например 1 Ом , диаметр 0.1 мм -получаем результат L=0,449 м.

Переключаем на расчёт сопротивления и вносим ранее полученный результат 0,449 м .

Если результат расчёта 1Ом, то всё выполнено правильно.

Готовый пример для данных изменений здесь :Primer4.rar

 


Страница сайта http://www.silicontaiga.ru
Оригинал находится по адресу http://www.silicontaiga.ru/home.asp?artId=4792