- •Программирование в 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. Алгоритм решения краевой задачи методом прогонки.
3.6.4. Организация циклов для перебора ячеек диапазона
Есть несколько способов перебора ячеек диапазона в цикле. Примеры из этого раздела демонстрируют использование с этой целью операторов For Each...Next и Do...Loop.
3.6.4.1. For Each...Next
Предпочтительный способ перебора ячеек диапазона — организация цикла For Each...Next; этот цикл рекомендуется и при переборе элементов наборов.
Вот как строится цикл, в котором программа перебирает ячейки диапазона A1:D10 на листе Sheet1 и обнуляет ячейки с абсолютными значениями, меньшими 0.01:
Sub RoundToZero() For Each r In Worksheets("Sheet1").Range("A1:D10").Cells If Abs(r.Value) < 0.01 Then r.Value = 0 End If Next r End Sub
Допустим, Вы хотите изменить этот код так, чтобы он обрабатывал ячейки диапазона, выделенного пользователем. Для этого подходит метод InputBox, который позволяет предложить пользователю выделить диапазон ячеек. Метод InputBox возвращает объект Range, представляющий выделенный диапазон. Используя аргумент Type и обработку ошибок, Вы сможете гарантировать выделение допустимого диапазона до того, как диалоговое окно будет убрано с экрана.
Sub RoundToZero() Worksheets( "Sheet 1") .Activate On Error GoTo PressedCancel Set r = Application.lnputBox(prompt:= "Select a range of cells", Type:=8) On Error GoTo 0
For Each с In r.Cells
If Abs(c.Value) < 0.01 Then
c.Value = 0
End If
Next с
Exit Sub
PressedCancel:
Resume
End Sub
Если выделения диапазона не требуется, то для получения объекта Range можно воспользоваться свойством CurrentRegion или UsedRange. Например, или Вы знаете, что данные на листе Sheet1 начинаются с ячейки А1 и не содержат пустых строк или колонок, то свойство CurrentRegion позволяет автоматически получить весь диапазон:
Sub RoundToZero() Set r = Worksheets("Sheet1").Range("A1").CurrentRegion For Each с In r.Cells If Abs(c.Value) < 0.01 Then c.Value = 0 End If Next с End Sub
Следующие примеры демонстрируют два способа скрыть каждую вторую Колонку в использованном диапазоне на листе Sheet1. Первый построен на цикле For Each...Next, в котором проверяется значение свойства Column объектной переменной:
Sub HideColumns() Set r = Worksheets("Sheet1").UsedRange For Each col In r.Columns If col.Column Mod 2 = 0 Then col.Hidden = True End If Next col End Sub
А второй — на цикле For...Next с проверкой счетчика цикла:
Sub HideColumns() Set r = Worksheets("Sheet1").UsedRange For i = 1 To r.Columns.Count If i Mod 2 = 0 Then r.Columns(i).Hidden = True End If Next i End Sub
3.6.4.2. Do ...Loop
В некоторых случаях цикл For Each...Next не самый удачный способ перебора ячеек диапазона. Допустим, Вам нужен макрос, который сортирует колонку и удаляет строки с одинаковыми данными. Можно было бы попробовать Применить цикл For Each...Next:
Sub BuggyRemoveDuplicates() ' HE ИСПОЛЬЗУЙТЕ ЭТОТ КОД! Worksheets ("Sheet1").Range ("А1") .Sort _ key1:= Worksheets( "Sheet1 ").Range( "A1") Set r = Worksheets("Sheet1").Range("A1").CurrentRegion.Columns("A") For Each с In r.Cells If c.Offset(1, 0).Value = c.Value Then c.Offset(1, 0).EntireRow.Delete End If Next c End Sub
Увы, этот код работает неправильно, так как метод Delete изменяет диапазон, к которому обращается цикл For Each...Next. В итоге программа не сможет удалить некоторые дубликаты данных. Лучше использовать цикл Do...Loop:
Sub GoodRemoveDuplicates() Worksheets("Sheet1").Range("A1").Sort _ key1 :=Worksheets( "Sheet1 ").Range( "А1 ") Set currentCell = Worksheets( "Sheet1 ").Range( "А1 ") Do While Not lsEmpty(currentCell) Set nextCell = currentCell.0ffset(1, 0) If nextCell.Value = currentCell.Value Then currentCell.EntireRow.Delete End If Set currentCell = nextCell Loop End Sub
Этот цикл проверяет объектную переменную currentCell и завершается, дойдя до пустой ячейки под колонкой данных. Тот же эффект даст и сравнение в цикле значения currentCell с пустой строкой:
Do While currentCell.Value <> "" ' здесь обрабатываем заполненные ячейки Loop
В любом случае не забывайте переходить к следующей ячейке в конце тела цикла Do...Loop (например, Set currentCell = nextCell).