
- •Программирование в 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.2. Операторы циклов
Они используются для организации повторного выполнения блоков кода. Операторы циклов, предусмотренные в Visual Basic, описаны в следующей таблице.
Чтобы: |
Используйте: |
Проверить условие в начале цикла, если оно True, перейти к выполнению цикла и продолжать, пока условие не станет False |
Do While...Loop |
Проверить условие в начале цикла, если оно False, перейти к выполнению цикла и продолжать, пока условие не станет True |
Do Until..Loop |
Выполнить цикл один раз, проверить условие в конце цикла и, если оно True, продолжать, пока условие не станет False |
Do...Loop While |
Выполнить цикл один раз, проверить условие в конце цикла и, если оно False, продолжать, пока условие не станет True |
Do...Loop Until |
Выполнить цикл заданное число раз, используя счетчик цикла с определенными начальным и конечным значениями, а также шагом приращения |
For...Next |
Выполнить цикл по разу для каждого объекта из набора(collection) |
For Each...Next |
Примечание: В Visual Basic есть и оператор While...Wend, но вместо него лучше использовать более гибкие варианты оператора Do...Loop — например, Do While...Loop или Do...Loop While.
1.3.2.1. Do...Loop
Позволяет выполнять блок операторов неопределенное число раз, — когда Вам заранее не известно, сколько понадобится итераций. Существует несколько вариантов этого оператора, но в каждом из них проверяется условие и по результатам проверки определяется, надо ли продолжать цикл. Как и в операторе lf...Then, условие должно быть значением или выражением, которое можно вычислить как True или False. Далее мы рассмотрим все вариации Do...Loop. Подробнее на эту тему см. описание оператора Do...Loop в справочной системе.
1.3.2.2. Do While...Loop
Оператор Do While...Loop позволяет проверить условие перед началом цикла и выполнять цикл до тех пор, пока оно True.
Проверяемое в цикле Do While...Loop условие рано или поздно должно стать False, иначе цикл будет бесконечным. Чтобы остановить бесконечный цикл, нажмите клавиши Ctrl + Break.
Процедура Function из следующего примера подсчитывает число вхождений одной строки в другую, выполняя цикл до тех пор, пока не будут найдены все вхождения. Поскольку проверка осуществляется в начале цикла, тот выполняется, только если заданная строка присутствует в другой строке.
Function CountStrings( longstring, target) position = 1 Do While lnStr(position, longstring, target) ' возвращает True или False position = lnStr(position, longstring, target) + 1 Count = Count + 1 Loop CountStrings = Count End Function
1.3.2.3. Do Until...Loop
Позволяет проверять условие в начале цикла и выполнять цикл, пока оно не станет True. Если проверка с самого начала даст True, операторы в теле цикла пропускаются. Благодаря этому цикл в следующем примере не выполняется, если Response равна vbNo.
Response = MsgBox("Do you want to process more data?", vbYesNo) Do Until Response = vbNo ProcessUserData ' вызываем процедуру для обработки данных Response = MsgBox("Do you want to process more data?", vbYesNo) Loop
1.3.2.4. Do … Loop While
Если операторы цикла следует выполнить хотя бы раз, используйте Do...Loop While, чтобы проверять условие в конце цикла. Операторы выполняются, пока условие истинно. В следующем примере для Microsoft Excel цикл повторяется, только если метод Find находит ячейку со строкой “test”. Если текст найден, ячейка закрашивается синим цветом, и продолжается поиск следующей строки “test”. Если таких строк больше нет, цикл завершается.
Sub MakeBlue() Set rSearch = Worksheets("Sheet1").Range("a1:a10") Set с = rSearch.Find(“test”) If Not с Is Nothing Then first = c.Address Do c.Font.Colorindex = 5 Set c = rSearch.FindNext(c) Loop While (Not c Is Nothing) And (c.Address <> first) Else MsgBox "not found" End If End Sub
1.3.2.5. Do...Loop Until
В этой конструкции проверка осуществляется в конце, поэтому цикл выполняется минимум один раз и прекращается, когда условие становится True:
Do ProcessUserData ' вызываем процедуру для обработки данных response = MsgBox("Do you want to process more data?", vbYesNo) Loop Until response = vbNo
1.3.2.6. For...Next
Если Вам заранее известно, что какой-то блок кода надо повторить определенное число раз, используйте цикл For...Next. В отличие от вариантов оператора Do...Loop, в операторе For...Next применяется счетчик, уменьшаемый или увеличиваемый на каждой итерации цикла. Если разновидности Do...Loop; завершают цикл, как только условие становится истинным или ложным, то цикл For...Next прекращается, когда счетчик достигает заданного значения.
Приведенная ниже процедура Sub генерирует сигнал заданное число раз:
Sub BeepSeveral() numBeeps = lnputBox("How many beeps") For counter = 1 To numBeeps Beep Next counter End Sub
По умолчанию (как в этом примере) счетчик увеличивается на каждой итерации цикла на 1. Ключевое слово Step позволяет изменить шаг приращения. Если Вы укажете отрицательное число, счетчик будет уменьшаться на каждой итерации цикла. Например, здесь шаг приращения счетчика равен 2:
Sub ClearArray(ByRef ArrayToClear()) For i = LBound(ArrayToClear) To UBound(ArrayToClear) Step 2 ArrayToClear(i) = 0 Next i End Sub
1.3.2.7. For Each ...Next
Цикл For Each...Next похож на For...Next за исключением того, что он повторно выполняет одну и ту же группу операторов для каждого элемента набора объектов или массива. Это особенно полезно в том случае, когда Вам не известно число элементов в наборе или когда их количество может измениться, пока работает Ваша процедура. Вот как выглядит синтаксис оператора For Each...Next:
For Each элемент In группа операторы Next элемент
Встретив оператор For Each...Next, Visual Basic:
1. Считает элемент именем первого элемента в группе (если группа не пуста).
2. Выполняет операторы.
3. Проверяет, не последний ли это элемент в группе, и, если да, завершает цикл.
4. Подставляет вместо элемента имя следующего элемента в группе.
5. Повторяет операции, описанные в пп. 2-4.
В следующем примере для Microsoft Excel мы проверяем каждую ячейку текущего региона для ячейки А1 в таблице с именем “Sheet3” и закрашиваем содержимое ячейки красным цветом, если ее значение меньше -1.
For Each с In Worksheets("Sheet3").Range("A1").CurrentRegion.Cells If c.Value < -1 Then c.Font.ColorIndex = 3 Next c
Применяя оператор For Each...Next, помните о следующих ограничениях:
в случае наборов элементом может быть переменная типа Variant, Object или конкретного объектного типа из библиотеки объектов, а для массивов — только Variant;
оператор For Each...Next не годится для массивов пользовательских типов, так как в переменную типа Variant нельзя записать значение пользовательского типа.