- •Содержание
- •Введение
- •1 Алгоритм и его свойства
- •2 Основные понятия VBA. Линейные алгоритмы
- •2.1 Элементы языка VBA
- •2.2 Типы данных VBA
- •2.3 Константы VBA
- •2.4 Переменные VBA
- •2.5 Выражения в VBA
- •2.6 Встроенные функции VBA
- •2.7 Оператор присваивания
- •3 Разветвляющиеся алгоритмы
- •3.1 Оператор IF и его формы записи
- •3.2 Типовые задачи разветвляющихся алгоритмов
- •4 Циклические алгоритмы
- •4.1 Оператор цикла For
- •Оператор цикла For Each
- •4.2 Оператор цикла Do
- •4.3 Вложенные циклы
- •5 Обработка массивов данных
- •5.1 Ввод-вывод массивов
- •Расположение данных в файле "dat.txt"
- •Расположение данных в файле "res.txt"
- •5.2 Программирование обработки одномерных массивов
- •5.3 Программирование обработки двумерных массивов
- •6.1 Лабораторная работа №1
- •6.2 Задание к расчетно-графической работе №1
- •6.3 Лабораторная работа №2
- •Обработка массивов данных на VBA
- •6.4 Задание к расчетно-графической работе №2
- •ЛИТЕРАТУРА
- •Окно проекта
- •Главное меню
- •Интеллектуальные возможности редактора кода
- •Операции сравнения
- •Конкатенация строк
- •Логические операторы VBA
- •Приоритеты выполнения операций при вычислении сложных выражений
- •Операторы пересчета
Результат, выведенный в окно отладки
с опцией Preserve |
без опциии Preserve |
1 |
0 |
1,2 |
0 |
1,3 |
0 |
1,4 |
1,4 |
1,5 |
1,5 |
5.1 Ввод-вывод массивов
Задать значения элементам массива можно следующими способами:
с помощью арифметического оператора присваивания (см. программу предыдущего примера);
из текстового файла оператором ввода Input;
через диалоговые окна Excel;
из ячеек активного листа рабочей книги Excel.
Ввод значений элементов массива из текстового файла организуют с использованием оператора ввода Input. При вводе (или выв о- де) массивов используются два основных способа: ввод-вывод статического массива с заранее известным числом элементов и ввод-вывод динамического массива, число элементов в котором определяется в момент выполнения программы.
Пример 5.2. Ввести и вывести в текстовый файл элементы массива вещественного типа из 10-ти элементов. Исходные данные помещаются в текстовом файле с именем «dat.txt», а в файл вывода с именем «res.txt» выводим массив по пять чисел в строке. Предполагаем, что в качестве разделителя целой и дробной части чисел в файле «dat.txt» используется символ «точка».
Sub Пример_5_2()
Dim Mas(1 To 10) As Single
69
Dim i As Integer
Open "dat.txt" For Input As #1 ' открываем файла для ввода Open "res.txt" For Output As #2 ' открываем файла для вывода
Print #2, "Введенный массив Mas(10)"
For i = 1 To 10
If EOF(1) = True Then ' проверяем - достигли конца файла или нет ' конец файла достигнут, а данных меньше 10. Сообщаем об ошибке
MsgBox "В файле ""dat.txt"" всего " & i-1 & " чисел - ОШИБКА"
Exit For End If
Input #1, Mas(i) ' считываем из файла очередное число
Print #2, Mas(i), ' выводим число, но не заканчиваем строку вывода If Int(i/5)*5 = i Then Print #2, Chr(13) 'Заканчиваем вывод строки
' из 5-ти элементов
Next
Close 'оператор Close без параметров закрывает оба открытых файла
End Sub
Расположение данных в файле "dat.txt"
1.1
1.2
1.3
1.4
5
6 -7.7 -8 9 10
|
Расположение данных в файле "res.txt" |
|
||
Введенный массив Mas(10) |
|
|
||
1,1 |
1,2 |
1,3 |
1,4 |
5 |
6 |
-7,7 |
-8 |
9 |
10 |
70
Результат |
работы |
программы не |
изменится, если в файле |
||
"dat.txt" данные расположить по пять чисел в строке: |
|||||
1.1 |
1.2 |
1.3 |
1.4 |
5 |
|
6 |
-7.7 |
-8 |
9 |
10 |
. |
Однако если в файле исходных данных будут пустые строки, то эти строки будут восприняты как нулевые значения очередных элементов. Символ «запятая» в данных воспринимается как разделитель между числами. Поэтому если задать числа с десятичной запятой между целой и дробной частью числа – будут прочитаны два целых числа. При этом оператор Print выводит дробные числа с разделителем запятая.
Если в файле «dat.txt» окажется меньше 10 чисел, то на активный лист Excel будет выведено диалоговое окно с сообщением об ошибке, а в файле «res.txt» будут напечатаны прочитанные числа. Если же в файле будет больше 10 чисел, то будут обработаны только первые 10.
Таких проблем можно избежать, если в программе использовать не статический, а динамический массив.
Пример 5.3. Прочитать данные из файла в массив и определить количество элементов в массиве.
Sub Пример_5_3()
Dim Mas() As Single 'объявляем динамический массив вещественного типа
Dim i As Integer ' рабочая переменная целого типа
Dim kol As Integer 'переменная для определения количества чисел в файле
Open "dat.txt" For Input As #1 ' открываем файла для ввода
' первое чтение файла для определения количества чисел в массиве kol = 0 ' обнуляем переменную Kol
Do ' начинаем "бесконечный" цикл
If EOF(1)=True Then Exit Do 'достигнут конец файла - выход из цикла kol = kol + 1 ' подсчитываем количество прочитанных данных ReDim Preserve Mas(1 To kol) ' увеличиваем размер динамического
' массива с сохранением ранее введенной информации
71
Input #1, Mas(kol) ' считываем из файла очередное число в массив
Loop
Close #1 ' закрываем файл dat.txt
Open "res.txt" For Output As #2 ' открываем файла для вывода
Print #2, "Введенный массив содержит " & kol & " элементов"
For i = 1 To kol
Print #2, Mas(i), ' выводим число, но не заканчиваем строку вывода
If Int(i / 5) * 5 = i Then Print #2, Chr(13)
'Если переменная i кратна пяти – выводим в строку вывода
'символ «конец строки»
Next i
Close #2 ' закрываем файл res.txt
End Sub
|
При чтении файла «dat.txt» из предыдущего примера располо- |
|||
жение данных в файле «res.txt» будет следующим |
|
|
||
Введенный массив содержит 10 элементов |
5 |
|||
1,1 |
1,2 |
1,3 |
1,4 |
|
6 |
-7,7 |
-8 |
9 |
10 |
Одним из способов ввода данных в программу является ввод элементов массива с использованием диалоговых окон Excel. При использовании статического массива число его элементов должно быть заранее известно. Для динамического массива в начале работы программы необходимо запросить количество элементов в массиве, а затем организовать ввод числовых данных.
Пример 5.4. Ввести одномерный массив через диалоговое окно Excel. Вывести элементы массива в первый столбец активного листа рабочей книги Excel.
Sub Пример_5_4()
'**********************************************
' Ввод массива с клавиатуры
'**********************************************
Dim A() As Single ' объявляем динамический массив вещественного типа
Dim N As Integer ' переменная для количества элементов в массиве
72
' выводим в ячейку А1 заголовок
Worksheets("Лист1").Cells(1, 1) = "Массив А:"
N = Val(InputBox("Введите количество элементов массива")) ReDim A(1 To N) ' задаем размер массива А
For i = 1 To N
A(i) = Val(InputBox("Введите A(" & i & ")", _
"Осталось ввести " & N - i + 1 & " элемент(ов/а)"))
Cells(i + 1, 1) = A(i)
Next
End Sub
Программа выводит в ячейку «А1» первого листа таблицы Excel заголовок «Массив А:», затем запрашивает количество элементов в массиве (рисунок 5.1). После определения количества элементов в массиве для данного сеанса работы, программа в цикле запрашивает ввод очередного числа, указывая в заголовке диалогового окна количество элементов, которое осталось ввести (рисунок 5.2). При этом пользователь видит в первом столбце таблицы Excel ранее введенные значения.
Рисунок 5.1 – Запрос на задание числа элементов в массиве
Рисунок 5.2 – Запрос на ввод очередного элемента массива
73
Однако наиболее удобным способом ввода данных в VBA является ввод информации непосредственно из таблицы Excel, где и хр а- нится сама программа. Обмен данными с таблицей выполняется ко-
мандой Cells(i,j).
Пример 5.5. Ввести массив данных их первого столбца активного листа рабочей книги Excel. Вывести полученные данные в текстовый файл.
Sub Пример_5_5()
Dim Mas() As Single 'объявляем динамический массив Dim i As Integer ' рабочая переменная целого типа Dim kol As Integer ' количество чисел в файле
kol = 0 ' обнуляем переменную kol
Do Until Cells(kol + 1, 1) = Empty ' выполняем цикл, пока есть данные kol = kol + 1 ' подсчитываем количество прочитанных данных ReDim Preserve Mas(1 To kol) ' увеличиваем размер массива
' с сохранением ранее введенной информации Mas(kol) = Cells(kol, 1) 'считываем из таблицы очередное число
Loop
Open "res.txt" For Output As #2 ' открываем файла для вывода
Print #2, "Введенный массив содержит " & kol & " элементов"
For i = 1 To kol
Print #2, Mas(i), ' выводим число, но не заканчиваем строку вывода
If Int( i / 5) * 5 = i Then Print #2, Chr(13) ' Заканчиваем вывод
' строки из 5-ти элементов
Next i
If Int(kol / 5) * 5 = kol Then Print #2, Chr(13) ' заканчиваем строку, ' если kol не кратен пяти
Close ' закрываем файл res.txt
End Sub
Программа просматривает первый столбец активного листа таблицы Excel. В данной программе при использовании метода Cells не используется объект Worksheets("Лист1"), что позволяет обращаться к активному листу, какое бы имя у него не было. Цикл, заданный оператором Do Until, продолжается до тех пор, пока в первом столб-
74