
- •Программирование в excel
- •Симферополь 2000
- •Факультет "Механизация сельского хозяйства" Программирование в excel
- •1. Основы программирования на vba
- •1.1. Создание, редактирование и запись программ
- •1.1.1. Запись макроса
- •1.1.2. Как найти макрос в проекте
- •1.1.3. Написание новой процедуры
- •Чем макрос отличается от процедуры
- •1.1.4. Процедуры типа Sub и Function
- •1.1.5. Закрытые и открытые процедуры
- •1.1.6. Использование значения, возвращаемого функцией
- •1.1.7. Выполнение процедуры Sub
- •1.1.8. Передача аргументов в процедуру
- •1.1.9. Именованные аргументы
- •1.1.10. Написание процедур для обработки событий
- •1.1.11. Где хранится код обработки события
- •1.1.12. Средства, ускоряющие написание программ
- •1.1.13. Как написать легкочитаемую программу
- •1.2. Переменные, константы и типы данных
- •1.2.1. Типы данных в Visual Basic
- •1.2.2. Объявление константы, переменной или массива
- •1.2.3. Объявление объектной переменной
- •1.2.4. Встроенные константы
- •1.3. Управляющие конструкции
- •1.3.1. Операторы ветвления
- •1.3.2. Операторы циклов
- •1.3.3. Вложение управляющих конструкций
- •1.3.4. Выход из циклов и процедур
- •1.4. Структура программы
- •2. Сортировка данных
- •2.1. Алгоритм сортировки обменами (алгоритм “пузырька”)
- •2.2. Алгоритм сортировки вставками
- •2.3. Алгоритм сортировки выбором элемента
- •2.4. Алгоритм быстрой сортировки (метод Хоора)
- •2.5. Алгоритм пирамиды (метод Уильямса-Флойда)
- •2.6. Учебные задачи по программированию сортировки данных
- •3. Работа vba с объектами Excel
- •3.1. Как получить справку по Visual Basic для Microsoft Excel
- •3.2. Объекты Microsoft Excel
- •3.3. Работа с объектом Application
- •3.4. Работа с объектом Workbook
- •3.4.1. Открытие рабочей книги
- •3.4.2. Закрытие рабочей книги
- •3.4.3. Создание и сохранение рабочей книги
- •3.5. Работа с объектом Range
- •3.6. Строковые ссылки в стиле а1 или имена диапазонов
- •3.6.1. Числовые индексы строк и колонок
- •3.6.2. Свойство Offset
- •3.6.3. Свойства CurrentRegion и UsedRange
- •3.6.4. Организация циклов для перебора ячеек диапазона
- •3.6.5. Применение свойства Address для отладки кода, работающего с объектом Range
- •3.7. Работа с событиями
- •3.7.1. Включение и отключение обработки событий
- •3.7.2. Использование событий, связанных с рабочими листами
- •3.7.3. События на уровне рабочего листа
- •3.7.4. События на уровне диаграммы
- •3.7.5. События на уровне рабочей книги
- •3.7.6. События на уровне приложения
- •3.7.7. Модули классов и события
- •4. Численные методы математики
- •4.1. Методы решения нелинейных уравнений
- •4.1.2. Метод деления отрезка пополам (метод дихотомии).
- •4.1.3. Метод Ньютона (касательных).
- •4.1.4. Метод хорд (секущих).
- •4.1.5. Метод итераций (метод последовательных приближений).
- •4.2.1. Теоретические сведения
- •4.2.2. Метод Крамера
- •4.2.3. Метод Гаусса
- •4.2.6. Метод Зейделя
- •4.3. Обработка экспериментальных данных
- •4.3.1. Задачи, которые возникают при обработке экспериментальных данных.
- •4.3.2. Интерполяция
- •4.3.2.1. Интерполяция функций
- •4.3.3.2. Определение параметров эмпирической формулы
- •4.4. Методы численного интегрирования
- •4.4.1. Метод трапеций
- •4.4.2. Метод Симпсона
- •4.4.3. Оценка точности формул численного интегрирования. Выбор шага интегриров-ания
- •4.4.3.1. Выбор шага интегрирования по оценке остаточного члена (ошибки)
- •4.4.3.2. Выбор шага интегрирования с помощью двойного пересчета
- •4.5.1. Теоретические сведения
- •4.5.2. Одноступенчатые методы
- •4.5.2.1. Решение с помощью рядов Тейлора
- •4.5.2.2 Метод Эйлера
- •4.5.2.3. Модифицированный метод Эйлера
- •4.5.2.4. Метод Эйлера-Коши
- •4.5.2.5 Метод Рунге-Кутта
- •4.5.3. Многоступенчатые методы
- •4.5.3.1. Методы прогноза и коррекции
- •4.6. Методы решения линейной краевой задачи для обыкновенных дифференциальных уравнений
- •4.6.1. Постановка задачи
- •4.6.2. Метод конечных разностей
- •4.6.3. Метод прогонки
- •4.6.4. Алгоритм решения краевой задачи методом прогонки.
1.3.3. Вложение управляющих конструкций
Управляющие конструкции можно включать друг в друга, например, вставить блок If...Then внутрь цикла For Each...Next, который в свою очередь находится в другом блоке If...Then и т. д. Такие конструкции называются вложенными.
В следующем примере мы просматриваем заданный диапазон ячеек и подсчитываем число ячеек, содержащих определенное значение:
Function CountValues(rangeToSearch, searchValue)
If TypeName(rangeToSearch) <> "Range" Then
MsgBox "You can search only a range of cells."
Else
For Each с In rangeToSearch.Cells
If c.Value = searchValue Then
counter = counter + 1
EndIf
Next с
EndIf
CountValues = counter
End Function
Заметьте, что первый оператор EndIf закрывает внутренний блок If...Then, а последний оператор End If — внешний. По аналогии, в случае вложенных циклов For...Next и For Each...Next операторы Next автоматически применяются к ближайшему предыдущему оператору For или For Each. Вложенные конструкции Do...Loop ведут себя сходным образом.
1.3.4. Выход из циклов и процедур
Обычно процедуры и циклы в макросах выполняются от начала и до конца. Но бывают ситуации, когда досрочный выход из процедуры или цикла ускоряет работу за счет отказа от ненужных повторений.
Например, осуществляя поиск в массиве в цикле For...Next и найдя нужное значение уже на первой итерации, нет смысла просматривать остальную часть массива — разумнее тут же прекратить цикл и перейти к следующим за ним операторам. Для таких случаев предназначены операторы Exit.
Хотя операторы Exit очень удобны, используйте их только при крайней необходимости, а не при нормальном ходе выполнения процедуры или цикла. Злоупотребление операторами Exit затруднит чтение и отладку Вашего кода.
Кроме того, для пропуска части кода можно придумать и более подходящие способы. Например, при поиске значения в массиве внутрь цикла For...Next вместо оператора Exit можно поставить оператор Do...Loop, чтобы поиск шел только до тех пор, пока текущее значение индекса меньше верхней границы массива и значение переменной типа Boolean равно False (см. пример ниже). Когда искомое значение найдено, переменная типа Boolean устанавливается как True, и цикл прекращается.
i = LBound(searchArray) ub = UBound(searchArray) foundIt = False Do if searchArray(i) = findThis Then foundIt = True i = i+1 Loop While i <= ub And Not ftoundIt
Для досрочного выхода из оператора Do...Loop используется оператор Exit loop, а для досрочного выхода из цикла For - оператор Exit For:
For Each с In rangeToSearch if c.Value = searchValue Then found = True Exit For End If Next
Для досрочного выхода из процедур служат операторы Exit Sub и Exit Function:
For Each c In rangeToSearch if c.Value = searchValue Then counter = counter + 1 Elself c.Value = "Bad Data" Then countValues = Null Exit Function ' прекращаем проверку и немедленно выходим End If Next с
1.4. Структура программы
Структурно любая программа включает в себя:
1. Заголовок (Sub или Function).
2. Комментарии (назначение программы, используемые переменные, метод решения задачи и т.д.).
3. Описание переменных и массивов (размерность массива, тип переменной).
Описание переменных и массивов резервирует место в оперативной памяти для размещения в них данных определенного типа, поэтому для корректной работы программы описание является обязательным.
4. Объявление констант.
5. Чтение данных из внешних файлов или листов книги Excel.
6. Управляющие конструкции (операторы присвоения, циклов, ветвления, вызова подпрограмм, работы с объектами).
7. Вывод результатов во внешние файлы или на листы книги Excel.
8. Конец программы (End Sub или End Function).
Лабораторная работа 1.
Составление алгоритма вычисления значений таблично заданной функции.
Задание:
1. Составить алгоритм и программу решения задачи:
1.1. Вычисление суммы N слагаемых.
1.2. Вычисление произведения N сомножителей.
1.3. Вычисление значений функции в фиксированном количестве точек.
2. Составить программу вычисления функции:
№ |
Функция |
Условие |
Исходные данные |
Диапазон и шаг изменения аргумента |
1 |
|
|
|
|
2 |
|
|
|
|
3 |
|
|
|
|
4 |
|
|
|
|
5 |
|
|
|
|
6 |
|
|
|
|
7 |
|
|
|
|
8 |
|
|
- |
|
9 |
|
|
|
|
10 |
|
|
|
|
11 |
|
|
|
|
12 |
|
|
|
|
13 |
|
|
|
|
14 |
|
|
|
|
15 |
|
|
|
|
Порядок создания макроса:
1. Выбрать меню «Сервис» «Макрос» «Макросы» или [Alt]+[F8].
2. В окне диалога «Макросы» в строку «Имя» ввести имя макроса без пробелов и выбрать кнопку «Создать»
3. В открывшемся окне среды Visual Basic между операторами Sub и End Sub записать операторы программы.
Порядок выполнения макроса:
1. Из среды Visual Basic: меню «Запуск».
2. Из рабочего листа: «Сервис» «Макрос» «Макросы» или [Alt]+[F8], затем в списке макросов выбрать нужный и нажать кнопку «Выполнить» в окне диалога «Макросы».
Программа-макрос для 1-го варианта:
Параметры и исходные данные заданы на активном листе в ячейках D2:D6, результаты – столбец аргументов и значений функции размещаются в столбцах С и D, начиная с 10 ряда.
Sub Вариант1()
‘Чтение переменных из ячеек D2- D6 активного (открытого) рабочего Листа
a = Range("D2")
b = Range("D3")
tmin = Range("D4")
tmax = Range("D5")
deltat = Range("D6")
i = 0 ‘ счетчик числа аргументов
For t = tmin To tmax Step deltat
If t < 1 Then
Fun = 1
ElseIf 1 <= t <= 2 Then
Fun = a * t ^ 2 * Log(t)
ElseIf t > 2 Then
Fun = Exp(a * t) * Cos(b * t)
End If
i = i + 1
‘Вывод переменных аргумента t и значения функции Fun в ячейки столбцов С и ‘D соответственно, начиная с 10 ряда;
‘функция Str$() преобразует число в строковую переменную;
‘функция LTrim$() отсекает от строковой переменной все пустые значения ‘слева;
‘оператор “+” стыкует (коннектирует) строковые переменные в одну строку,
‘т.е. результат действия "C" + LTrim$(Str$(9)) есть строка "C10"
Range("C" + LTrim$(Str$(9 + i))) = t
Range("D" + LTrim$(Str$(9 + i))) = Fun
Next t
End Sub
Лабораторная работа 2.
Поиск экстремума функции
Задание:
1. Составить алгоритм и программу вычисления экстремума функции:
Вариант задания |
Вид функции y=f(x) |
Вид экстре-мума xэкстр |
Диапазон измене-ния аргумен-та |
«Грубое значение шага» h |
Точность вычисле-ния экстре-мума |
1 |
2+x-x2 |
Максимум 0,5 |
[0;1,0] |
0,15 |
10-5 |
2 |
(1-x)4 |
Минимум 1,0 |
[0,2;1,5] |
0,25 |
0,5*10-4 |
3 |
cos x+ch x |
Минимум 0,0 |
[-0,8;0,4] |
0,25 |
10-5 |
4 |
|
Максимум 0,333333 |
[0,1;0,6] |
0,1 |
10-5 |
5 |
x3-6x2+9x+4 |
Максимум 1,0 |
[0,2;1,5] |
0,3 |
10-5 |
6 |
x3-6x2+9x+4 |
Минимум 3,0 |
[2;4] |
0,3 |
0,5*10-5 |
7 |
2x2-x4 |
Минимум 0,0 |
[-2;0,8] |
0,15 |
10-4 |
8 |
|
Минимум 1,4 |
[1;2] |
0,15 |
0,5*10-4 |
9 |
|
Минимум 0,75 |
[0,1;1,2] |
0,2 |
10-5 |
10 |
xe-x |
Максимум 1,0 |
[0,1;1,5] |
0,25 |
10-5 |
11 |
ln2x/x |
Максимум 7,389 |
[6;8] |
0,15 |
10-5 |
12 |
x+1/x |
Минимум 1,0 |
[0,1;1,5] |
0,2 |
10-4 |
13 |
|
Максимум 1,0 |
[0,15;1,5] |
0,2 |
10-5 |
14 |
|
Максимум –1,0 |
[-2;-0,5] |
0,15 |
10-5 |
15 |
ln2x/x |
Минимум 1,0 |
[0,1;1,9] |
0,9 |
10-4 |
Программа-макрос для 1-го варианта:
Параметры и исходные данные заданы на активном листе в ячейках D1:D7, результаты – столбец аргументов и значений функции размещаются в столбцах F и G, начиная с 1 ряда, последняя строка таблицы – аргумент и значение экстремума.
Sub Вариант1()
a = Range("D1")
b = Range("D2")
c = Range("D3")
Xmin = Range("D4")
Xmax = Range("D5")
deltaX = Range("D6")
eps = Range("D7")
'расчет функции для построения таблицы и диаграммы
i = 1
For X = Xmin To Xmax Step deltaX
Y = a * X ^ 2 + b * X + c
Range("F" + LTrim$(Str$(i))) = X
Range("G" + LTrim$(Str$(i))) = Y
i = i + 1
Next X
Ymax = 0
Do
X = Xmin
Y0 = Ymax
Do
Y = a * X ^ 2 + b * X + c
Y1 = a * (X + deltaX) ^ 2 + b * (X + deltaX) + c
X = X + deltaX
Loop While Y1>Y
XYmax = X - deltaX
Ymax = Y
Xmin = XYmax - deltaX
deltaX = deltaX / 10
Loop While Abs(Ymax-Y0)>eps
Range("F" + LTrim$(Str$(i))) = XYmax
Range("G" + LTrim$(Str$(i))) = Ymax
End Sub