Следующий шаг: коллекции Visual Basic for Applications
Если в будущем вы решите написать макросы Visual Basic для приложений Microsoft Office, то обнаружите, что в объектных моделях Microsoft Word, Microsoft Excel, Microsoft Access, Microsoft PowerPoint и некоторых других приложений, которые поддерживают язык программирования Visual Basic for Applications, коллекции играют очень важную роль. Например, в Word все открытые документы текстового процессора хранятся в коллекции Documents, а каждый параграф текущего документа - в коллекции Paragraphs. Вы можете манипулировать этими коллекциями с помощью цикла For Each...Next точно так же, как вы делали это с другими коллекциями из предыдущих примеров.
Например, следующий пример кода является частью макроса Word 2002, который использует цикл For Each...Next для проверки каждого открытого документа из коллекции Documents на предмет имени файла MyLetter.doc. Если этот файл в коллекции найден, макрос сохраняет его с помощью метода Save. Если файл в коллекции не найден, макрос пытается открыть этот файл из папки My Documents, расположенной на диске C.
Dim aDoc As Object
Dim docFound As Boolean
Dim docLocation As String
docFound = False
docLocation = "c:\my documents\myletter.doc"
For Each aDoc In Documents
If InStr(1, aDoc.Name, "myletter.doc", 1) Then
docFound = True
aDoc.Save
Exit For
End If
Next aDoc
If docFound = False Then
Documents.Open FileName:=docLocation
End If
Совет. Этот пример макроса для Word 2002 демонстрирует, как можно использовать коллекции в Visual Basic for Applications, но этот исходный код разработан для Word, а не для компилятора Visual Basic. Чтобы его проверить, необходимо запустить Word, щелкнуть на команде Macros (Макросы:) из подменю Macro (Макрос) меню Tools (Сервис), создать новое имя для макроса, а затем ввести этот код с помощью специального редактора макросов Word. (Если вы не находитесь в Word, то коллекция Documents не будет иметь для компилятора никакого смысла.)
Макрос начинается с объявления трех переменных. Объектная переменная aDoc представляет текущий элемент коллекции в цикле For Each...Next. Переменной Boolean с именем docFound будет присвоено логическое значение True, если документ в коллекции Documents найден. Строковая переменная docLocation будет содержать путь файла MyLetter.doc на диске. (Эта процедура предполагает, что файл MyLetter.doc находится в папке My Documents на диске C.)
Цикл For Each...Next перебирает все документы в коллекции Documents и ищет файл MyLetter. Если файл с помощью функции InStr (которая ищет одну строку в другой) обнаружен, то файл сохраняется. Если файл не найден, макрос пытается открыть его с помощью метода Open объекта Documents.
Также обратите внимание на оператор Exit For, который используется для выхода из цикла For Each...Next, когда файл MyLetter найден и сохранен на диск. Exit For - это специальный оператор программы, который можно использовать для выхода из циклов For...Next или For Each...Next, когда продолжение их работы становится нежелательным. В нашем примере, если файл MyLetter.doc в коллекции уже найден, продолжение поиска будет безрезультатно. Здесь оператор Exit For предоставляет удобный способ остановить цикл сразу, как только его задача выполнена.
Краткая справка по лекции 11
Чтобы |
Сделайте следующее |
Создать массив |
Задайте размерность массива с помощью ключевого слова Dim. Например: Dim Employees(9) As String
|
Создать открытый массив |
Задайте размерность массива с помощью ключевого слова Public и разместите его объявление в стандартном модуле. Например: Public Employees(9) As String
|
Поместить значение в массив |
Укажите имя массива, индекс элемента массива и значение. Например: Employees(5) = "Leslie"
|
Отформатировать текстовую строку с использованием символов возврата каретки и табуляции |
Используйте в коде программы константы vbCrLf и vbTab. (Чтобы добавить эти значения, используйте оператор &.) |
Создать динамический массив |
При объявлении укажите имя и тип массива, но не указывайте количество его элементов. (Если массив имеет несколько измерений, вставьте запятые между измерениями, но не вводите числа.) При выполнении программы укажите размер массива с помощью оператора ReDim. Например: ReDim Temperatures(10)
|
Обработать элементы массива |
Напишите цикл For Next, который использует переменную-счетчик цикла для адресации каждого из элементов этого массива. Например:
Dim i As Short
Dim Total As Single
For i = 0 To UBound(Temperatures)
Total = Total + Temperatures(i)
Next
|
Изменить размер массива и сохранить в нем предыдущие данные |
Используйте в операторе ReDim ключевое слово Preserve. Например: ReDim Preserve myCube(25, 25, 50)
|
Обработать объекты в коллекции |
Напишите цикл For Each Next, который адресует каждый член коллекции по отдельности. Например:
Dim ctrl As Control
For Each ctrl In Controls
ctrl.Text = "Нажми меня!"
Next
|
Переместить объекты из коллекции Controls по экрану слева направо |
Измените в цикле For Each Next свойство Control.Left каждого из объектов коллекции. Например:
Dim ctrl As Control
For Each ctrl In Controls
Ctrl.Left = Ctrl.Left + 25
Next Ctrl
|
Использовать для объекта в коллекции специальную обработку |
Проверьте с помощью цикла For Each Next свойство Name объекта из коллекции. Например:
Dim ctrl As Control
For Each ctrl In Controls
If ctrl.Name <> "btnMoveObjects" Then
ctrl.Left = ctrl.Left + 25
End If
Next
|
Создать новую коллекцию и добавить в нее члены |
Объявите переменную с помощью записи New Collection. Для добавления членов используйте метод Add. Например:
Dim URLsVisited As New Collection()
URLsVisited.Add(TextBox1.Text)
|