Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Знакомство с VBA.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
1.31 Mб
Скачать

Знакомство с VBA.

 

Запустим программу Excel (Пуск-> Программы-> Microsoft Excel) и откроем редактор VBA (Alt +F11). Также можно добавить панель инструментов  "Visual Basic"и использовать для открытия редактора кнопку на данной панели. (Сервис->Настройка->Панели инструментов)(См. Рис.1)

Рис. 1. Установка панели инструментов "Visual Basic" :

            -поставить галочку (1);

            -появится панель инструментов "Visual Basic"(2);

            -для вызова редактора VBA нажать кнопку (3).

 

 При работе с редактором VBA нам понадобятся несколько кнопок на панели Standard (см. Рис.2):

Рис.2. Для работы нам достаточно будет ТРЁХ кнопок :

           -           Insert UserForm(Добавить форму )-1;

-         Run Sub/UserForm(Запустить программу/ форму)-2;

-         Reset (Сброс)-3.

 

Состав нашего проекта отображается в окне Projtct( Проект -см.1 Рис.3), а свойства выделенного объекта в окне (Свойства –см. 2 Рис.3) Пока в нашем проекте нет самого главного – Формы (Properties UserForm). Добавим Форму в наш проект (нажать кнопку Insert UserForm)(на рис.3 данное действие выделено зелёным цветом) . Теперь появилось окно UserForm (см. 3 Рис.2) и панель -Toolbox (Панель элементов 4 Рис.3).

 

Рис.3. Рабочие окна редактора VBA :

            - Окно проекта (Projtct) (1);

            - Окно свойств (Properties )(2);

            - Окно формы(UserForm) (3) и панель элементов к нему(Toolbox )(4);

            - Окно кодов (Code)(5).

Форма (UserForm)- заготовка нашей программы, а Toolbox- панель с элементами управления. Интерфейс программы формируется нанесением элементов управления с панели инструментов Toolbox на форму. Щелкнем на Toolbox по элементу CommandButton(Кнопка), а затем переведём курсор мыши на нашу форму UserForm и щелкнем по ней.(на рис.3 данное действие показано красным цветом) Появится элемент управления «КНОПКА»( CommandButton). Перейдём в окно Properties (Свойства) и для объекта CommandButton установим свойства :

Name:

“cmdExit"

Caption :

“Выход"

Теперь сделаем по кнопке «Выход» мышью двойной щелчок и откроется окно Code c пустым телом программы. В том месте, где находится клавиатурный курсор, введем команду End .(см 5 Рис.3) Вот и всё ! Запустим нашу программу(на панели Standard нажмём кнопку « ►»- Run Sub/UserForm ).(см Рис.4)

Рис. 4. Программа в работе. (Программа появляется на фоне таблицы Excel ) 

 

Появилась наша программа! Пока она выполняет только одну задачу «Выход».Если нажать на нашу клавишу «Выход» сработает программный код-End и программа будет завершена.

Как работает наша программа? VBA – язык событийно-управляемого программирования. При нажатии на кнопку «Выход» происходит событие CommandButton1_Click(нажатие кнопки). Для данного события вызывается программа :

Private Sub cmdExit_Click()

End ‘Завершить программу.

End Sub

Форма и элементы управления, размещенные на ней, являются объектами. Объект имеет свойства, которые можно задавать как вручную в окне свойств, так и программно. Самое главное свойство объекта- Name. Для нашей кнопки VBA по умолчанию присвоил имя: CommandButton1. Это имя можно изменить. ( Желательно это сделать, перед тем как писать для данного объекта программный код). В нашем примере кнопка имеет имя cmdExit, где первые три буквы(cmd ) указывают на тип объекта, а остальная часть имени имеет смысловое значение (Exit) .

Теперь рассмотрим как изменить свойство объекта программно. Сделаем двойной щелочек мышей по нашей форме UserForm1 и откроется Code c пустым телом программы для события "UserForm_Click"(щелчок по форме). В тело программы впишем код (См. Рис. 5):

 

cmdExit.ForeColor = RGB(255, 0, 0)  'Цвет надписи на кнопке - красный  

 

 

Рис. 5. Программный код для события "UserForm_Click"(щелчок по форме)

 

Для изменения свойства объекта программным способом пишем имя объекта(в данном случае имя кнопки:cmdExit), а затем через точку свойство объекта(ForeColor) и его значение. И так если теперь запустим программу и кликнем по форме, то цвет надписи должен измениться на красный.

         Если нужно написать программу для другого события, то это можно сделать, выбрав из правого верхнего списка нужное событие для данного объекта

(См.2 Рис.5). Если нужен другой объект, например кнопка cmdExit , то это можно сделать, выбрав его из левого верхнего поля со списком.(См.1 Рис.5)

Готовый пример :Primer1.rar

  

  Горшков Ю.В. , г. Сальск

Свои вопросы можно присылать на :mailto:vbadevir@narod.ru

Создаём первый проект VBA.

    

            Рассмотрим алгоритм программы. Программа должна ввести данные для расчёта, произвести расчёт и вывести результат. В программах для DOC весь алгоритм осуществляется в теле программы(См. а) Рис.1), а в нашем проекте VBA (См. б) Рис.1) ввод и вывод данных осуществляется через визуальные объекты, которые должны быть расположены на форме. Всё это представляет собой графический интерфейс нашей программы. При нажатии клавиши "Расчёт" вызывается программа(Код макроса), которая поучает данные от объектов ввода данных и производит расчёт и затем передаёт результат расчёта объекту вывода.

 Рис.1. Сравнение Алгоритмов.

 

    Ввод данных производится через объект "TextBox", а вывод через "Label". 

 

Теперь при помощи VBA решим простую задачу расчёта длины медного провода диаметром 0,1 мм, если нам известно его сопротивление. Для расчёта воспользуемся формулами[1]и [2].

L=p*R/S [1]

 

,где L- расчетная длина провода(м);

p-удельное сопротивление(p= 0.0175);

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

S=(p*D 2)/4 [2]

Запустим программу Excel , перейдем в редактор VBA и к новому проекту добавим форму, как было сделано ранее. Но теперь на форму поместим несколько объектов разного типа (см. рис.2) :

1.      Четыре элемента типа Label(на рис.2 отмечены красной линией ). Три из них применим как поясняющие надписи, а четвертый для вывода результата. Перенесём с Toolbox (Панель элементов) на форму элементы Label и изменим для них свойства :

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

Свойства

Значение

Label1

Caption

Сопротивление(Ом) :

Label2

Caption

Диаметр (мм) : 0.1

Label3

Caption

Длина провода (М) :

 

LblL

Caption

 

SpecialEffect

2- SpecialEffectSunken

TextAlign

3- TextAlignRight

Три элемента управления применены как поясняющие надписи(Lablel1, Label2, Label3), а четвёртый предназначен для вывода результата расчёта(lblL).

Для ввода данных поместим на форму элемент управления другого типа- textBox. Установим для него свойства следующим образом:

(На рис.2 отмечено синим цветом)

Свойства

Значение

Name

TxtR

Caption

 

TextAlign

3- TextAlignRight

И последнее. Добавим на форму элемент управления типа кнопка (CommandButton)

(На рис.2 отмечено жёлтым цветом)

Установим для кнопки следующие свойства:

Свойства

Значение

Name

CmdR

Caption

Расчёт

 

Рис.2. Проект нашей первой программы.

 

Напишем для кнопки программный код. Сделать по элементу управления кнопка двойной щелчок и появится окно программного кода 5 (на рис.2). В данном окне напишем следующее:

 

Dim R, D, P, S, L As Single ' Определяем переменные как числа с плавающей точкой

 

Private Sub cmdR_Click()

R = Val(txtR.Value)             'ВВОД . Получаем значение для  расчёта и преобразуем в числовой формат  

D = 0.1

P = 0.0175

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

S = (3.1415926 * D ^ 2) / 4

L = P * R / S

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

lblL.Caption = L ' В Ы В О Д

End Sub

Первой строкой идёт определение переменных как Single (числа с плавающей точкой обычной точности: в диапазоне от -3,402823E38 до -1,401298E-45 для отрицательных значений и от 1,401298E-45 до 3,402823E38 для положительных значений ), затем идёт текст программы, которая вызывается при нажатии кнопки.

Следует отметить, что внесённое значение сопротивления находится в свойстве Value элемента управления txtR и, чтобы его получить, нужно сначала написать имя объекта, а затем через точку необходимое нам свойство. Значение сопротивления необходимо преобразовать из символьного типа в числовой при помощи функции Val() (Если десятичное значение внесено через запятую, то преобразовывать необходимо функцией CDbl()!!!). Теперь нажмем кнопку « ►» на стандартной панели, если всё сделано правильно можно произвести расчёт. Работа программного кода показана на Рис.3.

 

Рис. 3. Так работает нашапрограмма.

    Если нужно отладить программу, то можно установить точку останова и после запуска программы в данном месте произойдёт остановка программы и можно посмотреть значения переменных. (Рис 4). Чтобы установить точку останова нужно щелкнуть мышей слева от нужной строки(появиться красный кружочек 1 Рис 4), а повторное нажатие снимает точку останова. После запуска программы и попадания на точку останова можно подвести курсор мыши к переменной и посмотреть её значение на данный момент 2 (Рис 4). (Важно!!! Если значение находится в кавычках, то оно имеет символьный тип )

Рис. 4. Работа отладчика.

            Чтобы производить расчёт для любого диаметра провода, нужно добавить на форму поле ввода как это было сделано для длины провода. Для нового поля ввода данных установим свойство Name : txtD , а в программе строку D = 0.1 нужно заменить на D = Val(txtD.Value)

Теперь можно производить расчёты для любого заданного диаметра провода.

Результат желательно округлить. Для этого нужно вместо строки

lblL.Caption = L ' В Ы В О Д

написать :

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

(функция Format() позволяет выводить результат в заданном формате. Важно!!! В отличии от Round() данная функция работает во всех версиях Excel, поэтому желательно применять функцию Format())

И еще по вводу. Чтобы можно было вводить числа как через точку, так и через запятую, напишем функцию TransD. Данная функция проверяет что в строке стоит . Если точка, то применяется функция Val(), а иначе CDbl(). В окне Code , ниже процедуры расчета, напишем следующий код:

 

'Данная функция решает проблему запятой

Private Function TransD(txtS As String)

Dim A As String

Dim X As Single

Dim F As Integer

A = txtS

F = InStr(A, ".") 'Поиск символа "." в строковой переменной А

If F <> 0 Then ' Если точка найдена то преобразование выполняется функцией Val()

X = Val(A)

Else ' Иначе преобразование выполняется функцией CDbl()

X = CDbl(A)

End If

TransD = X

End Function

 

А код процедуры расчёта должен выглядеть так:

Private Sub cmdR_Click()

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

D = TransD (txtD.Value)

P = 0.0175

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

S = (3.1415926 * D ^ 2) / 4

L = P * R / S

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

lblL.Caption = L ' В Ы В О Д

End Sub

 

/////////////////////////////////////////////////////////////////////////////

Более подробно о применении тех или иных функциях или операторах VBA можно узнать из встроенной справочной системы (?->"Содержание и предметный указатель" см. Рис.5)

Рис. 5. Вход в справочную системуVBA.

   

        Готовые примеры "Rrasch1.xls" и "RRasch2.xls" в архиве : Rrasch.rar .

 

  Горшков Ю.В. , г. Сальск

Свои вопросы можно присылать на mailto:vbadevir@narod.ru

Модернизация первого проекта 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:

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

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

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

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

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

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

 

                                                    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

<>

 

Готовый пример модернизации :<>../Primer3.rar

  <>