- •Е. А. Сидорова, п. С. Челобанов основы программирования на vba омск 2011
- •1. Понятие и свойства алгоритма
- •1.1. Понятие алгоритма
- •1.2. Свойства и виды алгоритмов
- •1.3. Способы представления алгоритмов
- •2. Язык программирования vba
- •2.1. Языки программирования
- •2.2. Общие сведения о vba
- •2.3. Основные понятия языка программирования
- •2.4. Алфавит vba
- •2.5. Типы данных
- •2.6. Формы записи вещественных чисел в программе
- •2.7. Переменные
- •2.8. Константы
- •2.9. Встроенные функции
- •2.10. Выражения
- •2.11. Редактор Visual Basic
- •2.12. Правила записи и ввода программ на vba
- •2.13. Создание первой программы
- •3. Управление вводом и выводом данных
- •3.1. Оператор присваивания
- •3.2. Операторы ввода данных
- •3.3. Генерирование случайных чисел
- •3.4. Операторы вывода данных
- •4. Линейные вычислительные процессы
- •5. Разветвляющиеся вычислительные процессы
- •5.1. Алгоритм разветвляющегося процесса
- •5.2. Оператор условного перехода If
- •5.2.1. Однострочный (линейный) оператор If
- •If Условие Then Операторы_1 [ Else Операторы_2 ],
- •5.2.2. Блочная форма оператора If
- •5.3. Объединение условий с помощью логических операций
- •5.4. Оператор безусловного перехода GoTo
- •5.5. Оператор выбора Select Case
- •6. Символьные переменные
- •6.1. Общие понятия
- •6.2. Сравнение строк
- •6.3. Строковые функции
- •6.4. Оператор Mid
- •7. Введение в объектно-ориентированное программирование
- •7.1. Основные понятия
- •7.2. Создание пользовательского интерфейса
- •7.3. Установка свойств объектов и определение методов
- •7.4. Составление программного кода
- •7.5. Создание пользовательского приложения с использованием формы
- •7.5.1. Создание формы
- •7.5.2. Разработка программного кода
- •8. Циклические вычислительные процессы
- •8.1. Понятие цикла
- •8.2. Арифметический цикл
- •8.2.1. Цикл с разветвлением
- •8.2.2. Цикл со счетчиком. Вычисление максимума и минимума
- •8.2.3. Вложенные циклы
- •8.3. Вычисление сумм и произведений
- •8.4. Итерационные циклы
- •8.4.1. Операторы цикла Do … Loop
- •9. Модульное программирование.
- •9.1. Понятие процедуры
- •9.2. Параметры процедур – формальные и фактические
- •9.3. Разработка процедур-функций
- •9.4. Разработка процедур-подпрограмм
- •9.5. Срочный выход из процедур и циклов
- •10. Переменные с индексами. Одномерные массивы
- •10.1. Понятие массива
- •10.2. Ввод массива
- •10.2.1. Считывание массива с листа Excel
- •10.2.2. Заполнение массива случайными числами
- •10.3. Вывод массива
- •10.4. Решение задач с использованием массивов
- •644046, Г. Омск, пр. Маркса, 35
10.2. Ввод массива
10.2.1. Считывание массива с листа Excel
Заполнение массива числовыми данными из ячеек электронной таблицы осуществляется в цикле с использованием команды Сells(i, j), где i, j –соответственно номера строки и столбца, на пересечении которых находится ячейка с данными. При небольшом размере массива данные для него обычно набирают на листе Excel подряд либо в одной строке, либо в одном столбце, тогда фрагмент программы для ввода (чтения) элементов массива с листа Excel имеет вид:
'Ввод массива с листа Excel
Worksheets("Лист1").Select 'Выбор рабочего листа "Лист1"
Dim a(6) As Single, i As Byte
For i = 1 To 6
a(i) = Cells(3, i) 'Ввод из 3-й строки листа Excel
или: a(i) = Cells(i, 5) 'Ввод из 5-го столбца листа Excel
Next i
10.2.2. Заполнение массива случайными числами
Этот способ обычно используется при отладке программ.
Для генерирования случайных чисел применяется функция Rnd (см. подразд. 3.3). Программный код для заполнения массива из шести элементов случайными числами от –50 до +50 можно записать в следующем виде:
'Заполнение массива случайными числами
Randomize Timer 'Установка базы генератора случайных чисел
Dim a(6) As Single, i As Byte
For i = 1 To 6
a(i) = Fix(101 * Rnd – 50) 'Случайные числа от –50 до +50
Next i
10.3. Вывод массива
Вывод элементов массива на экран монитора должен выполняться таким образом, чтобы обеспечить наглядность и удобство восприятия полученных результатов.
Вывод одномерного массива в строку или столбец на рабочий лист Excel:
Worksheets("Лист1").Select 'Выбор рабочего листа "Лист1"
For i = 1 To 6
Cells(4, i) = a(i) 'Вывод в 4-ю строку листа Excel
или: Cells(i, 8) = a(i) 'Вывод в 8-й столбец листа Excel
Next i
Аналогичным образом массив выводится в окно отладки Immediate:
For i = 1 To 6
Debug.Print a(i); 'Вывод в окно отладки в строку
или: Debug.Print a(i) 'Вывод в окно отладки в столбец
Next i
10.4. Решение задач с использованием массивов
В общем случае работа с массивом производится следующим образом: организуются циклы ввода, обработки и вывода элементов массива, как показано на рис. 39 (обозначения переменных здесь такие же, как на рис. 37). Однако если
д
ля
решения задачи нет необходимости
одновременно иметь все элементы массива,
то ввод, вывод элементов массива и
работу с ними можно совмещать в одном
цикле аналогично примеру ОМ1.
Пример ОМ2. В одномерном массиве x(10) найти количество и произведение положительных элементов с четными индексами. Массив заполнить числами в диапазоне от –50 до 50 и разместить его в строке 3 таблицы Excel. Результаты расположить на листе Excel в соответствии с рис. 40.
ГСА решения задачи приведена на рис. 41. С целью уменьшения объема программы и повышения быстродействия ее работы все операции с элементами массива реализованы в одном цикле.
Текст программы:
Sub ОМ2() 'Расчет количества и произведения элементов массива
Worksheets("Лист1").Select 'Выбор рабочего листа "Лист1"
Range("A:IV").Clear 'Очистка рабочего листа Excel
Randomize Timer 'Установка базы генератора случайных чисел
Dim x(10) As Integer, i As Byte, k As Byte, p As Single
k = 0 'Начальное значение счетчика количества элементов
p = 1 'Начальное значение произведения элементов
F
or
i
= 1 To
10
x(i) = Fix(101 * Rnd – 50)
'Случайные числа от –50 до +50
Cells(1, i) = i 'Вывод индекса
'в 1-ю строку
Cells(3, i) = x(i) 'Вывод элемента
'массива в 3-ю строку
If i Mod 2 = 0 And x(i) > 0 Then
Cells(5, i) = x(i) 'Вывод искомого
'элемента в 5-ю строку
k = k + 1 'Накопление количества
'положительных элементов
p = p * x(i) 'Накопление
'произведения
End If
Next i
Cells(7, 1) ="k ="
Cells(7, 2) = k 'Вывод количества
Cells(8, 1) ="p ="
Cells(8, 2) = p 'Вывод произведения
End Sub
Пример ОМ3. В произвольном одномерном массиве x(n) удалить элемент с порядковым номером k.
Особенностью операции удаления элемента массива является то, что значения, расположенные до удаляемого элемента, остаются на своих местах, а каждое последующее значение сдвигается на одну позицию вперед. Для этого необходимо, начиная с позиции удаляемого элемента, последовательно присваивать каждому i-му элементу значение следующего элемента с индексом (i + 1). Например, удаление третьего элемента массива выглядит следующим образом:
i |
1 |
2 |
3 |
4 |
5 |
Первоначальный массив |
24 |
-3 |
1 |
31 |
-7 |
Результирующий массив |
24 |
-3 |
31 |
-7 |
(-7) |
Г
СА
решения задачи приведена на рис. 42.
Так как размер массива в процессе работы
меняется и для операции удаления
необходимо наличие значений следующих
по порядку элементов, то ввод исходного
массива, его обработку и вывод
результирующего массива следует
выполнять в разных циклах. Текст
программы следующий:
Sub ОМ3_Удаление_элемента()
Worksheets("Лист1").Select 'Выбор листа "Лист1"
Range("A:IV").Clear 'Очистка листа Excel
Randomize Timer
Dim x() As Integer 'Объявление динамического массива
Dim n As Integer 'Количество элементов в массиве
Dim i As Integer 'Счетчик элементов массива
Dim k As Integer 'Индекс удаляемого элемента
n = Val(InputBox("Введите кол-во элементов массива"))
k = Val(InputBox("Введите номер удаляемого элемента"))
ReDim x(n) 'Задание размера массива
Cells(1, 1) = "Исходный массив:"
For i = 1 To n 'Цикл ввода-вывода элементов массива
x(i) = Fix(100 * Rnd) 'Случайные числа от 0 до 99
Cells(2, i) = x(i) 'Вывод массива во 2-ю строку
Next i
For i = k To n – 1 'Цикл переписи значений элементов
'на один вперед, начиная с позиции удаления k,
'до n – 1 (так как элементов будет на 1 меньше)
x(i) = x(i + 1) 'Присвоение i-му элементу значения следующего элемента
Next i
ReDim Preserve x(n – 1) 'Уменьшение размера массива на 1 с сохранением
'предыдущих значений
Cells(3, 1) = "Позиция удаления = " & k
Cells(4, 1) = "Результирующий массив:"
For i = 1 To n – 1 'Цикл вывода элементов результирующего
Cells(5, i) = x(i) 'массива в 5-ю строку рабочего листа Excel
Next i
End Sub
Пример ОМ4. Записать в одномерный массив Y(5) пять первых элементов массива X(10), значения которых больше 2. Исходный массив X расположен в 1-й строке рабочего листа 1, начиная с ячейки А1.
Так как количество элементов в массивах X и Y разное, для каждого из них следует использовать отдельный счетчик. ГСА решения задачи приведена на рис. 43. Текст программы следующий (значения исходного массива X должны быть введены в первой строке листа Excel до запуска программы):
Sub ОМ4_Перепись_элементов()
W
orksheets("Лист1").Select
'Выбор
листа "Лист1"
Range("2:100").Clear 'Очистка строк листа
Dim X(10) As Single 'Объявление массива X
Dim Y(5) As Single 'Объявление массива Y
Dim ix As Byte 'Счетчик элементов массива X
Dim iy As Byte 'Счетчик элементов массива Y
For ix = 1 To 10 'Цикл чтения массива X
X(ix) = Cells(1, ix) 'из 1-й строки листа Excel
Next ix
iy = 0 'Обнуляем счетчик элементов массива Y
For ix = 1 To 10 'Перебираем элементы массива X
If X(ix) > 2 Then 'Проверяем заданное условие
iy = iy + 1 'Формируем индекс очередного
'элемента массива Y
Y(iy) = X(ix) 'Присваиваем элементу массива Y
'значение элемента массива X
If iy = 5 Then Exit For 'Если уже есть пять
'элементов, выходим из цикла
End If
Next ix
Cells(4, 1) = "Результирующий массив Y:"
For iy = 1 To 5 'Цикл вывода элементов
Cells(5, iy) = Y(iy) 'результирующего массива
'в 5-ю строку листа Excel
Next iy
End Sub
Пример ОМ5. В одномерном массиве X(5) = {–2, 1, 4, –15, 8} поменять местами минимальный элемент и первый положительный элемент (т. е. в данном случае нужно поменять местами четвертый и второй элементы, имеющие соответственно значения –15 и 1).
Обмен значений переменных A и B выполняется с помощью вспомогательной переменной vspom по следующей схеме:
vspom = A
A = B
B = vspom
Составим программу исходя из того, что заданный массив X предварительно введен в первую строку рабочего листа Excel:
Sub ОМ5_Обмен_значений()
Worksheets("Лист1").Select 'Выбор рабочего листа "Лист1"
Range("2:100").Clear 'Очистка строк рабочего листа Excel
Dim X(5) As Single 'Объявление массива X
Dim i As Byte 'Счетчик элементов массива
Dim xmin As Single 'Минимальное значение элемента массива
Dim imin As Byte 'Индекс минимального элемента массива
Dim ipp As Byte 'Индекс первого положительного элемента массива
Dim vspom As Single 'Вспомогательная переменная для обмена значений
For i = 1 To 5 'Цикл чтения массива из первой строки листа Excel
X(i) = Cells(1, i)
Next i
xmin = X(1) : imin = 1 'Выбираем в качестве начального минимума первый
'элемент массива и запоминаем его индекс
For i = 2 To 5 'Цикл поиска минимума
If X(i) < xmin Then 'Проверяем условие на минимум
xmin = X(i) 'Запоминаем значение xmin
imin = i 'Запоминаем индекс элемента xmin
End If
Next i
For i = 1 To 5
If X(i) > 0 Then 'Находим положительный элемент,
ipp = i 'запоминаем его индекс и
Exit For 'Сразу выходим из цикла, так как нужен только
'первый положительный элемент
End If
Next i
'Вывод значений элементов массива с индексами imin (минимальный элемент)
'и ipp (первый положительный элемент):
Cells(3, 1) = "Минимальный элемент =" & X(imin)
Cells(4, 1) = "Первый положительный =" & X(ipp)
'Обмен значений элементов массива с индексами imin и ipp с помощью вспомогательной переменной vspom:
vspom = X(imin) 'Записываем значение минимального элемента
'во вспомогательную переменную
X(imin) = X(ipp) 'Записываем на место минимального элемента
'первый положительный элемент
X(ipp) = vspom 'Записываем на место элемента с индексом ipp
'значение из вспомогательной переменной
Cells(6, 1) = "Результирующий массив:"
For i = 1 To 5 'Цикл вывода элементов результирующего
Cells(7, i) = X(i) 'массива в 7-ю строку рабочего листа
Next i
End Sub
Примеры ОМ1 – ОМ5 включают в себя наиболее часто встречающиеся программные структуры, которые целиком или отдельными фрагментами могут быть использованы при решении широкого круга инженерных задач.
Библиографический список
1. Михеев Р. Н. VBA и программирование в MS Office для пользователей / Р. Н. Михеев. СПб: БХВ-Петербург, 2006. 384 с.
2. Информатика: Учебник / Б. В. Соболь, А. Б. Галин и др. Ростов-на-Дону: Феникс, 2007. 446 с.
3. Компьютерный практикум: Учебное пособие / Под ред. В. И. Колесникова. М.: Дашков и К°, 2009. 237 с.
Учебное издание
СИДОРОВА Елена Анатольевна,
ЧЕЛОБАНОВ Павел Степанович
ОСНОВЫ ПРОГРАММИРОВАНИЯ НА VBA
Конспект лекций
_________________________________________
Редактор Н. А. Майорова
***
Подписано в печать .10.2012. Формат 60 84 1/16.
Плоская печать. Бумага офсетная. Усл. печ. л. 6,2. Уч.-изд. л. 6,9.
Тираж 300 экз. Заказ .
**
Редакционно-издательский отдел ОмГУПСа
Типография ОмГУПСа
*

5