Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика VBA.pdf
Скачиваний:
891
Добавлен:
27.03.2016
Размер:
1.1 Mб
Скачать

Результат, выведенный в окно отладки

с опцией 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