Опубликован: 25.03.2009 | Уровень: для всех | Доступ: свободно
Лекция 7:

Массивы, циклы, принятие решений

< Лекция 6 || Лекция 7: 123 || Лекция 8 >

7.12. Сравнение с использованием Like и Is

07-10-Сравнение строк с шаблонами.docm - пример к п. 7.12.

Оператор Like используется для сравнения строк с шаблонами. Шаблон - это особым образом записанная последовательность символов. При построении шаблонов используются специальные символы, приведенные в табл. 7.5.

Таблица 7.5. Символы для построения шаблонов
Символы Описание
? Любой одиночный символ
* Любое количество любых символов
# Любая одиночная цифра
[список символов] Любой одиночный символ, входящий в список символов
[!список символов] Любой одиночный символ, не входящий в список

После построения шаблона его заключают в кавычки.

Давайте рассмотрим пример, реализующий следующие проверки.

  • Узнать, есть ли в строке прописные и заглавные буквы латинского алфавита.
  • Проверить, состоит ли введенное слово из четырех символов (цифр или букв)
  • Проверить, состоит ли введенная последовательность из двух любых символов (цифр или букв) и двух цифр
  • Проверить, нет ли во введенной строке русских букв " а " и " о "
  • Если введенная строка начинается двумя буквами " d " и заканчивается тремя буквами " f ", сообщить об этом

В листинге 7.19. вы можете найти решение этой задачи

Dim str_Inp As String
    str_Inp = InputBox("Введите строку")
    'Есть ли латинские буквы в строке
    If str_Inp Like "*[a-z]*" Or _
    str_Inp Like "*[A-Z]*" _
    Then MsgBox ("В строке есть латинские буквы")
    'Состоит ли введенное слово из 4-х символов
    If str_Inp Like "????" Then _
    MsgBox ("Введенное слово состоит из 4-х символов")
    'Состоит ли введенная последовательность
    'из 2-х любых символов и 2-х цифр
    If str_Inp Like "??##" Then _
    MsgBox ("Введены два любых символа и две цифры")
    'Проверка на отсутствие букв
    '"а", "о"
    If str_Inp Like "[!а]" And _
    str_Inp Like "[!о]" Then
    MsgBox ("В строке нет букв " + Chr(34) + _
    "а" + Chr(34) + " и " + Chr(34) + "о" + Chr(34))
    End If
    'Проверка на наличие в начале
    'введенной строки двух букв "d", а в конце
    'трех "f"
    If str_Inp Like "dd*fff" _
    Then MsgBox ("Строка имеет вид: dd*fff")
Листинг 7.19. Использование Like

Как вы можете видеть, шаблон для сравнения с текстом всегда заключается в двойные кавычки. На основе информации об использовании шаблонных символов вы можете самостоятельно построить выражения для проверки различных последовательностей.

Оператор Is используется для работы с объектными переменными. Мы будем подробно рассматривать их в начале следующей главы. Оператор Is проверяет, ссылаются ли две объектные переменные на один и тот же объект. Если это так - он возвращает True, если нет - то False.

7.13. Принятие решений: Select Case

07-11-Select Case.docm - пример к п. 7.13.

Если вам предстоит проверить данные на множество значений, для каждого из которых надо выполнить какое-то особое действие, можно использовать множество операторов If или один Select Case.

В листинге 7.20. приведен пример использования Select Case - в зависимости от введенного имени программа здоровается с пользователями по-разному.

Dim str_UserName As String
str_UserName = InputBox("Введите имя пользователя")
Select Case str_UserName
    Case "Александр"
        MsgBox ("Привет")
    Case "Сергей"
        MsgBox ("Здравствуй")
    Case "Николай"
        MsgBox ("Добро пожаловать")
    Case Else
        MsgBox ("Не существует такого пользователя")
End Select
Листинг 7.20. Использование Select Case

После Select Case указано имя переменной, анализ которой осуществляется. Дальше расположено произвольное количество вариантов - каждый вариант после ключевого слова Case. Если не выполнен ни один из Case - выполняется Case Else. В конце этой конструкции находится оператор End Select.

7.14. Оператор безусловного перехода

07-12-GoTo.docm - пример к п. 7.14.

В VBA есть один оператор, которым не рекомендуется пользоваться при написании программ. Это оператор безусловного перехода GoTo. Он позволяет передать управление в определенное место программы, заданное номером строки или меткой. Меткой строки может быть любое слово (подчиняющееся правилам именования переменных), после которого следует двоеточие.

Например, цикл с постусловием можно создать таким способом (листинг 7.21.):

Dim num_Cycle
    num_Cycle = 0
Cycle_Start:
    num_Cycle = num_Cycle + 1
    MsgBox ("Проход цикла номер: " + Str(num_Cycle))
    If num_Cycle < 5 Then GoTo Cycle_Start
Листинг 7.21. Цикл с постусловием с помощью оператора GoTo

Здесь мы создаем метку Cycle_Start, которая означает начало цикла. После этого увеличиваем на единицу переменную, которая является счетчиком цикла, выводим ее в окне сообщения. В последней строке мы проверяем переменную. Если она меньше 5 - команда GoTo Cycle_Start передает управление на соответствующую метку. В такой простой конструкции, как наша, особенных сложностей в чтении кода не видно. Но стоит программе хотя бы немного увеличиться, несколько подобных циклов (особенно - вложенных, а еще хуже - использующих номер строки для перехода) превратят ее в сложный для чтения и правки текст.

GoTo делает программы трудночитаемыми, его практически всегда можно заменить, используя другие программные конструкции. Единственное место, где GoTo пока незаменим - это использование его при написании обработчиков ошибок времени выполнения. В следующей лекции мы поговорим о таких ошибках и об использовании GoTo для организации подпроцедур в исполняемой процедуре.

7.15. Работа с файлами

07-13-Работа с файлами.docm - пример к п. 7.15.

Программы, написанные на VBA, умеют работать с внешними файлами. В частности, на практике могут возникнуть задачи по поиску файлов в директориях, по открытию, обработке, сохранению файлов. Открытие, обработка, сохранение - дело отдельных приложений (например, MS Word, MS Excel) - то есть эти задачи решаются с помощью объектных моделей этих приложений. А вот поиск файлов осуществляется общими для всех методами VBA.

Как правило, чтобы открыть файл, нужно знать его имя. Иными словами, поиск файлов заключается в получении имен файлов, находящихся в определенной директории. Для этого можно использовать команду Dir. Она возвращает строку, содержащую имя файла, используя путь, заданный при вызове. Давайте рассмотрим конструкцию (листинг 7.23.), которая позволяет найти все файлы, находящиеся в корневой директории диска C.

var_Doc = Dir("C:\*.*")
    Do While var_Doc <> ""
        MsgBox var_Doc
        var_Doc = Dir()
    Loop
Листинг 7.23. Поиск всех файлов в корневом каталоге диска C

Сначала мы присваиваем переменной var_Doc первое найденное имя файла. Очевидно, что узнав имя файла, мы можем сказать, что нашли этот файл на диске. В самом простом варианте использования функции Dir в качестве параметров мы передаем ей путь и маску имени файла. Знак * в маске означает любое количество любых символов. Следовательно, *.* означает "все файлы" - то есть файлы с любыми именами и любыми расширениями. В маске можно так же использовать знак ? - он символизирует один любой символ. Если не указать путь к файлам, а лишь маску - Dir будет искать их в текущей директории. Например, для Microsoft Word по умолчанию это папка Мои документы.

Помимо пути и маски при поиске файлов можно указать некоторые дополнительные параметры. Так, по умолчанию функция ищет лишь обычные файлы, не обращая внимания на папки, скрытые и системные файлы. Чтобы функция нашла по заданному пути не только файлы, но и папки, ее нужно вызвать так:

var_Doc = Dir("C:\*.*", vbDirectory)

Обратите внимание на то, что после пути и маски указан параметр vbDirectory - он указывает функции, что она должна включить в поиск и директории.

После того, как первое найденное имя присвоено переменной, мы запускаем цикл с предусловием, в котором проверяем, не пуста ли эта переменная. Если Dir не обнаружил по указанному пути ничего подходящего под заданную маску, он возвратит, пустую строку. Следовательно, цикл в таком случае не выполнится ни разу.

В цикле есть две строки. Первая выводит найденное имя на экран, а вторая - вызывает функцию Dir еще раз - без параметров. Такой вызов возвращает следующее имя файла, подходящее под заданный при первом вызове Dir шаблон. После этого все повторяется. В реальной программе в такой цикл можно вставить команды для работы с найденными файлами.

Помимо Dir полезной может оказаться команда ChDir. Она позволяет перейти в указанную при ее вызове директорию, которая будет использоваться в качестве директории по умолчанию. Такая конструкция, предшествующая циклу из предыдущего примера позволит найти все файлы в папке "Документы", которая расположена по пути " C:\Документы ":

ChDir ("C:\Документы")
var_doc = Dir("*.*")

Существует множество других функций работы с файлами, вы можете найти информацию о них в справочной системе VBA.

7.16. Выводы

В этой лекции мы познакомились с массивами, циклами, операторами принятия решений, обсудили основные положения, касающиеся работы с файлами. Следующая лекция посвящена отладке программ и обработке ошибок.

< Лекция 6 || Лекция 7: 123 || Лекция 8 >
Евгений Ушаков
Евгений Ушаков
О стоимости курса
Александр Новиков
Александр Новиков
Справочник по объектам VBA
Анатолий Федоров
Анатолий Федоров
Россия, Москва, Московский государственный университет им. М. В. Ломоносова, 1989
Михаил Алексеев
Михаил Алексеев
Россия, Уфа, УГАТУ, 2002