Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
КИТ часть_1 (Лаб практикум) / VBA_лаб_практикум.doc
Скачиваний:
256
Добавлен:
15.06.2014
Размер:
3.06 Mб
Скачать

6.5 Функции обработки строк

В таблице 6.1 приведены некоторые встроенные функции языка VBA для обработки строк.

Таблица 6.1 – Основные функции обработки строк в VBA

Функция и ее аргументы

Возвращаемое значение

Len (строка)

Длина строки.

Left (строка, длина)

Подстрока заданной длины, выделенная из исходной строки слева.

Right (строка, длина)

Подстрока заданной длины, выделенная из исходной строки справа.

Mid (строка, начало, длина)

Подстрока заданной длины, выделенная из исходной строки, начиная с символа с номером «начало».

Trim (строка)

Заданная строка без начальных и концевых пробелов.

LTrim (строка)

Заданная строка без начальных пробелов.

RTrim (строка)

Заданная строка без концевых пробелов.

LCase (строка)

Заданная строка, преобразованная в строчные буквы.

UCase (строка)

Заданная строка, преобразованная в заглавные буквы.

InStr (начало, исходная строка, искомая подстрока)

Позиция искомой подстроки в исходной строке, начиная с позиции с номером «начало». Если «начало» не указано, то поиск выполняется с первой позиции. Если искомая подстрока отсутствует, возвращается значение 0.

Replace (исходная строка, заменяемая подстрока, заменяющая подстрока, начало, количество замен)

В исходной строке одна подстрока заменяется на другую. Замена выполняется, начиная с позиции с номером «начало». Если «начало» не указано, то замена выполняется с первой позиции. Если не указано «количество замен», то заменяются все вхождения заменяемой подстроки.

StrComp (строка1, строка2)

Выполняется сравнение заданных строк. Возвращается значение 1, если «строка1» больше «строки2», значение 0, если строки равны, и значение -1, если «строка1» меньше «строки2».

Примечание – В данной таблице приведены только основные типы данных. Для приведенных функций также описаны только основные возможности. Более подробные сведения о встроенных функциях имеются в литературе по VBA, а также в справочной системе.

Приведем примеры программ с использованием этих функций.

Пример 6.4 – Имеется текстовый файл, где указаны фамилии людей и их доходы в следующей форме:

Иванов 200

Петров 500

Сидоров 120

Требуется вывести эти данные на рабочий лист Excel: фамилии – в столбец A, доходы – в столбец B. Имя файла должно запрашиваться у пользователя в стандартном окне открытия файла.

Sub primer6_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)).

Пример 6.5 – В столбце A рабочего листа Лист1 указаны фамилии, имена и отчества работников некоторой организации. В каждой ячейке указаны фамилия, имя и отчество (полностью) одного работника. Между фамилией и именем, а также между именем и отчеством указано в точности по одному пробелу. Требуется получить на рабочем листе Лист2 (в столбце A) список работников, содержащий их фамилии и инициалы. Список должен быть упорядочен по алфавиту.

Sub primer6_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) ‘Вывод в ячейки рабочего листа

Next i

End Sub

Функции, используемые в этой программе, описаны в таблице 6.1. Приведем лишь пояснения о функции StrComp, используемой для «сравнения» строк при их сортировке по алфавиту. При сравнении строк «большей» считается строка, расположенная «ниже» по алфавиту. Например, если в приведенной программе некоторый (i-й) элемент массива spisok будет содержать значение “Иванов Ю.С.”, а j-й элемент этого массива – значение “Яшин А.П.”, то функция StrComp(spisok(i), spisok(j)) вернет значение -1, так как строка “Иванов Ю.С.” считается «меньшей», чем строка “Яшин А.П.”. В этом случае элементы массива не будут меняться местами. Если же, например, i-й элемент массива spisok содержит значение “Антонов С.К.”, а j-й – значение “Андреев Ф.Р.”, то функция StrComp(spisok(i), spisok(j)) вернет значение 1, и элементы массива поменяются местами.

Примечание – В данном примере (в отличие от всех предыдущих примеров в этой лабораторной работе) все данные размещаются в рабочих листах Excel, а текстовые файлы не используются. Поэтому действия, описанные в подразделе 6.1, не требуются.