- •267 Лекция 13. Язык программирования Visual Basic
- •Лекция 13. Язык программирования Visual Basic for Application (vba)
- •Типы данных
- •Инструкции vba
- •Имена vba
- •Функция MsgBox
- •Процедуры vba
- •Подпрограмма Sub
- •Функция Function
- •Функции ввода-вывода данных и сообщений
- •Функция InputBox
- •Управляющие конструкции vba
- •Проверка условия — If
- •Функции пользователя
- •Макросы Microsoft Office
- •Макросы Word
- •Макросы Excel
- •Макросы Access
- •Контрольные вопросы
Функция InputBox
Функция выводит диалоговое окно, содержащее сообщение и поле для ввода значения одной переменной или нажатия кнопки; результат выполнения функции — текстовое значение.
InputBox(prompt[, title] [, default] [, xpos] _
[, ypos] [, helpfile, context])
default– текст в поле ввода по умолчанию;
Xпоз – расстояние по горизонтали между левой границей диалогового окна и левым краем экрана;
Yпоз –расстояние по вертикали между верхней границей диалогового окна и краем экрана;
Если нажимается кнопка ОК или клавиша Enter, функция возвращает пустую строку(“”).
Пример 5
Вывести в диалоговом окне (рис. 13.3) запрос на ввод значения переменной. Если значение не введено, переменной присваивается значение, заданное по умолчанию.
Рис. 13.3
Фрагмент программного кода:
Dim Msg, Title, Response, Default
Msg = "Введите число от 1 до 5"
Title = "Пример функции InputBox"
Defaut =”1”
Response = InputBox (Msg, Title, Default)
Управляющие конструкции vba
Управляющие конструкции VBA позволяют изменять порядок выполнения инструкций программного кода, организовывать циклическое повторение, управлять выполнением блоков инструкций, в зависимости от условий. Эти возможности присущи всем языкам структурного программирования.
Проверка условия — If
Условие — логическое выражение, принимающее значение True (Истина) или False (Ложь), или арифметическое выражение, для которого 0 эквивалентен False, а другие значения соответствуют True.
В зависимости от результатов проверки условия, выполняется определенный блок инструкций. Инструкция If имеет разновидности.
Вариант 1. Однострочный If — выполняется единственная инструкция в случае истинности условия:
If <условие> Then <инструкция>
Пример 6
Проверка значения TaxNalog, вычисление Sale, если TaxNalog больше 0.
Фрагмент программного кода:
IF TaxNalog>0 Then Sale=Summ1*(1+TaxNalog)
Вариант 2. Блочный If — выполняется заданная последовательность инструкций в случае истинности условия:
If <условие=True> Then
<блок инструкций>
End If
Пример 7
Проверка значения TaxNalog, если значение положительное, вычисляются значения Sale и SumNalog.
Фрагмент программного кода:
IF TaxNalog>0 Then
Sale=Summ1*(1+TaxNalog)
SumNalog=SumNalog+Sale
End If
Вариант 3. Выполнение определенного блока инструкций в зависимости от условия:
If <условие=True> Then
<блок инструкций1>
Else
<блок инструкций2>
End If
Пример 8
Проверка значения TaxNalog, вычисление значения Sale в зависимости от результата проверки.
Фрагмент программного кода:
IF TaxNalog>0 Then
Sale=Summ1*(1+TaxNalog)
Else
Sale=0
End If
SumNalog=SumNalog+Sale
Вариант 4. Последовательная проверка нескольких условий:
If <условие1=True> Then
<блок инструкций 1>
ElseIf <условие2=True> Then
<блок инструкций 2>
……………
ElseIf<условиеn=True> Then
<блок инструкций n>
Else
<блок инструкций Else>
End If
Пример 9
Выполнить проверку taxnalog и выбрать алгоритм вычисления Sale.
Фрагмент программного кода:
taxnalog = InputBox("Введите ставку налога")
summ1 = InputBox("Укажите сумму")
If taxnalog < 0.12 Then
sale = summ1 * (1 + taxnalog)
ElseIf taxnalog < 0.25 Then
sale = (summ1 - 200) * (1 + taxnalog)
ElseIf taxnalog < 0.35 Then
sale = (summ1 - 500) * (1 + taxnalog)
Else sale = (summ1 - 1000) * (1 + taxnalog)
End If
MsgBox sale
Select Case
Последовательная проверка условий для выбора альтернативы:
Select Case выражение
Case список_выражений1
<блок_инструкций1>
Case список выражений 2
<блок_инструкций2>
. . . . .
Case Else
<блок_инструкций_Else >
End Select
Проверяемое выражение может возвращать значение любого типа (логическое, числовое, строковое). Список выражений – одно или несколько выражений, разделенных стандартным разделителем – символ точка с запятой (;).
Элементы списка выражений могут задаваться как:
выражение
выражение1 To выражение2
Is логический_оператор(сравнение_выражения)
Пример 10
Для выбора алгоритма расчета sale выполнить проверку значения taxnalog.
Фрагмент программного кода:
taxnalog = InputBox("Введите ставку налога")
summ1 = InputBox("Укажите сумму")
Select Case taxnalog
Case Is < 0.12
sale = summ1 * (1 + taxnalog)
Case Is < 0.25
sale = (summ1 - 200) * (1 + taxnalog)
Case Is < 0.35
sale = (summ1 - 500) * (1 + taxnalog)
Case Else
sale = (summ1 - 1000) * (1 + taxnalog)
End Select
MsgBox sale
GoTo
Инструкция обеспечивает принудительный переход к оператору, помеченному указанной меткой.
Метка — строка символов, которая указывается перед другой инструкцией программного кода, отделяется символом двоеточие (:). Количество меток не ограничено, имя метки должно быть уникально на уровне процедуры, например:
GoTo метка
Пример 11
Повторить ввод ставки налога и исходной суммы, если результат расчета суммы налога неудовлетворительный.
Фрагмент программного кода:
Met1: taxnalog = InputBox("Ставка налога - ",, 0.2)
summ1 = InputBox("Исходная сумма - ", , 2000)
If MsgBox("Сумма налога - " & taxnalog * summ1 & _ vbCrLf & "Выход-OK,повтор-Cancel", vbOKCancel, _ "Результат расчета суммы налога")=2 Then GoTo Met1
For Next
Инструкция For…Next организует циклическое выполнение группы инструкций под названием тела цикла. Для принудительного выхода из цикла используется инструкция Exit For. Имеются две разновидности.
Вариант 1. Последовательное изменение значений переменной цикла (счетчика) от начального (начало) до конечного (конец) значения с заданным шагом:
For счетчик = начало To конец [Step шаг]
тело цикла (инструкции)
Next [счетчик]
Вариант 2. Организация повторения цикла для каждого элемента массива или коллекции объектов. Заранее указывать число элементов не требуется, разрешается использование вложенных циклов.
For Each <элемент> In <группа>
тело цикла (инструкции)
Next [элемент]
элемент — переменная, используемая для ссылки на элементы коллекции однородных объектов (семейства);
группа — имя коллекции (семейства) объектов.
Пример 12
Ввод начального значения, шага изменения и конечного значения ставки налога и суммы налогообложения. Вычислить суммы налога.
Фрагмент программного кода:
taxnalog = InputBox("Введите начальную " & _
"ставку налога", , 0.2)
stepnalog = InputBox("Введите шаг ставки " & _
"налога — не более 0,2", , 0.15)
maxtaxnalog = InputBox("Введите конечную " & _
"ставку налога не более 0,5", , 0.5)
summ1 = InputBox("Укажите начальную сумму " & _
"не более 1000", , 1000)
stepsumm = InputBox("Укажите шаг суммы " & _
"не менее 100", , 200)
maxsumm1 = InputBox("Укажите конечную сумму " & _
"не более 10000", , 2000)
For I = taxnalog To maxtaxnalog Step stepnalog
For j = summ1 To maxsumm1 Step stepsumm
sale = j * (1 + I)
MsgBox " Сумма налога при ставке " & _
I & "для суммы " & j & " равна " & sale
Next j
Next I
While…Wend
Выполняется проверка условия, если условие истинно, выполняются операторы тела цикла. Это так называемый цикл с предусловием, выход из цикла должен быть предусмотрен в теле цикла.
While условие продолжения цикла
операторы тела цикла
Wend
Пример 13
Вводится ставка налога и облагаемая налогом сумма. Если рассчитанная сумма налога удовлетворяет, выйти с помощью кнопки ОК.
Фрагмент программного кода:
i = InputBox("Введите ставку налога 0,12-0,25", _
, 0.12)
While sale > 0
sale = InputBox("Введите начальную сумму", _
, 1000)
sale = sale * (1 - i)
If MsgBox("Остаточная сумма после ” & _
"вычета налога - " & sale, vbOKCancel) = _
vbOK Then GoTo Ext
Wend
Ext: MsgBox "Конец расчета", vbInformation
Do …Loop
Циклическое выполнение операторов, имеет различные способы задания.
Вариант 1. Предварительная проверка условия до начала выполнения тела цикла. В теле цикла изменяется условия продолжения цикла. Если условие ложно, при очередной проверке управление передается следующей за Loop инструкции. Принудительный выход из цикла — инструкция Exit Do.
Do While <условие продолжения цикла>
тело цикла
Loop
Пример 14
Задать количество повторений цикла ввода. Если вводимое число больше 1000, обработку прекратить.
Фрагмент программного кода:
ff = CDec(InputBox("Число повторений цикла", , 5))
‘ функция CDEC преобразует строку в число
Do While ff >=0
ff = ff - 1
If CDec(InputBox("Введите любое число," & _
"меньше 1000", , 1000)) >= 1000 Then
Exit Do
End If
Loop
Вариант 2. Задается условие прекращения цикла. Если условие истинно, цикл не выполняется, управление передается инструкции, следующей за Loop.
Do Until <условие прекращения цикла>
тело цикла
Loop
Пример 15
Фрагмент программного кода:
ff = CDec(InputBox("Число повторений цикла", , 5))
Do Until ff < 0
ff = ff - 1
If CDec(InputBox("Введите любое число, " & _
"меньше 1000", , 1000)) >= 1000 Then
Exit Do
End If
Loop
Вариант 3. Для первого выполнения цикла условие не проверяется. В теле цикла выполняется изменение условия продолжения цикла. Цикл продолжается, пока условие истинно. Если условие ложно, управление передается инструкции, следующей за Loop While. Принудительный выход из тела цикла выполняется с помощью инструкции Exit Do:
Do
тело цикла
Loop While <условие продолжения цикла>
Пример 16
Фрагмент программного кода:
ff = CDec(InputBox("Число повторений цикла", , 5))
Do
ff = ff - 1
If CDec(InputBox("Введите любое число, " & _
"меньше 1000", , 1000)) >= 1000 Then
Exit Do
End If
Loop While ff > 0
Вариант 4. Для первого выполнения цикла условие не проверяется. В теле цикла выполняется изменение условия. Цикл продолжается, пока условие истинно. Если условие ложно, управление передается инструкции, следующей за Loop While. Принудительный выход из тела цикла выполняется с помощью инструкции Exit Do:
Do
тело цикла
Loop Until <условие прекращения цикла>
Пример 17
Фрагмент программного кода:
ff = CDec(InputBox("Число повторений цикла", , 5))
Do
ff = ff - 1
If CDec(InputBox("Введите любое число, " & _
"меньшее 1000", , 1000)) >= 1000 Then
Exit Do
End If
Loop Until ff <= 0
Пример 18
Создать процедуру, которая вызывает процедуры:
подачи звукового сигнала определенного тона;
вывода сообщения;
сохранения документа в папке с указанным именем.
Option Explicit
Sub Main() ‘Главная процедура
MultiBeep 56 ‘Вызов MultiBeep с 1 параметром
Message ‘Вызов Message без параметра
SaveDoc "c:\Metod", "Ex1.doc"
‘Вызов SaveDoc с 2 параметрами
End Sub
‘**********************************
Sub MultiBeep(bps)
Dim i As Integer
For i = 1 To bps
Beep
Next i
End Sub
‘**********************************
Sub Message()
MsgBox "Сохраните документ!"
End Sub
‘**********************************
Sub SaveDoc(dr As String, fl As String)
‘Параметры — имена папки и файла
Dim all As String
If Dir(dr) <> "" Then ‘Проверка наличия папки
all = dr & "\" & fl
‘сохранить активный документ
ActiveDocument.SaveAs FileName:=all, _
FileFormat:=wdFormatDocument
Else
MsgBox "Папки нет, файл не сохранен"
End If
End Sub
Пример 19
Создать функцию вычисления наращенной суммы, размещаемой на депозитном счете на заданный срок под определенный годовой процент с условием дополнительных вложений.
Формула для вычисления:
p
mt
– фиксированная сумма ежегодного
взноса;
r – годовая процентная ставка;
n – срок;
type - тип выплат: 1 - в начале, 0 - в конце учетного периода;
pv – начальный капитал;
fv – наращенная сумма.
Public Function FVAL(pv As Single, nr As Single, _
pmt As Single, kper As Byte) As Single
If nr / 100 > 1 Then
MsgBox "Таких годовых процентов, как " _
& CStr(nr) & " не бывает"
Exit Function
Else
FVAL = pv * (1 + nr / 100) ^ kper + _
pmt * (1 + nr / 100) ^ kper / nr / 100
End If
End Function
‘**********************************************
Public Sub Bank()
Dim ppv As Single, pnr As Single, ppmt As Single, pkper As Byte
ppv = InputBox("Начальный капитал - ")
pnr = InputBox("Годовой процент - как целое число")
ppmt = InputBox("Ежегодный взнос - ")
pkper = InputBox("Срок размещения - ")
MsgBox "На первоначальный капитал - " & ppv & _
"руб. под " & pnr & " % годовых " & _
" и ежегодном взносе - " & ppmt & _
" руб. в течение - " & pkper & _
" лет Вы заработаете - " & _ CStr(Round(FVAL(CSng(ppv), CSng(pnr), _
CSng(ppmt), CByte(pkper)), 2)) & _
" руб.", vbInformation, _
"Результат финансовой функции"
End Sub
