- •Программирование в 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.1. Числовые индексы строк и колонок
Получить нужную ячейку можно и так: указать индексы строки и колонки, на пересечении которых она находится. Первым задается индекс строки, за ним следует индекс колонки.
Чтобы: |
Напишите: |
Изменить значение в ячейке А1 на листе Sheet1 |
Worksheets( "Sheet1").Cells(1, 1). Value = 3 |
Задать формулу для ячейки Bl на активном листе |
Cells(1, 2) .Formula - "=5-10*RAND() |
Установить объектную переменную |
Set objRange = Worksheets( "Sheetl") .Cells(1, 1) |
Числовые индексы строк и колонок очень удобны при обращении к ячейке по значению счетчика цикла. Например, следующий код перебирает все ячейки диапазона А1:D10 на листе Sheet1. Если какая-нибудь ячейка содержит значение 0.01, оно заменяется нулем.
Sub RoundToZero() For rwIndex = 1 to 4 For colIndex = 1 to 10 If Worksheets("Sheet1").Cells(rwIndex, colIndex) < .01 Then Worksheets("Sheet1").Cells(rwIndex, colIndex).Value = 0 End If Next colIndex Next rwIndex End Sub
Следующий пример иллюстрирует простой и быстрый способ вывода на экран группы элементов в виде многоколоночного списка. Программа создает новый лист и присваивает ссылку на него объектной переменной newSheet. Затем создает список всех имен в активной книге и отображает связанные с ними формулы.
Sub ListNames() Set newSheet = Worksheets.Add i = 1 For Each nm In ActiveWorkbook.Names newSheet.Cells(i, 1).Value = nm.Name newSheet.Cells (i, 2).Value = " ' " & nm.RefersTo i = i + 1 Next nm newSheet.Columns("A:B") .AutoFit End Sub
3.6.2. Свойство Offset
Весьма часто возникает необходимость обратиться к диапазону ячеек, который отстоит от другого диапазона на определеннее число строк и колонок. Свойство Offset объекта Range принимает аргументы RowOffset и ColumnOffset и возвращает новый диапазон. В следующем примере программа определяет тип данных в каждой ячейке из диапазона A1:A10 и перечисляет эти типы в колонке, расположенной справа от исходных ячеек:
Sub ScanColumn() For Each с In Worksheets("Sheet1").Range("A1 :A10").Cells If Application.lsText(c.Value) Then c.0ffset(0, 1).Formula = "Text" Elself Application.lsNumber(c.Value) Then c.0ffset(0, 1).Formula = "Number" Elself Application.IsLogical(c.Value) Then c.0ffset(0, 1).Formula = "Boolean" Elself Application.lsError(c.Value) Then c.0ffset(0, 1).Formula = "Error" Elself с .Value = "" Then c.0ffset(0, 1).Formula = "(blank cell)" End if End c End Sub
3.6.3. Свойства CurrentRegion и UsedRange
Эти два свойства очень полезны, когда программа работает с диапазонами, размерами которых Вы не можете управлять. Текущий регион (current region) -это диапазон ячеек, ограниченный пустыми строками и колонками или сочетанием пустых строк, пустых колонок и границ рабочего листа.
CurrentRegion — свойство объекта Range. На листе может быть несколько текущих регионов — все зависит от того, к какому объекту Range Вы обращаетесь.
Допустим, лист Sheet1 содержит список, для которого Вы хотите установить формат чисел. Единственное, что известно об этом списке, — он начинается с ячейки А1; число строк и колонок в нем Вы не знаете. В следующем примере показано, как отформатировать такой список через свойство CurrentRegion:
Sub FormatRange() Set myRange = Worksheets("Sheet1").Range("A1").CurrentRegion myRange.NumberFormat = "0.0" End Sub
Использованный диапазон (used range) ограничен левой верхней и правой нижней заполненными ячейками, наиболее удаленными друг от друга. В этом диапазоне содержатся все заполненные ячейки листа, а также расположенные между ними пустые ячейки. На листе может быть только один такой диапазон, и UsedRange является свойством объекта Worksheet, а не Range.
Пусть активный лист содержит результаты каких-то измерений за определенный период времени. В первой колонке использованного диапазона записаны даты, во второй — время, а в третьей и четвертой — результаты измерений. Вы хотите написать код, который объединяет пары “дата-время” в одно значение, преобразует время из GMT (Greenwich Mean Time — время по Гринвичу) в PST (Pacific Standard Time — стандартное время Тихоокеанского побережья США) и применяет к полученному значению формат даты. В таблице могут быть пустые строки и колонки. Чтобы получить весь использованный диапазон, включая пустые строки, можно задействовать свойство UsedRange. Вот один из вариантов преобразования и форматирования дат и времени:
Sub ConvertDates() Set myRange = ActiveSheet.UsedRange myRange.Columns ("C") .Insert Set dateCol = myRange.Columns("C") For Each с In dateCol.Cells If c.0ffset(0, -1).Value <> "" Then c.FormulaR1C1 = "=RC[-2]+RC[-1]-(8/24)" End If Next с dateCol.NumberFormat = "mrnm-dd-yyyy hh:mm" dateCol.Copy dateCol.PasteSpecial Paste.: =xlValues my Range.Columns( "A:B" ).Delete dateCol.AutoFit End Sub
Заметьте: чтобы получить третью колонку в использованном диапазоне, применяется выражение ActiveSheet. UsedRange. Columns( "С"), но на самом листе эта колонка может быть любой по счету — использованному диапазону могут предшествовать пустые колонки.
Другие свойства и методы объекта Range позволяют строить весьма сложные выражения, возвращающие поддиапазоны (subranges) или наддиапазоны (super-ranges) этого объекта. Среди свойств и методов, обычно применяемых с этой целью, можно отметить Areas, Cells, Columns, EntireColumn, EntireRow, Range и Rows.