Модернизация первого проекта VBA.
1. Начальные установки в программе. Продолжаем разрабатывать проект программы. Запустим программу из файла "RRasch2.xls", где было добавлено поле txtD для ввода значения диаметра провода. Введём значение сопротивления 1 Ом и попробуем нажать кнопку "Расчёт". Программа прекращает работу из-за ошибочной ситуации - "несоответствие типа", т.к. нужно было ещё внести значение диаметра провода. Произошла ошибочная ситуация в программе, когда поле txtD осталось незаполненым и произошло неправильное преобразование в числовую форму. Избежать это можно если занести в поля ввода нули. Начальные установки, которые бывают необходимы в программе удобно производить в момент инициализации формы, когда происходит событие UserForm_Initialize. Для данного события допишем следующий код: Private Sub UserForm_Initialize() Теперь поговорим о навигации по нашей форме. В VBA есть возможность переходить от одного элемента управления к другому при помощи клавиши "TAB". Попробуем запустить программу и понажимать клавишу "TAB". Последовательность перехода следующая: поле ввода сопротивления-txtR,кнопка "расчёт"-cmdR и поле ввода диаметра провода-txtD. А удобнее было бы : поля ввода txtR,txtD и кнопка "расчёт"-cmdR. Порядок перехода задаётся в свойстве . Можно задать значение свойства для каждого элемента управления вручную в окне свойств, а можно это задать программно как это было сделано для свойства Value. Выбирем второй вариант. Тогда программный код для UserForm_Initialize() будет следующим: Private Sub UserForm_Initialize() 2. Элемент управления "поле со списком". Программа производит расчёт длины для медного провода. А если нужно произвести расчёт для провода из другого материала? Добавим ещё одно поле, как это было сделано для диаметра провода(См. пример "RRasch2.xls") и будем вводить коэффициент, учитывающий материал провода(удельное сопротивление), но это не очень удобно. Лучшим решением данной задачи будет применение элемента управления "Поле со списком"(ComboBox). Работа элемента управления в нашей программе поясню на рис.1: Рис.1 Схема работы элемента управления: 1. инициализация: В двух массивах kf(10) и nkf(10) организуем справочник удельного сопротивления материалов (нумерация элементов массивов начинается с 0). 2.Выбор материала: Названия материала заносим из nkf(10) в список элемента "Поле со списком" . При выборе материала из списка в свойство Value заносится индексный номер. 3.Установить значение коэффициента: P=kf(cmdMat.Value) И так продолжаемдоработку нашего проекта. Добавим на форму элемент "Поле со списком" идобавим пояснительную надпись, как показно на рис.2 : Рис.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 Готовый пример модернизации :
3. Вставка рисунков в программу. Иногда для пояснения сути расчёта нужно добавить рисунок. Чтобы поместить рисунок на форму программы можно применить элемент управления Рисунок (Image). Важными свойствами ( по крайней мере в нашем случае ) для данного объекта являются : - PictureSizeMode..../выбрать один из трёх вариантов/ ( удобно применять вариант 1 - frmPictureModeStretch рисунок подгоняется по размеру окна объекта Рисунок (Image) ) И так приступим к доработке примера нашей программы (его можно взять из архива Primer3.rar) . Сначала создадим рисунок , например такой : Открываем проект VBA c нашим примером и увеличив размеры формы программы, поместим элемент управления Рисунок (Image) . Установим размер объекта примерно равным размеру нашего рисунка. Переходим в окно "Свойства" и для свойства Picture выбираем наш рисунок. А для PictureSizeMode выбираем значение 1 - frmPictureModeStretch . Отрегулируем размер объекта Рисунок (Image) так как Вам нужно. Рис.3. Рисунок для добавления. И должно получиться примерно следующее : Рис. 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 : Рис. 5. Пояснение изменений на форме. Для выбора вида расчёта, в нашем случае, идеально подходят элементы управления " Кнопка выбора (OptionButton) " и рамка (Frame). Сделаем копию с файла "RRasch22.xls" и переименуем в "RRasch22.xls". Приступаем к доработке. Поместим на форму Рамку и две кнопки выбора, как показано на Рис.6: Рис. 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 , что бы узнать местонахождение наших картинок:
Рис.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://silicontaiga.ru
Оригинал находится по адресу http://silicontaiga.ru/home.asp?artId=4792 |