1 Лабораторная работа №3 Введение в Visual Basic для Word Типы данных Типы данных: Byte, Boolean, Integer, Long, Currency (денежный), Decimal, Single (вещественный одинарной точности), Double (вещественный двойной точности), Date (время/дата), String, Object (встроенный объект Word), Variant (универсальный тип данных – по умолчанию). If...Then...Else Условный оператор. If condition Then [statements] [Else elsestatements] Или, если вы не хотите писать все в одну строку, блочный вариант условного оператора: If condition Then [statements] [ElseIf condition-n Then [elseifstatements] ... [Else [elsestatements]] End If Часть condition Описание Условие. Бывает двух типов: Числовое выражение или строковое выражение, вычисляемое как True или False. Если условие Null (невычисляемо), условие считается False. Выражение вида TypeOf objectname Is objecttype. objectname – любой объект и objecttype – любой тип объекта. Выражение True если objectname – типа objecttype; иначе False. statements Операторы. condition-n Условия. Так же как condition. elseifstatements Операторы. elsestatements Операторы. Однострочная форма проще, но блочная форма более структурирована, дополнительные возможности вложения, проще для отладки и чтения. имеет 2 Для однострочной формы можно задать несколько операторов, разделив их двоеточиями. If A > 10 Then A = A + 1 : B = B + A : C = C + B Блочная форма If должна быть первой в строке. Строки Else, ElseIf, и End If могут содержать дополнительно только номер строки или метку. Блочный If должен заканчиваться на End If. Блочный If можно отличить от простого тем, что после слова Then нет никаких других операторов в той же строке. Блоки Else и ElseIf необязательны. Может быть много ElseIf в блочном If, но не после Else. Внутрь блочного If может быть вложен другой If. With Выполняет серию операторов для одного объекта пользовательского типа. With object [statements] End With Часть Описание object Имя целевого объекта. statements Операторы, исполняемые для object. Блок With позволяет произвести серию операторов для специфического объекта без постоянного указания имени объекта. Например, для изменения нескольких разных свойств одного объекта, помещаем назначение свойств внутрь With структуры, ссылаясь на объект только однажды вместо ссылки в каждом операторе. Пример ниже показывает использование With. With MyLabel .Height = 2000 .Width = 2000 .Caption = "This is MyLabel" End With После открытия With, его объект нельзя поменять на другой. Можно вложить один With внутрь другого With. Однако если имена членов объекта внешнего With совпадают с именами внутреннего With объекта, придется использовать полную запись во внутреннем With для обращению к объекту внешнего With. Не рекомендуется делать переход внутрь With блока или из него. For Each...Next Повторяет группу операторов для каждого элемента массива или коллекции. For Each element In group [statements] 3 [Exit For] [statements] Next [element] Часть Описание element Имя текущего элемента коллекции/массива. group Имя коллекции/массива. statements Операторы, исполняемые для element. Преждевременный выход из цикла – Exit For. Можно вкладывать циклы For...Each...Next друг в друга, лишь бы были различны имена element для каждого цикла. Для вложенных циклов важен порядок операторов Next, нужно соблюдать вложенность при задании параметров element операторов Next. Пример ниже использует For Each...Next для поиска в коллекции объекта со свойством Text равным "Hello". Dim Found, MyObject, MyCollection Found = False ' Initialize variable. For Each MyObject In MyCollection ' Iterate through each element. If MyObject.Text = "Hello" Then ' If Text equals "Hello". Found = True ' Set Found to True. Exit For ' Exit loop. End If Next Do...Loop Цикл Do...Loop выполняет блок операторов неопределенное число раз. Повтор пока условие истинно (While) с пред- и пост-условием Sub ChkFirstWhile() counter = 0 myNum = 20 Do While myNum > 10 myNum = myNum - 1 counter = counter + 1 Loop MsgBox "The loop made " & counter & " repetitions." End Sub Sub ChkLastWhile() counter = 0 myNum = 9 Do myNum = myNum - 1 counter = counter + 1 Loop While myNum > 10 MsgBox "The loop made " & counter & " repetitions." End Sub 4 Повтор пока условие не станет истинно (Until) с пред- и пост-условием Sub ChkFirstUntil() counter = 0 myNum = 20 Do Until myNum = 10 myNum = myNum - 1 counter = counter Loop MsgBox "The loop made End Sub Sub ChkLastUntil() counter = 0 myNum = 1 Do myNum = myNum + 1 counter = counter Loop Until myNum = 10 MsgBox "The loop made End Sub + 1 " & counter & " repetitions." + 1 " & counter & " repetitions." Вы можете выйти из Do...Loop с помощью Exit Do, например чтобы закончить бесконечный цикл. Sub ExitExample() counter = 0 myNum = 9 Do Until myNum = 10 myNum = myNum - 1 counter = counter + 1 If myNum < 10 Then Exit Do Loop MsgBox "The loop made " & counter & " repetitions." End Sub Sub и Function Для вызова Sub процедуры нужны имя процедуры и значения для всех аргументов. Слово Call необязательно, но если вы используете его, необходимы скобки. Sub Main() MultiBeep 56 Message End Sub Sub MultiBeep(numbeeps) For counter = 1 To numbeeps Beep Next counter End Sub Sub Message() MsgBox "Time to take a break!" End Sub Пример ниже показывает два способа вызова Sub процедуры. Sub Main() HouseCalc 99800, 43100 5 Call HouseCalc(380950, 49500) End Sub Sub HouseCalc(price As Single, wage As Single) If 2.5 * wage <= 0.8 * price Then MsgBox "You cannot afford this house." Else MsgBox "This house is affordable." End If End Sub Если нужно использовать возвращаемое функцией значение, скобки вокруг параметров обязательны: Answer3 = MsgBox("Are you happy with your salary?", 4, "Question 3") Иначе, скобки при вызове функции нужно опустить: MsgBox "Task Completed!", 0, "Task Box" Функции и процедуры могут получать свои параметры в произвольном порядке, если вы будете явно указывать имена параметров. Именованный аргумент состоит из имени, оператора (:=), и значения аргумента. Например, вызов функции MsgBox. MsgBox Title:="Task Box", Prompt:="Task Completed!" Или: answer3 = MsgBox(Title:="Question 3", _ Prompt:="Are you happy with your salary?", Buttons:=4) Описание функции отличается от описания процедуры заданием типа возвращаемого значения (необязательно, например – As Integer) и самого возвращаемого значения (через присвоение имени функции). Function MyFunc(num As Integer) As Integer MyFunc = num * num End Function Объект Application Это программа Word в целом, он содержит в себе все остальные объекты, например ActiveDocument. Пример: MsgBox Application.UserName MsgBox Application. ActiveDocument.Title Многие часто используемые свойства и методы – например текущий документ (ActiveDocument) – могут быть использованы без ссылки через объект Application. Например, вместо того чтоб писать Application.ActiveDocument.PrintOut, можно написать ActiveDocument.PrintOut. Такие свойства и методы (доступные без указания на 6 Application) глобальные для приложения в целом и существуют в единственном экземпляре. Чтобы просмотреть глобальные свойства и методы в Object Browser-е, выбираем <globals> в списке Classes. Объект Options Это опции приложения Word. Многие из свойств объекта Options доступны через диалог Options (меню Tools). Пример ниже устанавливает опции Word. With Options .AllowDragAndDrop = True .ConfirmConversions = False .MeasurementUnit = wdPoints End With Объект Selection Представляет выделенный фрагмент текста, или точку вставки, если ничего не выделено. Объект Selection может быть только один. Пример ниже убирает (коллапсирует) выделение и смещает курсор в конец текущей строки. Selection.EndKey Unit:=wdLine, Extend:=wdMove Пример ниже обновляет результаты полей выделенного фрагмента. If Selection.Fields.Count >= 1 Then Selection.Fields.Update Свойство Type задает тип выделения (блок или просто точка вставки). Пример ниже выделяет текущий параграф если ничего другого не выделено (точка вставки). If Selection.Type = wdSelectionIP Then Selection.Paragraphs(1).Range.Select End If Свойство Information задает информацию о выделении. Если выделение – таблица, пример ниже показывает число строк и столбцов в таблице. If Selection.Information(wdWithInTable) = True Then MsgBox "Columns = " _ & Selection.Information(wdMaximumNumberOfColumns) _ & vbCr & "Rows = " _ & Selection.Information(wdMaximumNumberOfRows) End If Метод Select выделяет нужную часть документа. Пример ниже выделяет первую ссылку в активном документе и форматирует ее красным цветом. If ActiveDocument.Bookmarks.Count >= 1 Then ActiveDocument.Bookmarks(1).Select Selection.Font.ColorIndex = wdRed End If 7 Объект Selection содержит методы для расширения или перемещения существующего выделения. Например, MoveDown с параметром Extend равным wdExtend. Пример ниже выделяет следующие три абзаца после текущей позиции. With Selection .StartOf Unit:=wdParagraph, Extend:=wdMove .MoveDown Unit:=wdParagraph, Count:=3, Extend:=wdExtend End With Используем свойство Range для получения объекта Range (диапазон) из объекта Selection. Пример ниже определяет переменную myRange как диапазон выделения. Set myRange = Selection.Range Для автосохраненных макросов использование Selection порой чрезмерно. Пример ниже применяет жирный формат к первым двум словам документа, и вставляет новый абзац. Selection.HomeKey Unit:=wdStory Selection.MoveRight Unit:=wdWord, Count:=2, Extend:=wdExtend Selection.Font.Bold = wdToggle Selection.MoveRight Unit:=wdCharacter, Count:=1 Selection.TypeParagraph То же самое удобнее сделать без использования Selection. Set myRange = ActiveDocument.Range(Start:=0, _ End:=ActiveDocument.Words(2).End) myRange.Bold = True myRange.InsertParagraphAfter Объект Selection только один, однако, может быть много объектов Range в одном документе. Объект Range представляет часть документа. Работая с объектами Range, можно манипулировать документом без обновления экрана (что всегда происходит при выделении). Объект Documents Collection Коллекция всех открытых документов. Пример ниже показывает все открытые документы. For Each aDoc In Application.Documents aName = aName & aDoc.Name & vbCr Next aDoc MsgBox aName Метод Add создает новый пустой документ и добавляет его в коллекцию Documents. Пример ниже создает безымянный документ, основанный на шаблоне Normal. Documents.Add Метод Open создает документ из файла (в примере – "Sales.doc"). Documents.Open FileName:="C:\My Documents\Sales.doc" Для выбора конкретного документа используют Documents(index), где index – имя документа или номер в коллекции. Пример ниже закрывает документ с именем "Report.doc" без записи изменений. 8 Documents("Report.doc").Close SaveChanges:=wdDoNotSaveChanges Пример ниже активизирует первый документ в коллекции Documents. Documents(1).Activate Пример ниже просматривает коллекцию Documents на предмет поиска среди открытых документа с именем "Report.doc". Если таковой открыт, он активизируется, иначе – открывается. For Each doc In Documents If doc.Name = "Report.doc" Then found = True Next doc If found <> True Then Documents.Open FileName:="C:\Documents\Report.doc" Else Documents("Report.doc").Activate End If Можно использовать свойство ActiveDocument для упрощения ссылок на текущий документ. Пример ниже использует метод Activate для активации (делает текущим) документа с именем "Document 1." Затем для текущего документа задается альбомная ориентация страниц и документ печатается. Documents("Document1").Activate ActiveDocument.PageSetup.Orientation = wdOrientLandscape ActiveDocument.PrintOut Коллекция Dialogs Коллекция встроенных диалогов Word-а. Вы не можете добавлять свои диалоги в эту коллекцию. Обычно используют Dialogs(index), где index – одна из WdWordDialog констант для идентификации диалога. Пример ниже вызывает диалог открытия файла. dlgAnswer = Dialogs(wdDialogFileOpen).Show Задание лабораторной работы Создать в Word файл с несколькими абзацами текста (обычными и заголовками нескольких уровней), несколькими таблицами. Написать макрос, выполняющий следующие операции. 1) Просмотр всех абзацев с уровнем основного текста (не заголовки), единообразное изменение их оформления. Изменяемые свойства выбираем самостоятельно. 2) Просмотр всех абзацев с уровнем выше основного текста (заголовки), единообразное изменение их оформления. Изменяемые свойства выбираем самостоятельно, делаем отличными от основного текста, и различными для абзацев разного уровня. 3) Просмотр всех таблиц, а в каждой таблице просмотр всех строк. Единообразно оформляем все таблицы (отдельное оформление – для первой строки каждой таблицы). Изменяемые свойства выбираем самостоятельно. Создать в документе новую панель инструментов с кнопкой для вызова вашего макроса. Пример каркаса макроса: 9 Sub MyMacros() Dim Par As Paragraph Dim Table As Table Dim Row As Row For Each par In ActiveDocument.Paragraphs If par.Format.OutlineLevel = wdOutlineLevelBodyText Then ' основной текст par.Alignment = wdAlignParagraphJustify End If If par.Format.OutlineLevel = wdOutlineLevel1 Then ' заголовки 1 уровня par.Alignment = wdAlignParagraphCenter End If If par.Format.OutlineLevel = wdOutlineLevel2 Then ' заголовки 2 уровня par.Alignment = wdAlignParagraphLeft End If Next par For Each Table In ActiveDocument.Tables RowCount = 1 For Each Row In Table.Rows If (RowCount = 1) Then ' первая строка Else ' другие строки End If RowCount = RowCount + 1 Next Row Next Table End Sub