word . excel .. vba - edrive.narod.ruedrive.narod.ru/officevba.pdf · В.М.Водовозов....

32
В. М. Водовозов Управление документами Word и Excel на VBA Санкт-Петербург 2003

Upload: lymien

Post on 16-Apr-2019

260 views

Category:

Documents


7 download

TRANSCRIPT

В. М. Водовозов

Управление документами Word и Excel на VBA

Санкт-Петербург 2003

УДК 681.3.016 В.М.Водовозов. Управление документами Word и Excel на VBA. 32 c. Даны основные сведения об использовании Visual Basic for

Applications для автоматизации работы в Word и Excel. Для всех, кто владеет основами Microsoft Office.

© В.М.Водовозов, 2003.

Оглавление

VISUAL BASIC FOR WORD......................................................................................4 Модель объектов Word ...................................................................................4 Процедурное программирование в Word .......................................................6 Структурное программирование в Word......................................................9 Визуальное программирование в Word ........................................................17

VISUAL BASIC FOR EXCEL ...................................................................................17 Модель объектов Excel .................................................................................17 Процедурное программирование в Excel .....................................................20 Структурное программирование в Excel....................................................22 Визуальное программирование в Excel ........................................................24

ПРОГРАММИРОВАНИЕ ИНТЕРФЕЙСА ПОЛЬЗОВАТЕЛЯ..........................................27 Меню ...............................................................................................................27 Панели инструментов ..................................................................................28 Начальная установка интерфейса ..............................................................30

Visual Basic for Word

Модель объектов Word

Конкретные группы символов, предложения, абзацы, поля, документы Word называют объектами проекта. Каждый объект является представителем своего класса. Объекты, относящиеся к одному классу, образуют коллекции. Объекты, предоставляющие свою оконную площадь другим � дочерним � объектам, называются родителями. Ориентации в мире классов способствует меню Вид. Просмотр объектов редактора Visual Basic, дублированное одноименной кнопкой панели Visual Basic и функциональной клавишей <F2>.

Каждый класс описывается конечным множеством компонентов, или членов. Член-данные характеризуют свои объекты определенными свойствами, а члены-процедуры � определенными методами обработки, зарегистрированными в модели объектов. Члены неотделимы от своих классов. Обращение к объектам выполняется по одной из двух схем:

• имяКласса (имяОбъекта) • имяКласса (индексОбъекта)

При вызове имяОбъекта заключается в кавычки, а индексОбъекта соответствует его порядковому номеру в коллекции всех объектов. Способы инициализации членов:

• Коллекция.Член = Значение • имяКласса.Член = Значение • имяОбъекта.Член = Значение

Длинные обращения к объектам и членам в ряде случаев заменяют специальными лексемами:

• ActiveDocument � активный документ; • ActiveGrammarDictionary � активный словарь; • ActiveControl � активный элемент управления; • ActiveMenuBar � активное меню; • ActivePane � активная область экрана; • ActivePrinter � активный принтер; • ActiveWindow � активное окно;

5

• ActiveWritingStyle � активный стиль; • Selection � выделенный объект. Наиболее общим считается класс Application. К нему обращаются

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

Класс Application расширяется классами Window и Windows. Методом NewWindow класса Window создаются новые окна, а методом Arrange класса Windows они располагаются на экране. Каждое конкретное окно активизируется методом Activate, а свойства Caption, DispayRulers, WindowState, Count определяют его характеристики.

Класс Application расширяется, также, классом Documents, описывающим все открытые в Word документы. Документы открываются методом Open или создаются методом Add и закрываются методом Close класса Documents. Для учета числа открытых документов используется свойство Count.

В качестве компонентов класса Document выступают его свойства: абзацы (Paragraphs), предложения (Sentences), слова (Words), символы (Characters). Доступ к отдельным компонентам открывается по их именам или индексам, представляющим позиции в документе � с первого по Count.

Двигаясь в глубь объектной иерархии, программист может манипулировать самыми разными объектами. С помощью методов или свойств объекта, стоящего выше в иерархическом ряду, в вызывающую подпрограмму возвращается объект следующего уровня.

Примеры Sub СтандартныйДиалог ()

Application.Dialogs (wdDialogFileSaveAs).Show End Sub Sub МетодЗавершения ()

MsgBox "Завершение работы Word" Application.Quit SaveChanges:=wdPromptToSaveChanges

End Sub Sub Окна ()

' Если открыто несколько окон Windows (1).Activate ActiveWindow.Caption = "Первое окно" ActiveWindow.DisplayRulers = False Windows.Arrange ActivePrinter = "HP LaserJet III" MsgBox "Количество окон равно " & Windows.Count

6

Windows (2).WindowState = wdWindowStateMaximize End Sub Sub Документ ()

Documents.Open ("Документ1.doc") Documents.Add имя = "Новый документ" Documents (2).SaveAs (имя) MsgBox "Документ называется " & Documents (2).Name Documents (1).Activate MsgBox "Открыто " & Documents.Count & " документа: " & _

ActiveDocument.Name & " и " & Documents (2).Name ActiveDocument.Save Documents.Close SaveChanges:=wdPromptToSaveChanges

End Sub Sub КоличествоКомпонентов ()

MsgBox "В документе " & ActiveDocument.Paragraphs.Count & _ " абзацев" & Chr (13) & ActiveDocument.Sentences.Count & _ " предложений" & Chr (13) & ActiveDocument.Characters.Count _

& " символов" End Sub Sub СловаИПредложения ()

первое = Documents (1).Words.First последнее = Documents (1).Sentences.Last MsgBox "Начав со слова " & первое & _ ", кончаем предложением " & последнее End Sub Sub ПятыйСимвол ()

ActiveDocument.Characters.Item (5) = "Ф" Msgbox ActiveDocument.Characters.Item (5)

End Sub Sub СтильИТипДокумента ()

Documents.Open ("Документ1.doc") Documents ("Документ1.doc").Characters (2) = "7" MsgBox ActiveDocument.Styles (wdStyleHeading1) MsgBox ActiveDocument.Type

End Sub

Процедурное программирование в Word

Наиболее распространенные задачи, решаемые VBA в среде Word, посвящены работе с выделенными фрагментами текста. Объекты класса Selection в Word имеют богатую гамму методов и свойств:

• свойства Next и Previous возвращают фрагменты текста, следующие за выделенным и предшествующие ему;

7

• свойство End указывает конец выделенного фрагмента; • свойство Font управляет шрифтом; • метод Copy копирует выделенный фрагмент в буфер обмена, Cut вырезает его в буфер обмена, Move перемещает в новое место, Paste реализует вставку содержимого буфера, а Delete удаляет;

• методы HomeKey, EscapeKey, EndKey, MoveLeft, MoveRight и т.п. имитируют нажатие соответствующих клавиш;

• методы Expand и Extend расширяют выделение.

Некоторые компоненты (например, свойство Text в классе Selection) при обращении можно опускать как используемые по умолчанию. Обращение к группе членов одной коллекции удобно выполнять по схеме:

With Коллекция .Член [ � ] End With Переменные VBA могут хранить объекты Word и манипулировать ими.

Оператор Set создает объектную переменную, которую можно использовать в программе вместо объекта.

Примеры Function ЧтоМенять () Selection.MoveLeft Unit:=wdCharacter, Count:=1, Extend:=wdExtend ЧтоМенять = Left (Selection.Text, 1) End Function Sub Вернуться () Selection.MoveRight Unit:=wdCharacter, Count:=1, Extend:=wdExtend End Sub Sub ВыделенныеСимволы ()

� Здесь использована приведенная выше функция ЧтоМенять символ = Selection.Characters (1).Text MsgBox "Вот первый символ: " & символ всего = ActiveDocument.Sentences (1).Characters.Count MsgBox "В первом предложении " & всего & " символов" & Chr (13) & _ "Надо заменить символ " & ЧтоМенять

End Sub Sub Диапазоны ()

символ = Selection.Characters (1) MsgBox "Вот первый символ: " & символ Selection.Copy

8

Documents.Add.Content.Paste End Sub Sub СнятьФорматирование () With Selection.Find .ClearFormatting .Replacement.ClearFormatting .Forward = True .MatchCase = True End With End Sub Sub СокращениеРасширениеВыделения ()

With Selection End = End - 1

MsgBox "Сократил..." .Extend ("R")

MsgBox "Расширил до R..." .Expand Unit:=wdSentence

MsgBox "Расширил до конца предложения..." .MoveLeft Unit:=wdCharacter, Count:=1, Extend:=wdExtend

MsgBox "и сместил курсор на букву влево." End With

End Sub Sub ОбъектнаяПеременнаяWord ()

Set что = Selection что.Delete Unit := wdCharacter что.InlineShapes.AddOLEObject ClassType:="Equation.3", FileName:=""

MsgBox "Вставил формулу�" что.HomeKey wdLine, wdMove MsgBox "Перешел влево..." что.EndKey wdLine, wdExtend MsgBox "Выделил до конца..." что.EndKey Unit:=wdStory MsgBox �и перешел в конец,� что.TypeParagraph MsgBox �открыв новый абзац�

End Sub Sub ПеременнаяВместоОбъектаWord ()

Selection.MoveUp Set что = Selection.Find With что

.ClearFormatting .Font.Name = "Times New Roman"

.Font.Size = 10

.Range.Case = wdTitleWord .Execute FindText:="", ReplaceWith:=""

End With MsgBox "Удалил!"

End Sub

9

Sub ИзменитьПервуюСтроку () Call СнятьФорматирование Set выделено = Selection With выделено.Find .ParagraphFormat.FirstLineIndent = CentimetersToPoints (1.27) .Text = "" .Execute End With With Selection .MoveLeft .ParagraphFormat.FirstLineIndent = CentimetersToPoints (0) .TypeText (vbTab) End With

End Sub

Структурное программирование в Word

Sub Язык () � Иногда бывает, что функция проверки правописания вашего офиса � �не заметила�, что вы переключили драйвер клавиатуры, и продолжает � проверять русский язык как английский или наоборот. Эта подпрограмма � поможет вам мгновенно исправить ошибку компьютера. With Selection

If .LanguageID = wdRussian Then .LanguageID = wdEnglishUS

Else .LanguageID = wdRussian

End If End With

End Sub Sub ВыровнятьПоШирине () � Эта программа поможет вам выровнять по ширине выделенный фрагмент

� или весь текст. Процедура СнятьФорматирование была дана раньше.

Call ЧтоВыделять Call СнятьФорматирование With Selection.Find

.Text = "^p^p" .Replacement.Text = "ГРАНИЦА АБЗАЦА" .Execute Replace:=wdReplaceAll .Text = "^p^t" .Replacement.Text = "АБЗАЦНЫЙ ОТСТУП" .Execute Replace:=wdReplaceAll .Text = "^p^w" .Replacement.Text = "АБЗАЦНЫЙ ОТСТУП" .Execute Replace:=wdReplaceAll

10

.Text = "^p" .Replacement.Text = " " .Execute Replace:=wdReplaceAll .Text = "ГРАНИЦА АБЗАЦА" .Replacement.Text = "^p^p" .Execute Replace:=wdReplaceAll .Text = "АБЗАЦНЫЙ ОТСТУП" .Replacement.Text = "^p^t" .Execute Replace:=wdReplaceAll End With Selection.ParagraphFormat.Alignment = wdAlignParagraphJustify Selection.HomeKey Unit:=wdLine

End Sub Sub ЧтоВыделять ()

длина = Len (Selection.Text) If длина <= 1 Then If MsgBox ("Выровнять по ширине весь текст?", vbOKCancel) _ = vbCancel Then Exit Sub Else Selection.WholeStory End If End Sub Function КакЧастоСохранятьФайл (интервал)

КакЧастоСохранятьФайл = True If интервал > 0 And интервал < 10 Then интервал = "00:0" & Right (Str (интервал), 1) ElseIf интервал >= 10 And интервал < 60 Then интервал = "00:" & Right(Str (интервал), 2) Else

КакЧастоСохранятьФайл = False End If

End Function Sub Фраза ()

слово = "" For счет = 1 To Len (Selection.Text) буква = Mid (Selection.Text, счет, 1) слово = слово & буква Next Selection.TypeText (слово) End Sub Sub Выделить ()

For Each символ In Selection.Characters символ.Font.Bold = True Next End Sub

11

Sub Красный () � Отдельные символы по всему документу можно раскрасить, � как пятерку в этом макросе. For Each символ In ActiveDocument.Words

If символ = �5� Then символ.Font.ColorIndex = wdRed Next End Sub Sub СледующийДокумент () � Как автоматически присвоить новому документу следующий номер? � Поместите в него поле, начните нумерацию, а остальное сделает макрос. On Error Resume Next старыйНомер = ActiveDocument.FormFields (1).Result ActiveDocument.FormFields (1).Result = старыйНомер + 1 End Sub Sub Жирный () � Выделите жирным шрифтом столько букв, сколько захотите.

On Error Resume Next счет = InputBox (�Сколько ?�) For счетчик=1 To счет ActiveDocument.Words (счетчик).Font.Bold = True Next End Sub Sub ЛатиницаКириллица ()

� Тот, кто переписывается по электронной почте с зарубежными � абонентами, знает, что такое латиница. Это когда русские буквы � заменяют латинскими, оставляя русские фразы. Naprimer, tak. � Предлагаемая программа автоматизирует перевод выделенного � фрагмента или всего текста в латиницу или обратно в кириллицу. � Функция ЧтоМенять и подпрограмма Вернуться вам уже знакомы. длина = Len (Selection.Text) If длина <= 1 Then

Selection.WholeStory длина = Len (Selection.Text) - 1 End If что = "Замена " & длина буква = Left (Selection.Text, 1) If буква < "А" Then функция = "Кир"

текст = MsgBox (что & " латинских символов кириллицей", _ vbOKCancel)

Else функция = "Лат" текст = MsgBox (что & " символов кириллицы латынью", _

vbOKCancel)

12

End If Selection.MoveRight Unit:=wdCharacter, Count:=1 If текст = vbCancel Then Exit Sub Do Until Len (Selection.Text) = длина Or длина < 1 буква = ЧтоМенять If функция = "Кир" Then новыйТекст = Кириллица (буква) & новыйТекст Else новыйТекст = Латиница (буква) & новыйТекст End If Loop Selection.TypeText (новыйТекст) End Sub Function Кириллица (буква)

текст = Кир (буква) Select Case буква Case "e", "i", "u", "a" втораяБуква = ЧтоМенять If втораяБуква <> "y" Then Call Вернуться Select Case буква Case "e": текст = "э": Case "i": текст = "ы" Case "u": текст = "у": Case "a": текст = "а" End Select ElseIf буква = "e" Then: текст = "е" ElseIf буква = "i" Then: текст = "и" ElseIf буква = "u" Then: текст = "ю" ElseIf буква = "a" Then: текст = "я" Else Call Вернуться End If Case "j" текст = "ь" втораяБуква = ЧтоМенять If втораяБуква = "h" Then третьяБуква = ЧтоМенять If третьяБуква = "s" Then текст = "щ" Else _

Call Вернуться Else Call Вернуться End If Case "s" текст = "с" втораяБуква = ЧтоМенять If втораяБуква = "t" Then текст = "ц" Else Call Вернуться Case "h" текст = "х" втораяБуква = ЧтоМенять If втораяБуква = "k" Then: текст = "х"

13

ElseIf втораяБуква = "s" Then: текст = "ш" ElseIf втораяБуква = "c" Then: текст = "ч" ElseIf втораяБуква = "z" Then: текст = "ж" Else Call Вернуться End If Case "E", "I", "U", "A" втораяБуква = ЧтоМенять If втораяБуква <> "Y" Then Call Вернуться Select Case буква Case "E": текст = "Э": Case "I": текст = "Ы" Case "U": текст = "У": Case "A": текст = "А" End Select ElseIf буква = "E" Then: текст = "Е" ElseIf буква = "I" Then: текст = "И" ElseIf буква = "U" Then: текст = "Ю" ElseIf буква = "A" Then: текст = "Я" Else Call Вернуться End If Case "J" текст = "Ь" втораяБуква = ЧтоМенять If втораяБуква = "H" Then третьяБуква = ЧтоМенять If третьяБуква = "S" Then текст = "Щ" Else _

Call Вернуться Else Call Вернуться End If Case "S" текст = "С" втораяБуква = ЧтоМенять If втораяБуква = "T" Then текст = "Ц" Else Call Вернуться Case "H" текст = "Х" втораяБуква = ЧтоМенять If втораяБуква = "K" Then: текст = "Х" ElseIf втораяБуква = "S" Then: текст = "Ш" ElseIf втораяБуква = "C" Then: текст = "Ч" ElseIf втораяБуква = "Z" Then: текст = "Ж" Else Call Вернуться End If End Select Кириллица = текст End Function

14

Function Латиница (кир) Select Case кир

Case "к" To "п" Лат = Chr (Asc ("k") + Asc (кир) � Asc ("к")) Case "К" To "П" Лат = Chr (Asc ("K") + Asc (кир) � Asc ("К")) Case "р" To "у" Лат = Chr (Asc ("r") + Asc (кир) � Asc ("р")) Case "Р" To "У" Лат = Chr (Asc ("R") + Asc (кир) � Asc ("Р")) Case "а": Лат = "a": Case "б": Лат = "b": Case "в": Лат = "v" Case "г": Лат = "g": Case "д": Лат = "d": Case "е": Лат = "ye" Case "ж": Лат = "zh": Case "з": Лат = "z": Case "и": Лат = "yi" Case "й": Лат = "y": Case "ф": Лат = "f": Case "х": Лат = "kh" Case "ц": Лат = "ts": Case "ч": Лат = "ch": Case "ш": Лат = "sh" Case "щ": Лат = "shj": Case "ъ": Лат = "`": Case "ы": Лат = "i" Case "ь": Лат = "j": Case "э": Лат = "e": Case "ю": Лат = "yu" Case "я": Лат = "ya": Case "А": Лат = "A": Case "Б": Лат = "B" Case "В": Лат = "V": Case "Г": Лат = "G": Case "Д": Лат = "D" Case "Е": Лат = "YE": Case "Ж": Лат = "ZH": Case "З": Лат = "Z" Case "И": Лат = "YI": Case "Й": Лат = "Y": Case "Ф": Лат = "F" Case "Х": Лат = "KH": Case "Ц": Лат = "TS": Case "Ч": Лат = "CH" Case "Ш": Лат = "SH": Case "Щ": Лат = "SHJ": Case "Ъ": Лат = "`" Case "Ы": Лат = "I": Case "Ь": Лат = "J": Case "Э": Лат = "E" Case "Ю": Лат = "YU": Case "Я": Лат = "YA": Case Else: Лат = кир End Select End Function Function Кир (лат)

Select Case лат Case "k" To "p" Кир = Chr (Asc ("к") + Asc (лат) � Asc ("k")) Case "K" To "P" Кир = Chr (Asc ("К") + Asc (лат) � Asc ("K")) Case "b": Кир = "б": Case "v", "w": Кир = "в"

Case "g": Кир = "г" Case "d": Кир = "д": Case "z": Кир = "з"

Case "y": Кир = "й" Case "f": Кир = "ф": Case "`": Кир = "ъ"

Case "r": Кир = "р" Case "t": Кир = "т": Case "B": Кир = "Б"

Case "V","W": Кир = "В" Case "G": Кир = "Г": Case "D": Кир = "Д"

Case "Z": Кир = "З" Case "Y": Кир = "Й": Case "F": Кир = "Ф"

Case "I": Кир = "Ы" Case "R": Кир = "Р": Case "T": Кир = "Т"

Case Else: Кир = лат End Select End Function

15

Sub Поиск () Selection.HomeKey Unit := wdStory чтоИскать = InputBox (�Чего тебе надобно?�) Do есть = Selection.Find.Execute (чтоИскать) еще = MsgBox (�Еще?�, vbYesNo) Loop While еще = vbYes And есть = True

End Sub Sub ОпределениеТипаWord ()

Dim переменная As Characters Set переменная = Selection.Characters MsgBox "В переменной типа Characters " & переменная.Count & " символов"

End Sub Sub ПереопределениеТипаObjectWord ()

Dim переменная As Object Set переменная = Selection.Characters MsgBox "В переменной типа Characters " & переменная.Count & " символов"

End Sub Sub ПеременнаяВместоОбъектаWord ()

Dim переменная As Object Set переменная = ThisDocument.Sentences

With переменная .Last = "12345" .First = "Первая фраза" End With End Sub Sub ИерархияОбъектовWord ()

Dim книга As Document, фраза As ParagraphFormat Set книга = ThisDocument With книга

Set фраза = .Paragraphs.Item (1).Format With фраза

.LeftIndent = 3

.Alignment = wdAlignParagraphCenter

.LineSpacing = 1 End With

End With End Sub Sub Клавиатура ()

� Кому из вас не случалось начинать печатать при ошибочной � раскладке клавиатуры � русской вместо английской или наоборот? � И потом, спохватившись, все стирать и начинать сначала. Теперь с этим � будет покончено: данная программа автоматически сменит раскладку от � позиции курсора до того места, где вы неверно переключили клавиатуру. � В ней задействована известная вам функция ЧтоМенять.

16

Dim массив (2, 64) Call ЗаполнитьМассив (массив)

буква = ЧтоМенять If буква < "А" Then начало = "А" конец = "я" Else начало = "A" конец = "z" End If Do While буква < начало Or буква > конец прежняяСтрока = строка For i = 0 To 63 If массив (0, i) = буква Then строка = массив (1, i) & строка ElseIf массив (1, i) = буква Then строка = массив (0, i) & строка End If Next If строка = прежняяСтрока Then строка = буква & строка If Len (Selection.Text) < Len (строка) Then буква = "" строка = Right (строка, Len (Selection.Text)) Exit Do Else буква = ЧтоМенять End If Loop строка = буква & строка Selection.TypeText (строка) End Sub Sub ЗаполнитьМассив (имя)

For i = 0 To 63 имя (1, i) = Chr (i + Asc("А"))

Next имя (0, 0) = "A": имя (0, 1) = "<": имя (0, 2) = "D"

имя(0, 3) = "U" имя (0, 4) = "L": имя (0, 5) = "T": имя (0, 6) = ":" имя(0, 7) = "P" имя (0, 8) = "B": имя (0, 9) = "Q": имя (0, 10) = "R" имя (0, 11) = "K" имя (0, 12) = "V": имя (0, 13) = "Y" имя (0, 14) = "J" имя (0, 15) = "G" имя (0, 16) = "H": имя (0, 17) = "C" имя (0, 18) = "N" имя (0, 19) = "E" имя (0, 20) = "A": имя (0, 21) = "{" имя (0, 22) = "W" имя (0, 23) = "X" имя (0, 24) = "I": имя (0, 25) = "O" имя (0, 26) = "}" имя (0, 27) = "S" имя (0, 28) = "M" имя (0, 29) = сhr(34) имя (0, 30) = ">" имя (0, 31) = "Z" имя (0, 32) = "f": имя (0, 33) = "," имя (0, 34) = "d": имя (0, 35) = "u" имя (0, 36) = "l": имя (0, 37) = "t" имя (0, 38) = ";": имя (0, 39) = "p" имя (0, 40) = "b": имя (0, 41) = "q" имя (0, 42) = "r": имя (0, 43) = "k" имя (0, 44) = "v": имя (0, 45) = "y" имя (0, 46) = "j": имя (0, 47) = "g" имя (0, 48) = "h": имя (0, 49) = "c"

17

имя (0, 50) = "n": имя (0, 51) = "e" имя (0, 52) = "a": имя (0, 53) = "[" имя (0, 54) = "w": имя (0, 55) = "x" имя (0, 56) = "i": имя (0, 57) = "o" имя (0, 58) = "]": имя (0, 59) = "s" имя (0, 60) = "m" имя (0, 61) = Chr(39): имя (0, 62) = ".": имя (0, 63) = "z"

End Sub

Визуальное программирование в Word

'Процедуры формы Word, в которой есть надпись, поле и кнопки Ввод и Удаление Sub UserForm_Activate ()

Call Ввод_Click End Sub Sub Ввод_Click ()

Label1 = "Вводите сообщение" TextBox1.Enabled = True

End Sub Sub Удаление_Click ()

Label1 = "Сообщение удалено" TextBox1 = "" TextBox1.Enabled = False

End Sub Sub TextBox1_Change ()

Selection.Characters.Text = UserForm1.TextBox1.Text End Sub 'В форме Word находятся кнопка и переключатели Sub CommandButton1_Click ()

If OptionButton1 = True Then Selection.Font.Bold = True Selection.Font.Italic = True

Else Selection.Font.Bold = False Selection.Font.Italic = False

End If End Sub

Visual Basic for Excel

Модель объектов Excel

Конкретные ячейки, диапазоны, рабочие листы, электронные книги и т.п. являются объектами проекта, представляющими свои классы. В модель объектов Excel входят:

18

• класс ячеек Cells; • класс диапазонов Range; • классы строк и столбцов Rows и Columns, Row и Column; • классы листов и рабочих листов Sheets и Worksheets, Sheet и

Worksheet; • классы рабочих книг и окон Workbooks и Windows, Workbook и

Window; • классы меню и панелей инструментов CommandBars, CommandBar; • классы диаграмм и окон диалога Charts и Dialogs, Chart и Dialog.

Длинные обращения к объектам и членам в ряде случаев заменяют

специальными лексемами:

• ActiveCell � активная ячейка; • ActiveChart � выделенная диаграмма; • ActiveControl � активный элемент управления; • ActiveMenuBar � активное меню; • ActivePane � активная область экрана; • ActivePrinter � активный принтер; • ActiveSheet � активный рабочий лист; • ActiveWindow � активное окно; • ActiveWorkbook � активная рабочая книга; • Selection � выделенный объект. Наиболее общим считается класс Application. К нему обращаются

тогда, когда в программе надо использовать процедуры или функции Excel, отсутствующие в языке VBA. Зная синтаксис этих подпрограмм, программист может вызывать их из авторских подпрограмм и функций.

Класс Application расширяется классом Workbooks, описывающим все открытые в Excel рабочие книги. Книги открываются методом Open или создаются методом Add и закрываются методом Close класса Workbooks. Для учета числа открытых книг используется свойство Count. Каждая конкретная книга представляет объект класса Workbook. В Excel очень много функций, предназначенных для конечного пользователя. Программист может включать их в тексты авторских подпрограмм также с помощью класса Application.

Главными компонентами класса Workbook являются листы (Sheets), в том числе � рабочие листы (Worksheets) и листы диаграмм (Charts). Класс Worksheets охватывает все рабочие листы рабочей книги. Каждый новый рабочий лист добавляется методом Add и удаляется методом Delete. Доступ к отдельным объектам открывается по их именам или индексам,

19

представляющим позицию рабочего листа в книге � с первого по Worksheets.Count, с учетом скрытых листов.

Двигаясь в глубь объектной иерархии, программист может манипулировать самыми разными объектами. С помощью методов или свойств объекта, стоящего выше в иерархическом ряду, в вызывающую подпрограмму возвращается объект нижеследующего уровня.

Примеры Sub СтандартныйДиалог ()

Application.Dialogs (xlDialogSaveAs).Show End Sub Sub ФункцияExcel ()

MsgBox "Округленное значение числа ПИ: " & _ Application.Round (Application.Pi (), 3)

End Sub Sub РабочаяКнига ()

Workbooks.Open ("Книга1") Workbooks.Add имя = "Новая книга" Workbooks (2).SaveAs (имя) MsgBox "В книге " & Workbooks (2).Name & " всего " _

& Sheets.Count & " листов" Workbooks (1).Activate MsgBox "Открыты книги " & ActiveWorkbook.Name _

& " и " & Workbooks (2).Name ActiveWorkbook.Save Workbooks.Close

End Sub Sub КоличествоЛистов ()

Sheets.Add MsgBox "В книге " & Sheets.Count & " листов"

End Sub Sub ПереименованиеЛистов ()

Лист1.Name = "Первый" Лист2.Name = "Второй" Лист3.Name = "Третий"

End Sub Sub РабочийЛист ()

Worksheets.Add Count:=2 Worksheets (1).Name = "Первый лист" Sheets ("Первый лист").Activate ActiveSheet.PageSetup.Orientation = xlLandscape ActiveSheet.PrintOut ActiveSheet.Visible = False MsgBox Worksheets (1).Name & " скрыт" Sheets ("Первый лист").Visible = True

20

MsgBox Worksheets (1).Name & " открыт" End Sub Sub ОперацииНадЛистами ()

Workbooks.Open ("Книга1") Workbooks ("Книга1.xls").Worksheets (2).Delete Workbooks ("Книга1.xls").Worksheets (1).Name = "Пример" Workbooks ("Книга1.xls").Worksheets ("Пример").Activate ActiveWorkbook.Styles ("Normal").Font.Bold = True MsgBox "Этот лист переименован, а следующий удален" Worksheets.Add After:=ActiveSheet MsgBox "Добавлен лист взамен удаленного" Worksheets ("Пример").Move After:=Sheets (Sheets.Count)

End Sub

Процедурное программирование в Excel

Самые распространенные задачи, решаемые VBA в среде Excel, посвящены работе с ячейками рабочих листов, их диапазонами, столбцами и строками. Для этого в Excel есть ряд классов, методов и свойств:

• метод Range класса Worksheet возвращает диапазон (в частности, ячейку) по имени или переменной, используемой в качестве аргумента; каждый диапазон является объектом класса Range;

• метод Cells обеспечивает выбор одной ячейки рабочего листа в соответствии с двумя числовыми аргументами � индексами строки и столбца; при отсутствии аргументов выбираются все ячейки рабочего листа;

• метод Offset класса Range задает смещение диапазона относительно заданной ячейки;

• методы Column и Row класса Worksheets возвращают столбец и строку.

Некоторые члены (например, свойство Value) при обращении можно опускать как используемые по умолчанию.

Переменные VBA могут хранить объекты Excel и манипулировать ими. Оператор Set превращает обычную переменную в объектную переменную, которую можно использовать в программе вместо объекта. Объектная переменная указывает на объект до тех пор, пока ей не будет присвоена ссылка на другой объект или значение Nothing.

Примеры Sub Диапазоны1 ()

Range ("a1").Value = 1234 Range ("a1:c5").Select Range ("a5").Value = Range ("a1").Value

21

Range ("a6").Value = "Привет" Range ("b1:b8").Formula = "=rand ()" Range ("b2:g1").Borders (xlBottom).LineStyle = xlDouble

End Sub Sub Диапазоны2 ()

Лист1.Cells.Font.Bold = True Лист1.Activate Range ("a1:c5") = 1234 Range ("a1:c5").Select Range ("c9") = Range ("a1").Value * 2 Range ("a6") = "Привет" Range ("b1:b8") = "=sum (a1:a3)"

End Sub Sub Ячейки ()

With Worksheets (1) .Cells (3, 1).Value = 5678 .Cells (4, 1).Formula = "=sum (b1:b8)" .Range (.Cells(3, 1), .Cells(5, 10)).Borders.LineStyle = xlThick

End With End Sub Sub Смещение ()

Лист1.Activate Cells.HorizontalAlignment = xlCenter Activesheet.Range ("a1").Select Selection.Offset (3, 1).Select ActiveCell.Value = "Сообщение" Selection.Font.Bold = True Selection.Font.Name = "Courier New Cyr" содержание = ActiveCell.Value MsgBox содержание Activesheet.Range ("e5").Select ActiveCell.Value = "Центр" ActiveCell.Offset (1, 0).Value = "Юг" ActiveCell.Offset (0, -1).Value = "Запад" ActiveCell.Offset (-1, 1).Value = "Северо-Восток"

End Sub Sub Области ()

Лист1.Activate Range ("a1:d4").ClearContents Union (Range("a1:b2"), Range ("c2:d4")).Select количество = Selection.Areas.Count MsgBox "Выделено областей: " & количество Selection.Clear

End Sub Sub ОбъектнаяПеременнаяExcel ()

Worksheets ("Первый лист").Activate Range ("c5") = "Тест"

22

простоПеременная = Range ("c5") MsgBox "Переменная равна " & простоПеременная Cells (5, 3) = 1234 Set объектнаяПеременная = Range ("c5") MsgBox "Ячейка " & объектнаяПеременная.Address & _

" содержит " & объектнаяПеременная.Value End Sub Sub ПеременнаяВместоОбъектаExcel ()

Set переменная = Лист1.Range ("a2") With переменная

.Font.Bold = True

.Font.ColorIndex = 3

.Font.Size = 16

.Value = "Тест" End With

End Sub

Структурное программирование в Excel

Sub РабочийЛист () Worksheets.Add Count:=2 Worksheets (1).Name = "Первый лист" Sheets ("Первый лист").Activate ActiveSheet.PageSetup.Orientation = xlLandscape ActiveSheet.PrintOut If MsgBox ("Скрыть лист ?", vbYesNo + vbQuestion) = vbYes Then

ActiveSheet.Visible = False If MsgBox ("Показать лист ?", vbYesNo + vbQuestion) = vbYes Then

Sheets ("Первый лист").Visible = True End If

End If End Sub Sub ИменаЛистов ()

Sheets.Add MsgBox "Всего листов: " & Sheets.Count For Each лист In Worksheets

лист.Activate лист.Name = InputBox ("Имя " & ActiveSheet.index & "-го листа?")

Next End Sub Sub Ячейки ()

With Worksheets (1) .Cells (3, 1).Value = 5678 .Cells (4, 1).Formula = "=sum (b1:f1)" For год = 1 To 5

.Cells (1, год + 1).Value = 1990 + год Next год .Range (.Cells (3, 2), .Cells (5, 6)).Borders.LineStyle = xlThick

23

End With End Sub Sub УдалениеЛистов ()

сколько = InputBox ("Сколько листов удалить?") For i = сколько To 0 Step -1

If Worksheets.Count <= 1 Or сколько <= 0 Then Exit For

Else ActiveSheet.Delete

End If Next

End Sub Sub ОригинальныеИменаЛистов () On Error GoTo сообщение

For Each лист In Worksheets лист.Activate лист.Name = InputBox ("Имя " & ActiveSheet.Index & "-го листа?")

Next Exit Sub

сообщение: MsgBox "Ошибка номер " & Err & ". Введите другое имя" ОригинальныеИменаЛистовExcel

End Sub Sub Деноминация ()

On Error Resume Next For Each ячейки In Лист1.Range ("a1:a10")

ячейки.Value = ячейки.Value / 1000 Next ячейки

End Sub Sub ОпределениеТипаExcel ()

Dim переменная As Range Worksheets (1).Activate Cells (2,1)=1234 Set переменная = Worksheets (1).Range ("a2") MsgBox "Переменная типа Range равна " & переменная

End Sub Sub ПереопределениеТипаObjectExcel ()

Dim переменная As Object Worksheets (1).Cells (2, 1) = 1234 Set переменная = Worksheets (1).Range ("a2") MsgBox "Переменная типа Range равна " & переменная

End Sub Sub ПеременнаяВместоОбъектаExcel ()

Dim переменная As Range Set переменная = Worksheets (1).Range ("a2")

With переменная .Font.Bold = True

24

.Value = "Тест" End With End Sub Sub ИерархияОбъектовExcel ()

Dim книга As Workbook, таблица As Worksheet, диапазон As Range Set книга = Workbooks (1) With книга

Set таблица = .Worksheets (1) With таблица

Set диапазон = .Range ("a2:b4") With диапазон

.Font.Italic = True

.Value = 3.5 End With

End With End With

End Sub

Визуальное программирование в Excel

Sub ПолеExcel () Лист2.Activate UserForm1.Show Call UserForm1.TextBox1_Change

End Sub Sub TextBox1_Change ()

Range ("a2") = UserForm1.TextBox1 End Sub Sub Автосохранение () ' Форма Excel содержит поле Время и флажок флагСохранения. � Функция КакЧастоСохранятьФайл приведена ранее, � а запускаемая таймером подпрограмма Старт � в последней главе. On Error GoTo конец If UserForm1.флагСохранения = True Then интервал = Val (UserForm1.Время) If Not КакЧастоСохранятьФайл (интервал) Then UserForm1.флагСохранения = False Exit Sub End If Call Старт интервал End If Exit Sub конец: End Sub Sub СчитатьСтаж () � Данная программа считает срок (стаж, выслугу) между двумя датами,

25

� выражая его в днях, месяцах и годах, а при необходимости � � в полных днях или месяцах. Для этого в форму помещены поля: � днПоле, мнПоле, гнПоле начальной даты и дкПоле, мкПоле, гкПоле

� конечной даты, надписи для вывода срока и флажок CheckBox, � определяющий вид результата. On Error GoTo ошибка

d0 = Val (днПоле) m0 = Val (мнПоле) y0 = Val (гнПоле) d1 = Val (дкПоле) m1 = Val (мкПоле) y1 = Val (гкПоле) If m0 < 1 Or m0 > 12 Then GoTo ошибка If d1 < 1 Or m1 > 12 Then GoTo ошибка If y0 < -9999 Or y0 > 9999 Then GoTo ошибка If y1 < -9999 Or y1 > 9999 Then GoTo ошибка If d1 > ДнейВМесяце (m1, y1) Or d1 < 1 Then GoTo ошибка If d0 > ДнейВМесяце (m0, y0) Or d0 < 1 Then GoTo ошибка If d0 <= d1 Then days = d1 - d0 Else days = ДнейВМесяце (m0, y0) - d0 + d1 m1 = m1 - 1 End If If m0 <= m1 Then months = m1 - m0 Else months = 12 - m0 + m1 y1 = y1 - 1 End If If y0 <= y1 Then years = y1 - y0 Else GoTo ошибка d = 0 If years > 0 Then For i = 1 To years y = y0 + i - 1 If ВисокосныйГод (y) Then d = d + 366 Else d = d + 365 Next End If If months > 0 Then For i = 1 To months m = m0 + i - 1 If m > 12 Then m = m - 12 d = d + ДнейВМесяце (m, y1) Next End If d = d + days

26

If CheckBox.Value = False Then дс = days мс = months надпись.Caption = "Срок: дней, месяцев, лет" Else дс = d мс = years * 12 + months надпись.Caption = "Полных дней, месяцев, лет" End If гс = years Exit Sub ошибка: дс = "": мс = "": гс = "" сообщение = "Вводите день месяц год" _ & Chr(13) & "- Конец позднее Начала" MsgBox сообщение, , "Сроки" днПоле.SetFocus End Sub Function ДнейВМесяце (m, y) � Сколько дней в месяце (m) с учетом года (y) ? Select Case m Case 1, 3, 5, 7, 8, 10, 12 ДнейВМесяце = 31 Case 4, 6, 9, 11 ДнейВМесяце = 30 Case 2 If ВисокосныйГод (y) = True Then ДнейВМесяце = 29 _

Else ДнейВМесяце = 28 Case Else ДнейВМесяце = 0 End Select End Function Function ВисокосныйГод (y) � Високосный ли год? ВисокосныйГод = False If (y Mod 100) = 0 Then If (y Mod 400) = 0 Then ВисокосныйГод = True Else If (y Mod 4) = 0 Then ВисокосныйГод = True End If End Function Sub КалейдоскопКвадратовExcel ()

номерЦвета = 1 Лист1.Activate

27

For Each фигура In Лист1.Shapes фигура.Select Selection.Interior.ColorIndex = номерЦвета номерЦвета = номерЦвета + 1

Next фигура End Sub

Программирование интерфейса пользователя

Меню

Меню создаются и редактируются под управлением редактора меню или с помощью процедур, размещаемых в модулях. Редактор меню представлен вкладкой Команды меню Вид .Панели инструментов .Настройка�

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

Для программирования строк меню используются объекты классов CommandBars и CommandBar из библиотеки Microsoft Office. Первый из классов хранит все строки встроенных меню. Он служит инструментом использования меню приложения и создания авторских меню. Второй класс представляет все пункты конкретного меню. Он служит инструментом использования пунктов меню приложения и создания авторских пунктов. Ссылки на пункты меню определяются свойством Controls.

Для отображения контекстных меню используется метод ShowPopup, а для удаления всех новых меню, не выведенных на экран, � методы Delete и Reset.

Примеры Sub ВсеСтрокиМеню ()

For Each строкаМеню In CommandBars Debug.Print строкаМеню.Index, " ", строкаМеню.Name

Next End Sub Sub ВсеПунктыМеню ()

For Each пункт In CommandBars ("Menu Bar").Controls список = список & пункт.Index & " " & пункт.Caption & Chr(13)

Next

28

MsgBox список End Sub Sub ЕщеСтрокаМеню ()

Set новоеМеню = CommandBars.Add (Name:="Игры", _ Position:=msoBarFloating, MenuBar:=False, Temporary:=True)

новоеМеню.Visible = True End Sub Sub НаполнениеСтрокиМеню ()

Set меню = CommandBars (CommandBars.Count) Set новыйПункт = меню.Controls.Add (Type:=msoControlPopup) новыйПункт.Caption = "Информация" Set подпункт1 = новыйПункт.Controls.Add (Type:=msoControlPopup) подпункт1.Caption = "О меню" Set подпункт2 = новыйПункт.Controls.Add (Type:=msoControlPopup) With подпункт2

.Caption = "О панелях"

.Enabled = True

.OnAction = "процедураИлиМакрос" End With

End Sub Sub УдалениеМеню ()

For Each меню In CommandBars If Not меню.BuiltIn And Not меню.Visible Then меню.Delete

Next End Sub Sub ВосстановлениеМеню ()

On Error Resume Next For i = 1 To CommandBars.Count

CommandBars (i).Reset Next

End Sub

Панели инструментов

VBA позволяет изменить изображение любой кнопки панели инструментов с помощью меню Вид .Панели инструментов .Настройка. При программировании панели инструментов рассматриваются как разновидности меню.

Примеры Sub НоваяПанельИнструментов ()

On Error GoTo ошибка Dim новаяПанель As CommandBar Set новаяПанель = CommandBars.Add (Name:="Игры", _

Position:=msoBarFloating, MenuBar:=False, Temporary:=True) With новаяПанель.Controls

29

.Add Type:=msoControlEdit

.Add Type:=msoControlButton , Id:=4

.Add Type:=msoControlButton , Id:=21

.Add Type:=msoControlDropdown

.Add Type:=msoControlComboBox End With новаяПанель.Controls (1).OnAction = "мойМакрос" новаяПанель.Visible = True номерПанели = CommandBars.Count MsgBox "Перед вами панель " & новаяПанель.Name _

& " номер " & номерПанели ошибка: CommandBars ("Игры").Delete End Sub Sub НовыйЭлемент ()

On Error GoTo ошибка Dim панель As CommandBar Dim элемент As CommandBarComboBox Set панель = CommandBars (3) Set элемент = панель.Controls.Add (Type:=msoControlDropdown) With элемент

.AddItem "Кофе", 1 .AddItem "Чай", 2 .AddItem "Сок", 3 .DropDownWidth = 75 .DropDownLines = 3 .ListIndex = 3 End With панель.Visible = True

ошибка: элемент.Delete

End Sub Sub ПанелиИнструментов ()

For Each панель In CommandBars If панель.Index > 2 And панель.Index < 19 Then панель.Visible = False

Next панель MsgBox "Все панели инструментов скрыты." & Chr (13) & _

"Сейчас они будут последовательно возвращаться" For Each панель In CommandBars

If панель.Index > 2 And панель.Index < 19 Then панель.Visible = True MsgBox "Это панель " & панель.Name

End If Next панель If MsgBox ("Убрать лишние ?", vbYesNo) = vbYes Then

For счетчик = 18 To 5 Step -1 CommandBars (счетчик).Visible = False

Next счетчик

30

End If End Sub

Начальная установка интерфейса

При открытии документа Word всегда в первую очередь автоматически обрабатывается событие Open объекта Document, а закрытию предшествует событие Close. Каждый новый документ Word обрабатывает событие New.

При открытии рабочей книги Excel сначала обрабатывается событие Open объекта Workbook, а закрытию предшествует событие BeforeClose. Каждый рабочий лист Excel обрабатывает события Activate, SheetChange и Deactivate.

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

Примеры Sub Document_Open ()

Call СчетОткрытийДокумента End Sub Sub Document_Close ()

Call СледующийДокумент ActiveDocument.Save End Sub Sub СчетОткрытийДокумента () ' Снабдите документ полем в колонтитуле, а в форму UserForm1

� поместите поле Счетчик On Error GoTo форма ПереходВКолонтитул счетчикОткрытий = Selection.Fields (1).Result UserForm1.Счетчик.Text = счетчикОткрытий Selection.Fields (1).Select x = Val (счетчикОткрытий) + 1 z = "QUOTE """ & x & """" Selection.Fields.Add Range := Selection.Range, _

Type := wdFieldEmpty, Text := z форма:

ActiveWindow.ActivePane.View.SeekView = wdSeekMainDocument UserForm1.Show End Sub Public Sub ПереходВКолонтитул ()

31

ActiveWindow.ActivePane.View.Type = wdPageView ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageHeader Selection.EndKey Unit:=wdStory, Extend:=wdExtend End Sub Sub Workbook_Open ()

парольДляЧтения = "гость" парольДляИзменения = "хозяин" With Лист1

.Activate пароль = InputBox ("Ваше имя ?") Select Case пароль Case парольДляЧтения .Protect (парольДляЧтения) MsgBox "Только для чтения" .Visible = True Case парольДляИзменения .Unprotect .Visible = True MsgBox "Доступ к чтению и записи" Case Else MsgBox "Неверный пароль" .Visible = xlVeryHidden End Select

End with End Sub Sub Workbook_BeforeClose (Cancel As Boolean)

MsgBox "До свидания" End Sub Sub Document_New () MsgBox "Перед Вами чистый лист электронной бумаги. Творите!" End Sub Sub Worksheet_Activate ()

Application.Dialogs (xlDialogOpen).Show End Sub

Sub Worksheet_Change (ByVal Target As.Range)

MsgBox "В ячейку занесено значение " & Target End Sub Sub Worksheet_Deactivate ()

Application.Dialogs (xlDialogSaveAs).Show End Sub Sub Workbook_Open ()

ThisWorkbook.OnWindow = "Сообщение" ThisWorkbook.Windows (1).OnWindow = "Предупреждение"

End Sub

32

Sub Сообщение () MsgBox "Открывается программа"

End Sub Sub Предупреждение ()

MsgBox "Открывается программа " & "Пароли" End Sub Sub Старт () ' Вызывается из процедур Автосохранение и Сохранить ' интервал � общая переменная On Error Resume Next Application.OnTime Now + TimeValue (интервал), "Сохранить" End Sub Sub Сохранить () ActiveDocument.Save Call Старт End Sub