Задачник на VBA (часть I)*
.pdf
11
|
|
|
Окончание табл. 1.4 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Возвращение случайного числа в интервале от [0 ; 1). Если |
|
|
|
|
Число < 0, то Rnd возвращает всякий раз одно и то же число, |
|
|
Rnd(Число) |
|
используя аргумент в качестве опорного числа. Если |
|
|
|
Число > 0 или отсутствует, то – следующее случайное число |
|
|
|
|
|
|
|
|
|
|
в последовательности. Если Число = 0, то – случайное |
|
|
|
|
число, возвращенное при предыдущем вызове функции. |
|
Abs(аргумент) |
|
Возвращение абсолютного значения числа (по модулю) |
|
|
|
Sgn(аргумент) |
|
Возвращение знака числа (+ или -) |
|
|
|
|
|
Отбрасывание дробной части числа А и возвращение целого |
Fix(аргумент) |
|
значения ≤ А. Различие между функциями состоит лишь в |
|
том, что при отрицательном аргументе INT возвращает |
|
Int(аргумент) |
|
ближайшее меньшее отрицательное значение, а FIX – |
|
|
ближайшее отрицательное целое число, большее либо |
|
|
равное указанному (см. пример) |
Str(Число)
Val(Строка)
Преобразование числового значения (переменной) в строку символов. Слева и справа приписываются пробелы
Переводит строковое выражение в возможное число
Аргумент функции всегда помещается в скобки. В качестве аргумента могут быть либо числовая константана (постоянная величина), либо переменная, либо другая функция со своим аргументом:
аргумент → {константа переменная функция}
Примеры |
|
|
|
|
Пусть a = –12.1; |
b = –12.56; c = 12.1; d = 12.56 |
|
||
Тогда: |
|
|
|
|
Int(a) –13; |
Int(b) –13; |
Int(c) 12; |
Int(d) 12 |
|
Fix(a) –12; |
Fix(b) –12; |
Fix(c) 12; |
Fix(d) 12 |
|
(функция FIX равносильна отбрасыванию десятичных знаков числа) |
||||
Sgn(a) |
–1; |
Sgn(c) 1 |
|
|
Abs(a) |
12.1; |
Abs(c) 12.1 |
|
|
12
VI. Приоритет (порядок выполнения) математических операций в арифметических выражениях VBA
1. Стандартные функции: Имя_функции(Аргумент): sin x sin(x). 2. Возведение в степень ( ^ ): x2 x^2
3. Изменение знака числа: (+3 и –3)
4. Умножение ( * ) и деление ( / ): 3x3 3 * x ^ 3 / ( 7 * a ) или 3 * x ^ 3 / 7 / a
7a
5.Целочисленное деление ( \ ) и деление по модулю ( MOD):
6.Сложение ( + ) и вычитание ( – )
При необходимости порядок действий можно изменить скобками, тогда сначала выполняются вычисления в скобках, конечно, с соблюдением приоритета.
Целочисленное деление отличается от деления с плавающей точкой тем, что его результат всегда есть целое число без дробной части. Оба операнда в выражении целочисленного деления должны быть численными выражениями. Перед выполнением операции целочисленного деления VBA округляет каждый операнд до числа типа Integer или Long (такой же тип имеет и результат целочисленного деления). VBA отбрасывает (но не округляет!) любой дробный остатокрезультатавыраженияцелочисленногоделения.
Например, выражения 27 \ 6 и 27.3 \ 5.9 , а также 22 \ 5 и 24 \ 5 будут иметь один и тот же результат = 4, в то время как обычное деление даст разные результаты: 27 / 6 = 4,5; 27.3 / 5.9 ≈ 4,6; 22 / 5 = 4,4; 24 / 5 = 4,8.
Деление по модулю дополняет целочисленное деление. В делении по модулю выражение возвращает только остаток операции деления как целое:
Например: 22 Mod 5 = 2 и 24 Mod 5 = 4 и 25 Mod 5 = 0.
Остальные свойства деления по модулю идентичны целочисленному делению.
VII. Адресация к ячейкам листа Excel на VBA. Простейшие средства ввода-вывода
В иерархии объектов VBA существует объект Range – диапазон. Объект Range используется для работы с ячейками, строками, столбцами, а также их группами. С помощью этих объектов имеется возможность реализовать ввод/вывод данных из программы (в программу) на лист (c листа) Excel. При работе с объектом Range ссылка на ячейки рабочего листа осуществляется разными способами (Табл. 1.5).
13
Таблица 1.5. Значения и некоторые свойства объектов Range
Range(“A:C”) |
диапазон из столбцов А, В, С. |
Range(“2:2”) |
строка 2 |
Range(“A1:C2”) |
блок ячеек двух строк и трех столбцов |
|
Range("B1:B10").Value = 1 – Оператор присваивает |
|
ячейкам c первой по десятую столбца В значение 1. |
Rows(2) |
вторая строка |
Columns(1) |
первый столбец |
Cells(3,4) |
ячейка на пересечении 3-й строки и 4-го столбца, т.е. D3 |
Объект Range, как элемент объектно-ориентированного программирования, обладает рядом свойств и методов. Наиболее распространенные из них показаны в таблице 1.6.
Таблица 1.6. Некоторые свойства и методы объекта Range
Value |
Возвращает значение из ячейки или в ячейки диапазона: |
|
x = Range(“C1”).Value – присваивается х значение из |
|
ячейки С1 |
|
Range(“A1:B2”).Value = f – всему диапазону |
|
присваивается значение переменной f. |
Font |
Возвращает свойство Font (шрифт) |
|
Cells(3, 2).Font.Color = vbGreen – красит ячейку |
|
B3 в зеленый цвет |
|
Cells(3,1).FontStyle = Bold – делает шрифт в |
|
ячейке А3 жирным. |
|
Set diap = Range("A4:J4") – назначение переменной |
|
diap диапазона листа с 4-й строки столбцов от А до J. |
|
diap.Font.Color = vbRed - диапазон окрашен в |
|
красный цвет |
|
diap.FontStyle = Bold Italic – диапазон ячеек |
|
будет написан полужирным курсивом. |
VIII. Применение встроенных диалоговых окон VBA для ввода и вывода данных в программе
Окно сообщений создается функцией MsgBox, которая имеет следующий синтаксис:
MsgBox(prompt[, button][,title][,helpfile,context])
14
Функция выводит в окне сообщение, записанное в параметре prompt, а также возвращает значение, соответствующее выбранной пользователем кнопке button в окне сообщения в соответствии с табл. 1.7.
Таблица 1.7. Значения параметра button в функции MsgBox
Константа |
Значение |
Нажатая кнопка |
vbOK |
1 |
ОК (по умолчанию) |
vbCancel |
2 |
Отмена (Cancel) |
vbAbort |
3 |
Прервать(Abort) |
vbYes |
6 |
Да (Yes) |
vbNo |
7 |
Нет (No) |
|
|
|
Параметр prompt обязательный. Эта строка, которая выдается в окне сообщения. Параметр buttons (кнопка) – необязательный. Значение параметра – целое число, по умолчанию равное 0. Список возможных значений – Табл. 1.7. Параметр title задает строку, которая является заголовком окна сообщения. Если параметр отсутствует, то в качестве заголовка используется имя приложения (в данном случае – MS Excel). helpfile, context – необязательные параметры, касающиеся справочной информации, относящейся к данному сообщению.
Например, в результате выполнения п/п
Sub t( )
Ans = MsgBox("Закончить?", vbYesNo, “Пример окна MsgBox”) If Ans = vbYes Then Cells(1, 1) = “Да” Else Cells(1, 1) = “Нет” End Sub
появится окно сообщения:
Чтобы определить, какая кнопка была нажата, значение переменной Ans анализируется с помощью оператора IF. Результаты выбора будут напечатаны в ячейке А1 активного листа
Excel.
Если не указать кнопки, то появится кнопка ОК.
Окно ввода создается функцией InputBox(), имеющей следующий синтаксис: InputBox(prompt[, title][,default][,xpos] [,ypos])
Окно содержит сообщение, указывающее, какие данные должен ввести пользователь, поле текста для ввода данных и две кнопки ОК и Cancel (Отмена), которые используются для подтверждения или отмены ввода данных. Закончив ввод данных, пользователь должен щелкнуть на одной
15
из кнопок. Если ОК – то значением функции является текст, находящийся в поле ввода. Если Отмена – значением функции является пустая строка, независимо от того, что напечатал пользователь. Остальные операнды команды означают: prompt – строка сообщения; title – заголовок окна, аналогично функции MsgBox; default – строка, помещаемая в поле: если она отсутствует, то поле текста будет пустым; xpos – расстояние в твипах от левой границы экрана до левой границы окна (если не указан, центрируется посредине); ypos – то же, но для верхних границ.
Например:
Sub t( )
a = InputBox("Введите значение:", "Пример окна InputBox") Cells(2, 1) = a
End Sub
Данные, введенные в поле окна, будут присвоены переменной a, которая имеет текстовый тип. Ее значение будет выведено в ячейку A2.
Примеры решения типовых задач и задачи для самостоятельного решения
I. Линейные алгоритмы
Линейным называется алгоритм, в котором все этапы решения задачи выполняются строго последовательно.
1.1. Примеры чтения программ с линейным алгоритмом
Пример 1.1. Прочесть программу, написанную в модуле, сопровождающем лист Excel, записать результат, который появится после выполнения программы в ячейке листа С1.
|
A |
B |
C |
|
Function z(x, y) |
1 |
10000,0E–01 |
0,81E+02 |
=z(A1;B1) |
|
z = x ^ (1 / 3) Mod Sqr(y) |
|
|
|
|
|
End Function |
16
Решение:
1.Сопоставляем формальные параметры x, y при вызове программы с фактическими значениями, записанными в ячейках Excel в формате с плавающей точкой:
x= [число в ячейке А1] = 10000,0E–01 = 10000 10-1 = 1000 (формат с фиксированной точкой).
y= [число в ячейке B1] = 0,81E+02 = 0,81 102 = 81
2.Переходим к вычислению z, записывая операторы VBA математическими формулами:
z = 3 1000 Mod
81 =10 Mod 9
3.Для деления по модулю (функция Mod) производим деление «столбиком»:
4.В ячейке С1 будет число 1.
|
A |
B |
C |
1 |
10000,0E–01 |
0,81E+02 |
1 |
Пример 1.2. Прочесть программу, написанную в модуле, сопровождающем лист Excel, записать результат, который появится после выполнения программы в ячейке листа B3.
Function test2(a%, b%) Pi = Range("A1").Value
c = Sin(Pi / a%) + Cos(Pi / b%) test2 = c
End Function
Решение:
1.Сопоставляем формальные параметры a%, b% при вызове программы с фактическимизначениями, записаннымивячейкахExcel B1 иC1:
a% = [число в ячейке B1] = 2,1 2 – число присваивается целочисленной переменной, поэтому происходит округление до ближайшего целого.
b% = [число в ячейке С1] = 3,3 3
2.Переменная Pi получает значение из ячейки А1, где записана стандартная функция Excel ПИ( ) = π, в результате, Pi = π = 3,1415….
17
3.с = sin π2 + cos π3 =1 + 12 =1,5
4.В результате на листе Excel в ячейке B3 будет 1,5:
Пример 1.3. Прочесть программу, написанную в модуле, сопровождающем лист Excel, записать результат, который появится после выполнения программы в ячейке листа B2.
Function examp(x) b = 37 \ x
c% = Sqr(b) examp = c% End Function
Решение:
1.Сопоставляем формальный параметр x при вызове программы с фактическим значением 4.8, указанным при вызове функции: x = 4.8
2.Выполняем целочисленное деление в два этапа
a) Округляем x до целого значения 5
б) Выполняем деление до тех пор, пока остаток не станет меньше делителя:
3.с% =
7 ≈ 2,6 3 (округляем до целого числа)
4.examp = 3
1.2. Задания для самостоятельного чтения линейных программ
На рисунке представлен фрагмент листа Excel и текст сопровождающей его программы. Показать, в каких ячейках листа и какой результат будет после выполнения этой программы.
18
Задание 1
|
A |
|
|
B |
C |
||||
1 |
2250,0E–01 |
|
|
1,21E+02 |
=z(A1;B1) |
||||
Задание 2. |
|
|
|
|
|
|
|
|
|
|
A |
|
|
B |
|
C |
|
||
1 |
1000,0E–01 |
|
|
0,81E+02 |
|
=z(A1;B1) |
|
||
Задание 3. |
|
|
|
|
|
|
|
|
|
|
A |
|
|
B |
|
C |
|
||
1 |
145,0E–01 |
0,035E+02 |
|
|
=z(A1;B1) |
|
|
||
Function z(x, y)
z = Sqr(x) Mod Sqr(y) End Function
Function z(x, y)
z = Sqr(x) \ Sqr(y) End Function
Function z(x, y) z = x Mod y End Function
Задание 4.
|
A |
B |
C |
1 |
1440,0E–1 |
0,49E2 |
=z(A1;B1) |
Задание 5.1
Задание 6.1
Function z(x, y)
z = Sqr(x) \ Sqr(y) End Function
Function test5(i, k) Pi = Cells(1, 1)
Range("A2:D3").Value = Pi / i Cells(2, k) = Cells(2, k) / k
x = Cells(2, k): test5 = x End Function
Function test6(i, k)
Pi = Cells(1, 1): x = Cos(Pi / i) Range("A2:D3").Value = x: y = x * k test6 = y
End Function
Задание 7. 1
Задание 8. 1
Function test7(i, k) a = Cells(1, 1)
Range("B2:C3").Value = a \ i Cells(2, k) = Cells(2, k) Mod k x = Cells(2, k): test7 = x
End Function
Function testa(i, k)
x = Cells(1, 1): y = i / Cos(x) z = Range("A2").Value
a = z ^ 2 \ y / k: testa = a End Function
1 Функции пользователя, имеющие ссылки к объектам листа, не могут быть запущены с листа, только из процедуры. Приведенные примеры предназначены только для обучения чтению программ.
19
Задание 9. 2
Function test9(i, k) a = Cells(1, 1)
Range("B2:C3").Value = Sqr(a) \ i
Cells(2, k) = Cells(2, k) / k x% = Cells(2, k): test7 = x% End Function
Задание 10.2
Function test10(i, k)
x = Cells(1, 1): y = Tan(x) * i z = Range("B1").Value
a = y * k Mod Sqr(z): test9 = a End Function
1.3. Примеры разработки линейных программ для задач с неявным алгоритмом
Пример 1.3. Составить программу для вычисления пути равноуско-
ренного движения, определяемого по формуле S =ν0t + |
at 2 |
, для заданного |
|
2 |
|||
|
|
набора параметров, например, ν0 =10 м/ c, a = 5 м/ c2 и любого времени t.
Решение:
Заносим параметры в ячейки листа Excel: в первом столбце делаем подписи к ячейкам, во втором – вносим числовые значения для переменных, в третьем – их размерности. Первый и третий столбцы являются необязательными, они служат лишь для оформления задачи.
В третьей строке вызываем программу-функцию, реализующую расчет по заданной формуле. Текст программы:
Function S(t) |
Имя функции S с формальным параметром t |
|
v = Cells(1, 2) |
Перенос данных с ячеек листа |
|
a = Cells(2, 2) |
в переменные v и а |
|
s = v * t + a * t ^ 2 / 2 |
Запись заданной формулы и присвоение |
|
результата возвращаемому значению S |
||
|
||
End Function |
Конец функции |
2 Функции пользователя, имеющие ссылки к объектам листа, не могут быть запущены с листа, только из процедуры. Приведенные примеры предназначены только для обучения чтению программ.
20
Рассмотрим еще один вариант решения задачи. Недостатком написанной выше программы является тот факт, что пользователь должен знать, КУДА помещать данные на листе, т.е. видеть и понимать текст программы. Для того, чтобы сделать программу более универсальной, параметры v и a вносим в формальные параметры заголовка программы:
Function s(t, v, a)
s = v * t + a * t ^ 2 / 2 End Function
При вызове такой программы вместо формальных параметров v и a в полях палитры пользовательской функции указываются адреса ячеек, где находятся значения переменных: (Рис. 1).
Рис. 1.1 Палитра пользовательской функции S(t,v,a)
Пример 1.4. Составить программу, определяющую количество секторов, занятых файлом на дискете, если известен его размер в байтах?
Решение:
Известно, что один сектор имеет размер 512 байт. Программа, рассчитывающая целое число занятых секторов, может быть записана или через операцию целочисленного деления, или через функцию Fix.
Function N_sector1(V) |
Function N_sector2(V) |
N_sector = V \ 512 + 1 |
N_sector = Fix( V \ 512) + 1 |
End Function |
End Function |
Здесь формальный параметр V – передаваемый объем файла в байтах. Недостатком обеих программ является их непригодность в случае кратности числа V числу 512: единицу в формуле для этого случая не следует
