Обмен данными между двумя файлами
Пример 8.3 –Имеется некоторый текстовый файл, где в каждой строке находится или некоторое число, или некоторый текст. Требуется вывести все числа из этого файла, превышающие 10, в другой файл. Имя файла с исходными данными должно выбираться пользователем. Имя файла для вывода результатов – D:\User\chisla.txt. Если этот файл уже существует, то его прежнее содержимое должно удаляться.
Sub primer8_3()
Set fso = CreateObject("scripting.filesystemobject")
ChDrive "D"
ChDir "D:\User"
otkr_file = Application.GetOpenFilename("Text Files (*.txt), *.txt")
rez_file = "D:\User\chisla.txt"
Set ishod = fso.OpenTextFile(otkr_file, ForReading)
Set rezult = fso.OpenTextFile(rez_file, ForWriting, True)
Do While Not ishod.AtEndOfStream
stroka = ishod.ReadLine
If IsNumeric(stroka) Then
x = CSng(stroka)
If x > 10 Then rezult.WriteLine (x)
End If
Loop
ishod.Close
rezult.Close
End Sub
В операторе Set rezult = fso.OpenTextFile(rez_file, ForWriting, True) файл с заданным именем (хранящимся в переменной rez_file) открывается для записи данных с потерей прежних данных (ForWriting). Значение True указывает, что в случае, если указанный файл не существует, он будет создан. Если бы требовалось добавлять данные в этот файл (с сохранением прежних данных), то вместо ForWriting было бы указано ForAppending. С открываемым файлом связывается объект rezult.
Следует обратить внимание, что в конце работы программы необходимо закрыть все использовавшиеся в ней файлы (в данном примере – два файла, с которыми были связаны объекты ishod и result).
Функции обработки строк
В таблице 8.1 приведены некоторые встроенные функции языка VBA для обработки строк.
Таблица 8.1 – Основные функции обработки строк в VBA
Функция и ее аргументы
| Возвращаемое значение
| Len (строка)
| Длина строки.
| Left(строка, длина)
| Подстрока заданной длины, выделенная из исходной строки слева.
| Right(строка, длина)
| Подстрока заданной длины, выделенная из исходной строки справа.
| Mid(строка, начало, длина)
| Подстрока заданной длины, выделенная из исходной строки, начиная с символа с номером «начало».
| Trim (строка)
| Заданная строка без начальных и концевых пробелов.
| LTrim (строка)
| Заданная строка без начальных пробелов.
| RTrim (строка)
| Заданная строка без концевых пробелов.
| LCase (строка)
| Заданная строка, преобразованная в строчные буквы.
| UCase (строка)
| Заданная строка, преобразованная в заглавные буквы.
| InStr (начало, исходная строка, искомая подстрока)
| Позиция искомой подстроки в исходной строке, начиная с позиции с номером «начало». Если «начало» не указано, то поиск выполняется с первой позиции. Если искомая подстрока отсутствует, возвращается значение 0.
| Replace (исходная строка, заменяемая подстрока, заменяющая подстрока, начало, количество замен)
| В исходной строке одна подстрока заменяется на другую. Замена выполняется, начиная с позиции с номером «начало». Если «начало» не указано, то замена выполняется с первой позиции. Если не указано «количество замен», то заменяются все вхождения заменяемой подстроки.
| StrComp (строка1, строка2)
| Выполняется сравнение заданных строк. Возвращается значение 1, если «строка1» больше «строки2», значение 0, если строки равны, и значение -1, если «строка1» меньше «строки2».
| Приведем примеры программ с использованием этих функций.
Пример 8.4 –Имеется текстовый файл, где указаны фамилии людей и их доходы в следующей форме:
Иванов 200
Петров 500
Сидоров 120
Требуется вывести эти данные на рабочий лист Excel: фамилии – в столбец A, доходы – в столбец B. Имя файла должно запрашиваться у пользователя в стандартном окне открытия файла.
Sub primer8_4()
Set fso = CreateObject(“Scripting.FileSystemObject”)
ChDrive (“D”)
ChDir(“D:\User”)
otkr_file = Application.GetOpenFilename()
If otkr_file = False Then Exit Sub
Set vvod = fso.OpenTextFile(otkr_file, ForReading)
i=0
Do While Not vvod.AtEndOfStream
stroka = vvod.ReadLine
stroka = Trim(stroka)
k=InStr(stroka,” “)
If k = 0 Then
MsgBox(“Ошибка в файле данных”)
Exit Sub
End If
familia = Left(stroka, k - 1)
dlina = Len(stroka)
dohod_stroka = Right(stroka, dlina - k)
dohod_stroka = Trim(dohod_stroka)
If IsNumeric(dohod_stroka) = False Then
MsgBox(“Ошибка в файле данных”)
Exit Sub
End If
dohod=CSng(dohod_stroka)
i=i+1
Cells(i,1).value = familia
Cells(i,2).value = dohod
Loop
Vvod.Close
End Sub
Начальные действия, выполняемые в этой программе (выбор и открытие файла, а также организация ввода данных до конца файла с помощью оператора Do While), рассмотрены ранее.
В операторе stroka = vvod.ReadLine вводится одна строка из заданного файла. Эта строка присваивается переменной strokа. В операторе stroka = Trim(stroka) функция Trim удаляет из переменной strokа начальные и концевые пробелы, т.е. пробелы в начале и в конце строки (если они есть).
В операторе k=InStr(stroka,” “) определяется позиция первого пробела в переменной stroka. Например, если переменная stroka имеет значение “Иванов 200”, то переменная k получит значение 7. Если пробел в переменной stroka отсутствует (k=0), значит, данные в файле заданы неправильно, и программа завершается с выдачей сообщения об ошибке в файле данных.
В операторе familia = Left(stroka, k - 1) из переменной stroka выделяются ее левые символы до первого пробела, т.е. фамилия.
Оператор dlina = Len(stroka) определяет длину строки, введенной из файла (эта длина включает фамилию, доход, а также пробелы между ними). В операторе dohod_stroka = Right(stroka, dlina - k) выделяется правая часть строки. Например, для строки “Иванов 200” переменные получат значение k=7, dlina=10 (если между фамилией и доходом указан один пробел). Таким образом, функция Right(stroka, dlina - k) выделит из переменной stroka три правых символа, т.е. подстроку “200”.
Оператор dohod_stroka = Trim(dohod_stroka) приведен на случай, если между фамилией и доходом будет указано несколько пробелов. Функция Trim удалит их.
Затем с помощью функции IsNumeric проверяется, действительно ли выделенная часть строки (переменная dohod_stroka) представляет собой число. Если это не так (функция IsNumeric возвращает значение False), значит, данные в файле заданы неправильно. В этом случае выводится сообщение об ошибке, и программа прерывается (оператором Exit Sub).
После проверки переменная dohod_stroka преобразуется в число (переменная dohod) с помощью функции CSng. В операторе i = i+1 вычисляется номер очередной строки на рабочем листе Excel, в которую требуется вывести фамилию и доход. Затем эти величины выводятся в заданные ячейки.
Примечание – Функции для работы со строками, как и другие функции, могут быть «вложены» друг в друга. Например, вместо операторов dohod_stroka=Right(stroka, dlina-k) и dohod_stroka = Trim(dohod_stroka) можно было использовать один оператор: dohod_stroka = Trim(Right(stroka, dlina - k)).
Пример 8.5 – В столбце A рабочего листа Лист1 указаны фамилии, имена и отчества работников некоторой организации. В каждой ячейке указаны фамилия, имя и отчество (полностью) одного работника. Между фамилией и именем, а также между именем и отчеством указано в точности по одному пробелу. Требуется получить на рабочем листе Лист2 список работников, содержащий их фамилии и инициалы. Список должен быть упорядочен по алфавиту.
Sub primer8_5()
Dim spisok() As String ‘Объявление массива для списка работников
Set d = Range(“A1”).CurrentRegion ‘Определение диапазона с данными
m = d.Rows.Count ‘Определение количества строк (работников)
ReDim spisok(1 To m) ‘Объявление массива необходимого размера
For i = 1 To m ‘Перебор всех работников
fam_im_ot = Trim(Cells(i,1)) ‘Содержимое ячейки присваивается переменной
‘fam_im_ot. Если есть начальные или конечные
‘пробелы, то они удаляются
probel1 = InStr(fam_im_ot,” “) ‘Определяется позиция первого пробела (между
‘фамилией и именем)
fam_i = Left(fam_im_ot, probel1 + 1) ‘Выделяется фамилия и первая буква имени
probel2 = InStr(probel1+1, fam_im_ot, ” “) ‘Определяется позиция второго пробела (между
‘именем и отчеством). Поиск начинается с пози-
‘ции, следующей за первым пробелом
init_ot = mid(fam_im_ot, probel2+1, 1) ‘Выделяется первая буква отчества
fam_io = fam_i+”.“+init_ot+”.” ‘Фамилия и инициалы соединяются
spisok(i) = fam_io ‘Присваивание элементу массива
Next i ‘Переход к следующему работнику
‘ Сортировка списка работников (массива spisok)
For i = 1 To m-1 ‘ФИО каждого работника будет сравниваться
For j =i+1 To m ‘со всеми последующими
If StrComp(spisok(i), spisok(j)) = 1 Then ‘Если ФИО i-го работника «больше», чем j-го,
x = spisok(i) ‘то они меняются местами
spisok(i) = spisok(j)
spisok(j) = x
End If
Next j
Next i
‘ Вывод отсортированного массива на рабочий лист Лист2
Worksheets("Лист2").Activate ‘Рабочий лист становится текущим
For i = 1 To m
Cells(i,1).Value = spisok(i) ‘Вывод в ячейки рабочего листа, в столбец A
Next i
End Sub
Функции, используемые в этой программе, описаны в таблице 8.1. Приведем лишь пояснения о функции StrComp, используемой для «сравнения» строк при их сортировке по алфавиту. При сравнении строк «большей» считается строка, расположенная «ниже» по алфавиту. Например, если в приведенной программе некоторый (i-й) элемент массива spisok будет содержать значение “Иванов Ю.С.”, а j-й элемент этого массива – значение “Яшин А.П.”, то функция StrComp(spisok(i), spisok(j)) вернет значение -1, так как строка “Иванов Ю.С.” считается «меньшей», чем строка “Яшин А.П.”. В этом случае элементы массива не будут меняться местами. Если же, например, i-й элемент массива spisok содержит значение “Антонов С.К.”, а j-й – значение “Андреев Ф.Р.”, то функция StrComp(spisok(i), spisok(j)) вернет значение 1, и элементы массива поменяются местами.
Примечание – В данном примере (в отличие от всех предыдущих примеров в этой лабораторной работе) все данные размещаются в рабочих листах Excel, а текстовые файлы не используются. Поэтому действия, описанные в разделе 8.1, в данном случае не требуются.
Варианты заданий
Примечание – В этой лабораторной работе варианты 1-6 представляют собой задачи на операции с файлами, варианты 7-12 – задачи на обработку строк.
Вариант 1 – На рабочем листе Лист1 в столбце A указаны фамилии людей, в столбце B – их адреса (адрес включает почтовый индекс, город, улицу, дом и квартиру). Имеется также текстовый файл со списком городов (в каждой строке – один город). Программа должна выводить в новый текстовый файл и на рабочий лист Лист2 перечень людей, проживающих в городах, названия которых указаны в исходном текстовом файле. Этот перечень должен быть упорядочен по названиям городов.
Вариант 2 – На рабочем листе в столбце A расположены фамилии работников некоторой организации, в столбце B – их доходы. Имеется также текстовый файл, где указаны дополнительные доходы некоторых из этих работников: в каждой строке файла – фамилия и дополнительный доход, разделенные пробелами (одним или несколькими). Порядок фамилий в файле и на рабочем листе может не совпадать. Программа должна прибавлять дополнительные доходы, указанные в текстовом файле, к доходам, содержащимся в столбце B. Кроме того, перечень работников и их доходов, упорядоченный по алфавиту, должен выводиться в новый текстовый файл.
Вариант 3 – На рабочем листе Excel в столбце A расположены номера контрактов, в столбце B – названия товаров, в столбце C – цены на товары, в столбце D – количества товаров. Цена каждого товара во всех контрактах одинакова. Имеется также текстовый файл, где указаны названия некоторых из товаров и коэффициенты повышения цен на них: в каждой строке файла – название товара и коэффициент повышения цены, разделенные пробелами. Программа должна вычислять новые цены и выводить их в столбец C взамен старых. Кроме того, данные обо всех контрактах, для которых была изменена цена товара, должны выводиться в новый текстовый файл. Эти данные должны быть упорядочены по названиям товаров.
Вариант 4 – На рабочем листе в столбце A введены фамилии работников, в столбце B – номера отделов, где они работают (в одном отделе может быть несколько работников), в столбце C – их зарплаты. Имеется также текстовый файл, где указаны номера отделов и коэффициенты повышения зарплаты: в каждой строке файла – номер отдела и коэффициент повышения зарплаты для его работников, разделенные пробелами. Программа должна вычислять новые зарплаты и выводить их в столбец C взамен старых. Кроме того, программа должна вычислять для каждого отдела количество работников и сумму их зарплат (считать, что в файле с коэффициентами повышения зарплат перечислены все отделы). Эти данные должны выводиться в новый текстовый файл: каждая строка в этом файле должна содержать данные по одному отделу. Данные в новом файле должны быть упорядочены по номеру отдела.
Вариант 5 – На рабочем листе Лист1 в столбце A перечислены названия валют, в столбце B – их курсы в долларах. Имеется также текстовый файл, где приведены названия товаров, цены этих товаров и названия валют, в которых указаны цены. В каждой строке файла имеются данные по одному товару, разделенные пробелами. Программа должна выводить в новый текстовый файл названия товаров и их цены в долларах. Перечень должен быть упорядочен по названиям товаров. Кроме того, данные о товарах (название товара, исходная цена, валюта, цена в долларах) должны выводиться на рабочий лист Лист2.
Вариант 6 – На рабочем листе в столбце A расположены фамилии студентов, в столбцах B-D – результаты сдачи ими трех экзаменов. Имеется также текстовый файл, где указаны фамилии этих же студентов и результаты сдачи ими четвертого экзамена (в каждой строке файла – фамилия и оценка, разделенные пробелами). Порядок фамилий в файле и на рабочем листе может не совпадать. Программа должна выводить оценки по четвертому экзамену в столбец E. Программа должна также создавать два текстовых файла: в один из них должны выводиться фамилии студентов со средним баллом выше 8 (с указанием среднего балла), во второй – фамилии остальных студентов. Оба файла должны быть упорядочены по фамилиям.
Вариант 7 – Имеется текстовый файл. Программа должна подсчитывать количество строк в этом файле, содержащих хотя бы одну цифру.
Вариант 8 – Имеется текстовый файл, в каждой строке которого - несколько слов, разделенных пробелами. Программа должна по каждой строке файла составлять аббревиатуру из первых букв слов, составляющих эту строку. Аббревиатуры выводятся в столбец рабочего листа Excel.
Вариант 9 – Имеется текстовый файл, в каждой строке которого – несколько слов, разделенных пробелами. Программа должна подсчитывать количество слов в каждой строке. Результаты выводятся в столбец рабочего листа Excel.
Вариант 10 – Программа должна запрашивать с клавиатуры строковую переменную. В качестве этой переменной вводится строка из нескольких слов, разделенных пробелами. Программа должна выводить эти слова в обратном порядке.
Вариант 11 – Имеется текстовый файл, в каждой строке которого - несколько слов, разделенных пробелами (одним или несколькими). Программа должна создавать новый текстовый файл, состоящий из тех же строк, но интервалы между словами должны состоять только из одиночных пробелов.
Вариант 12 – Имеется текстовый файл, в каждой строке которого - несколько слов, разделенных пробелами. Из каждой строки этого файла программа должна выделять первое и последнее слово. Из полученных строк должен создаваться новый текстовый файл.
ЛИТЕРАТУРА
1Шерстев, В. Л. Компьютерные информационные технологии / В.Л. Шерстнев. – Витебск: ВГТУ, 2006. – 350 с.
2Кеттелл, Дж. Microsoft Office 2003. Полное руководство / Дж. Кет-телл, Г. Харт-Дэвис, К. Симмонс. – М.: ЭКОМ, 2006. – 832 с.
3Меженный, О. А. Microsoft Office 2003. Краткое руководство. – М.: Издательский дом «Вильямс», 2005. – 368 с.
4Гарнаев, А. Ю. Excel, VBA, Internet в экономике и финансах. – СПб.: БХВ–Петербург, 2002. – 816 с.
5Слепцова, Л. Д. Программирование на VBA: Самоучитель. – М.: Издательский дом «Вильямс», 2004. – 384 с.
6Программирование в пакетах Microsoft Office / С. В. Назаров [и др.]. М.: Финансы и статистика, 2007. – 656 с.
7Ананьев, А. И. Самоучитель Visual Basic 6.0 / А.И. Ананьев, А.Ф. Федоров. – СПб.: БХВ–Петербург, 2005. – 624 с.
СОДЕРЖАНИЕ
Лабораторная работа №1 Развитые возможности табличного процессора MS Excel: базы данных................................................................. 3
Лабораторная работа №2Система управления базами данных MS Access: таблицы, формы........................................................................... 19
Лабораторная работа №3Система управления базами данных MS Access: запросы, отчеты........................................................................... 31
Лабораторная работа №4Основы программирования на языке VBA...... 48
Лабораторная работа №5Операции с ячейками и рабочими листами MS Excel в программах на VBA..................................................................... 75
Лабораторная работа №6Элементы управления в программах на VBA. 88
Лабораторная работа №7Пользовательские формы в программах на VBA 96
Лабораторная работа №8Программы на VBA для работы с текстовыми данными................................................................................... 114
Литература..................................................................................................... 125
Не нашли, что искали? Воспользуйтесь поиском по сайту:
©2015 - 2024 stydopedia.ru Все материалы защищены законодательством РФ.
|