20.01.2015 Views

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

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

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

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

В. М. Водовозов<br />

<strong>Управлен<strong>и</strong>е</strong> <strong>документам<strong>и</strong></strong><br />

<strong>Word</strong> <strong>и</strong> <strong>Excel</strong> <strong>на</strong> <strong>VBA</strong><br />

Санкт-Петербург<br />

2003


УДК 681.3.016<br />

В.М.Водовозов. <strong>Управлен<strong>и</strong>е</strong> <strong>документам<strong>и</strong></strong> <strong>Word</strong> <strong>и</strong> <strong>Excel</strong> <strong>на</strong> <strong>VBA</strong>. 32 c.<br />

Даны основные сведен<strong>и</strong>я об <strong>и</strong>спользован<strong>и</strong><strong>и</strong> Visual Basic for<br />

Applications для автомат<strong>и</strong>зац<strong>и</strong><strong>и</strong> работы в <strong>Word</strong> <strong>и</strong> <strong>Excel</strong>. Для всех, кто владеет<br />

основам<strong>и</strong> Microsoft Office.<br />

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


Оглавлен<strong>и</strong>е<br />

VISUAL BASIC FOR WORD......................................................................................4<br />

Модель объектов <strong>Word</strong> ...................................................................................4<br />

Процедурное программ<strong>и</strong>рован<strong>и</strong>е в <strong>Word</strong> .......................................................6<br />

Структурное программ<strong>и</strong>рован<strong>и</strong>е в <strong>Word</strong>......................................................9<br />

В<strong>и</strong>зуальное программ<strong>и</strong>рован<strong>и</strong>е в <strong>Word</strong> ........................................................17<br />

VISUAL BASIC FOR EXCEL ...................................................................................17<br />

Модель объектов <strong>Excel</strong> .................................................................................17<br />

Процедурное программ<strong>и</strong>рован<strong>и</strong>е в <strong>Excel</strong> .....................................................20<br />

Структурное программ<strong>и</strong>рован<strong>и</strong>е в <strong>Excel</strong>....................................................22<br />

В<strong>и</strong>зуальное программ<strong>и</strong>рован<strong>и</strong>е в <strong>Excel</strong> ........................................................24<br />

ПРОГРАММИРОВАНИЕ ИНТЕРФЕЙСА ПОЛЬЗОВАТЕЛЯ..........................................27<br />

Меню ...............................................................................................................27<br />

Панел<strong>и</strong> <strong>и</strong>нструментов ..................................................................................28<br />

Началь<strong>на</strong>я установка <strong>и</strong>нтерфейса..............................................................30


Visual Basic for <strong>Word</strong><br />

Модель объектов <strong>Word</strong><br />

Конкретные группы с<strong>и</strong>мволов, предложен<strong>и</strong>я, абзацы, поля, документы<br />

<strong>Word</strong> <strong>на</strong>зывают объектам<strong>и</strong> проекта. Каждый объект является представ<strong>и</strong>телем<br />

своего класса. Объекты, относящ<strong>и</strong>еся к одному классу, образуют коллекц<strong>и</strong><strong>и</strong>.<br />

Объекты, предоставляющ<strong>и</strong>е свою оконную площадь друг<strong>и</strong>м — дочерн<strong>и</strong>м —<br />

объектам, <strong>на</strong>зываются род<strong>и</strong>телям<strong>и</strong>. Ор<strong>и</strong>ентац<strong>и</strong><strong>и</strong> в м<strong>и</strong>ре классов способствует<br />

меню В<strong>и</strong>д. Просмотр объектов редактора Visual Basic, дубл<strong>и</strong>рованное<br />

одно<strong>и</strong>менной кнопкой панел<strong>и</strong> Visual Basic <strong>и</strong> функц<strong>и</strong>о<strong>на</strong>льной клав<strong>и</strong>шей<br />

.<br />

Каждый класс оп<strong>и</strong>сывается конечным множеством компонентов, <strong>и</strong>л<strong>и</strong><br />

членов. Член-данные характер<strong>и</strong>зуют сво<strong>и</strong> объекты определенным<strong>и</strong><br />

свойствам<strong>и</strong>, а члены-процедуры — определенным<strong>и</strong> методам<strong>и</strong> обработк<strong>и</strong>,<br />

зарег<strong>и</strong>стр<strong>и</strong>рованным<strong>и</strong> в модел<strong>и</strong> объектов. Члены неотдел<strong>и</strong>мы от сво<strong>и</strong>х<br />

классов. Обращен<strong>и</strong>е к объектам выполняется по одной <strong>и</strong>з двух схем:<br />

• <strong>и</strong>мяКласса (<strong>и</strong>мяОбъекта)<br />

• <strong>и</strong>мяКласса (<strong>и</strong>ндексОбъекта)<br />

Пр<strong>и</strong> вызове <strong>и</strong>мяОбъекта заключается в кавычк<strong>и</strong>, а <strong>и</strong>ндексОбъекта<br />

соответствует его порядковому номеру в коллекц<strong>и</strong><strong>и</strong> всех объектов.<br />

Способы <strong>и</strong>н<strong>и</strong>ц<strong>и</strong>ал<strong>и</strong>зац<strong>и</strong><strong>и</strong> членов:<br />

• Коллекц<strong>и</strong>я.Член = З<strong>на</strong>чен<strong>и</strong>е<br />

• <strong>и</strong>мяКласса.Член = З<strong>на</strong>чен<strong>и</strong>е<br />

• <strong>и</strong>мяОбъекта.Член = З<strong>на</strong>чен<strong>и</strong>е<br />

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

спец<strong>и</strong>альным<strong>и</strong> лексемам<strong>и</strong>:<br />

• ActiveDocument — акт<strong>и</strong>вный документ;<br />

• ActiveGrammarDictionary — акт<strong>и</strong>вный словарь;<br />

• ActiveControl — акт<strong>и</strong>вный элемент управлен<strong>и</strong>я;<br />

• ActiveMenuBar — акт<strong>и</strong>вное меню;<br />

• ActivePane — акт<strong>и</strong>в<strong>на</strong>я область экра<strong>на</strong>;<br />

• ActivePrinter — акт<strong>и</strong>вный пр<strong>и</strong>нтер;<br />

• ActiveWindow — акт<strong>и</strong>вное окно;


5<br />

• ActiveWritingStyle — акт<strong>и</strong>вный ст<strong>и</strong>ль;<br />

• Selection — выделенный объект.<br />

На<strong>и</strong>более общ<strong>и</strong>м сч<strong>и</strong>тается класс Application. К нему обращаются<br />

тогда, когда в программе <strong>на</strong>до <strong>и</strong>спользовать средства <strong>Word</strong>, отсутствующ<strong>и</strong>е<br />

в языке <strong>VBA</strong>. З<strong>на</strong>я с<strong>и</strong>нтакс<strong>и</strong>с обращен<strong>и</strong>я, программ<strong>и</strong>ст может вызывать <strong>и</strong>х <strong>и</strong>з<br />

авторск<strong>и</strong>х процедур <strong>и</strong> функц<strong>и</strong>й.<br />

Класс Application расш<strong>и</strong>ряется классам<strong>и</strong> Window <strong>и</strong> Windows. Методом<br />

NewWindow класса Window создаются новые ок<strong>на</strong>, а методом Arrange класса<br />

Windows он<strong>и</strong> располагаются <strong>на</strong> экране. Каждое конкретное окно<br />

акт<strong>и</strong>в<strong>и</strong>з<strong>и</strong>руется методом Activate, а свойства Caption, DispayRulers,<br />

WindowState, Count определяют его характер<strong>и</strong>ст<strong>и</strong>к<strong>и</strong>.<br />

Класс Application расш<strong>и</strong>ряется, также, классом Documents,<br />

оп<strong>и</strong>сывающ<strong>и</strong>м все открытые в <strong>Word</strong> документы. Документы открываются<br />

методом Open <strong>и</strong>л<strong>и</strong> создаются методом Add <strong>и</strong> закрываются методом Close<br />

класса Documents. Для учета ч<strong>и</strong>сла открытых документов <strong>и</strong>спользуется<br />

свойство Count.<br />

В качестве компонентов класса Document выступают его свойства:<br />

абзацы (Paragraphs), предложен<strong>и</strong>я (Sentences), слова (<strong>Word</strong>s), с<strong>и</strong>мволы<br />

(Characters). Доступ к отдельным компонентам открывается по <strong>и</strong>х <strong>и</strong>ме<strong>на</strong>м<br />

<strong>и</strong>л<strong>и</strong> <strong>и</strong>ндексам, представляющ<strong>и</strong>м поз<strong>и</strong>ц<strong>и</strong><strong>и</strong> в документе — с первого по Count.<br />

Дв<strong>и</strong>гаясь в глубь объектной <strong>и</strong>ерарх<strong>и</strong><strong>и</strong>, программ<strong>и</strong>ст может<br />

ман<strong>и</strong>пул<strong>и</strong>ровать самым<strong>и</strong> разным<strong>и</strong> объектам<strong>и</strong>. С помощью методов <strong>и</strong>л<strong>и</strong><br />

свойств объекта, стоящего выше в <strong>и</strong>ерарх<strong>и</strong>ческом ряду, в вызывающую<br />

подпрограмму возвращается объект следующего уровня.<br />

Пр<strong>и</strong>меры<br />

Sub СтандартныйД<strong>и</strong>алог ()<br />

Application.Dialogs (wdDialogFileSaveAs).Show<br />

End Sub<br />

Sub МетодЗавершен<strong>и</strong>я ()<br />

MsgBox "Завершен<strong>и</strong>е работы <strong>Word</strong>"<br />

Application.Quit SaveChanges:=wdPromptToSaveChanges<br />

End Sub<br />

Sub Ок<strong>на</strong> ()<br />

' Есл<strong>и</strong> открыто несколько окон<br />

Windows (1).Activate<br />

ActiveWindow.Caption = "Первое окно"<br />

ActiveWindow.DisplayRulers = False<br />

Windows.Arrange<br />

ActivePrinter = "HP LaserJet III"<br />

MsgBox "Кол<strong>и</strong>чество окон равно " & Windows.Count


6<br />

Windows (2).WindowState = wdWindowStateMaximize<br />

End Sub<br />

Sub Документ ()<br />

Documents.Open ("Документ1.doc")<br />

Documents.Add<br />

<strong>и</strong>мя = "Новый документ"<br />

Documents (2).SaveAs (<strong>и</strong>мя)<br />

MsgBox "Документ <strong>на</strong>зывается " & Documents (2).Name<br />

Documents (1).Activate<br />

MsgBox "Открыто " & Documents.Count & " документа: " & _<br />

ActiveDocument.Name & " <strong>и</strong> " & Documents (2).Name<br />

ActiveDocument.Save<br />

Documents.Close SaveChanges:=wdPromptToSaveChanges<br />

End Sub<br />

Sub Кол<strong>и</strong>чествоКомпонентов ()<br />

MsgBox "В документе " & ActiveDocument.Paragraphs.Count & _<br />

" абзацев" & Chr (13) & ActiveDocument.Sentences.Count & _<br />

" предложен<strong>и</strong>й" & Chr (13) & ActiveDocument.Characters.Count _<br />

& " с<strong>и</strong>мволов"<br />

End Sub<br />

Sub СловаИПредложен<strong>и</strong>я ()<br />

первое = Documents (1).<strong>Word</strong>s.First<br />

последнее = Documents (1).Sentences.Last<br />

MsgBox "Начав со слова " & первое & _<br />

", кончаем предложен<strong>и</strong>ем " & последнее<br />

End Sub<br />

Sub ПятыйС<strong>и</strong>мвол ()<br />

ActiveDocument.Characters.Item (5) = "Ф"<br />

Msgbox ActiveDocument.Characters.Item (5)<br />

End Sub<br />

Sub Ст<strong>и</strong>льИТ<strong>и</strong>пДокумента ()<br />

Documents.Open ("Документ1.doc")<br />

Documents ("Документ1.doc").Characters (2) = "7"<br />

MsgBox ActiveDocument.Styles (wdStyleHeading1)<br />

MsgBox ActiveDocument.Type<br />

End Sub<br />

Процедурное программ<strong>и</strong>рован<strong>и</strong>е в <strong>Word</strong><br />

На<strong>и</strong>более распространенные задач<strong>и</strong>, решаемые <strong>VBA</strong> в среде <strong>Word</strong>,<br />

посвящены работе с выделенным<strong>и</strong> фрагментам<strong>и</strong> текста. Объекты класса<br />

Selection в <strong>Word</strong> <strong>и</strong>меют богатую гамму методов <strong>и</strong> свойств:<br />

• свойства Next <strong>и</strong> Previous возвращают фрагменты текста, следующ<strong>и</strong>е<br />

за выделенным <strong>и</strong> предшествующ<strong>и</strong>е ему;


7<br />

• свойство End указывает конец выделенного фрагмента;<br />

• свойство Font управляет шр<strong>и</strong>фтом;<br />

• метод Copy коп<strong>и</strong>рует выделенный фрагмент в буфер обме<strong>на</strong>, Cut<br />

вырезает его в буфер обме<strong>на</strong>, Move перемещает в новое место, Paste<br />

реал<strong>и</strong>зует вставку содерж<strong>и</strong>мого буфера, а Delete удаляет;<br />

• методы HomeKey, EscapeKey, EndKey, MoveLeft, MoveRight <strong>и</strong> т.п.<br />

<strong>и</strong>м<strong>и</strong>т<strong>и</strong>руют <strong>на</strong>жат<strong>и</strong>е соответствующ<strong>и</strong>х клав<strong>и</strong>ш;<br />

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

Некоторые компоненты (<strong>на</strong>пр<strong>и</strong>мер, свойство Text в классе Selection)<br />

пр<strong>и</strong> обращен<strong>и</strong><strong>и</strong> можно опускать как <strong>и</strong>спользуемые по умолчан<strong>и</strong>ю.<br />

Обращен<strong>и</strong>е к группе членов одной коллекц<strong>и</strong><strong>и</strong> удобно выполнять по схеме:<br />

With Коллекц<strong>и</strong>я<br />

.Член<br />

[ … ]<br />

End With<br />

Переменные <strong>VBA</strong> могут хран<strong>и</strong>ть объекты <strong>Word</strong> <strong>и</strong> ман<strong>и</strong>пул<strong>и</strong>ровать <strong>и</strong>м<strong>и</strong>.<br />

Оператор Set создает объектную переменную, которую можно <strong>и</strong>спользовать<br />

в программе вместо объекта.<br />

Пр<strong>и</strong>меры<br />

Function ЧтоМенять ()<br />

Selection.MoveLeft Unit:=wdCharacter, Count:=1, Extend:=wdExtend<br />

ЧтоМенять = Left (Selection.Text, 1)<br />

End Function<br />

Sub Вернуться ()<br />

Selection.MoveRight Unit:=wdCharacter, Count:=1, Extend:=wdExtend<br />

End Sub<br />

Sub ВыделенныеС<strong>и</strong>мволы ()<br />

‘ Здесь <strong>и</strong>спользова<strong>на</strong> пр<strong>и</strong>веден<strong>на</strong>я выше функц<strong>и</strong>я ЧтоМенять<br />

с<strong>и</strong>мвол = Selection.Characters (1).Text<br />

MsgBox "Вот первый с<strong>и</strong>мвол: " & с<strong>и</strong>мвол<br />

всего = ActiveDocument.Sentences (1).Characters.Count<br />

MsgBox "В первом предложен<strong>и</strong><strong>и</strong> " & всего & " с<strong>и</strong>мволов" & Chr (13) & _<br />

"Надо замен<strong>и</strong>ть с<strong>и</strong>мвол " & ЧтоМенять<br />

End Sub<br />

Sub Д<strong>и</strong>апазоны ()<br />

с<strong>и</strong>мвол = Selection.Characters (1)<br />

MsgBox "Вот первый с<strong>и</strong>мвол: " & с<strong>и</strong>мвол<br />

Selection.Copy


8<br />

Documents.Add.Content.Paste<br />

End Sub<br />

Sub СнятьФормат<strong>и</strong>рован<strong>и</strong>е ()<br />

With Selection.Find<br />

.ClearFormatting<br />

.Replacement.ClearFormatting<br />

.Forward = True<br />

.MatchCase = True<br />

End With<br />

End Sub<br />

Sub Сокращен<strong>и</strong>еРасш<strong>и</strong>рен<strong>и</strong>еВыделен<strong>и</strong>я ()<br />

With Selection<br />

End = End - 1<br />

MsgBox "Сократ<strong>и</strong>л..."<br />

.Extend ("R")<br />

MsgBox "Расш<strong>и</strong>р<strong>и</strong>л до R..."<br />

.Expand Unit:=wdSentence<br />

MsgBox "Расш<strong>и</strong>р<strong>и</strong>л до конца предложен<strong>и</strong>я..."<br />

.MoveLeft Unit:=wdCharacter, Count:=1, Extend:=wdExtend<br />

MsgBox "<strong>и</strong> смест<strong>и</strong>л курсор <strong>на</strong> букву влево."<br />

End With<br />

End Sub<br />

Sub Объект<strong>на</strong>яПеремен<strong>на</strong>я<strong>Word</strong> ()<br />

Set что = Selection<br />

что.Delete Unit := wdCharacter<br />

что.InlineShapes.AddOLEObject ClassType:="Equation.3", FileName:=""<br />

MsgBox "Встав<strong>и</strong>л формулу…"<br />

что.HomeKey wdLine, wdMove<br />

MsgBox "Перешел влево..."<br />

что.EndKey wdLine, wdExtend<br />

MsgBox "Выдел<strong>и</strong>л до конца..."<br />

что.EndKey Unit:=wdStory<br />

MsgBox “<strong>и</strong> перешел в конец,”<br />

что.TypeParagraph<br />

MsgBox “открыв новый абзац”<br />

End Sub<br />

Sub Перемен<strong>на</strong>яВместоОбъекта<strong>Word</strong> ()<br />

Selection.MoveUp<br />

Set что = Selection.Find<br />

With что<br />

.ClearFormatting<br />

.Font.Name = "Times New Roman"<br />

.Font.Size = 10<br />

.Range.Case = wdTitle<strong>Word</strong><br />

.Execute FindText:="", ReplaceWith:=""<br />

End With<br />

MsgBox "Удал<strong>и</strong>л!"<br />

End Sub


9<br />

Sub Измен<strong>и</strong>тьПервуюСтроку ()<br />

Call СнятьФормат<strong>и</strong>рован<strong>и</strong>е<br />

Set выделено = Selection<br />

With выделено.Find<br />

.ParagraphFormat.FirstLineIndent = CentimetersToPoints (1.27)<br />

.Text = ""<br />

.Execute<br />

End With<br />

With Selection<br />

.MoveLeft<br />

.ParagraphFormat.FirstLineIndent = CentimetersToPoints (0)<br />

.TypeText (vbTab)<br />

End With<br />

End Sub<br />

Sub Язык ()<br />

Структурное программ<strong>и</strong>рован<strong>и</strong>е в <strong>Word</strong><br />

‘ Иногда бывает, что функц<strong>и</strong>я проверк<strong>и</strong> правоп<strong>и</strong>сан<strong>и</strong>я вашего оф<strong>и</strong>са<br />

‘ “не замет<strong>и</strong>ла”, что вы переключ<strong>и</strong>л<strong>и</strong> драйвер клав<strong>и</strong>атуры, <strong>и</strong> продолжает<br />

‘ проверять русск<strong>и</strong>й язык как англ<strong>и</strong>йск<strong>и</strong>й <strong>и</strong>л<strong>и</strong> <strong>на</strong>оборот. Эта подпрограмма<br />

‘ поможет вам мгновенно <strong>и</strong>справ<strong>и</strong>ть ош<strong>и</strong>бку компьютера.<br />

With Selection<br />

If .LanguageID = wdRussian Then<br />

.LanguageID = wdEnglishUS<br />

Else<br />

.LanguageID = wdRussian<br />

End If<br />

End With<br />

End Sub<br />

Sub ВыровнятьПоШ<strong>и</strong>р<strong>и</strong>не ()<br />

‘ Эта программа поможет вам выровнять по ш<strong>и</strong>р<strong>и</strong>не выделенный фрагмент<br />

‘ <strong>и</strong>л<strong>и</strong> весь текст. Процедура СнятьФормат<strong>и</strong>рован<strong>и</strong>е была да<strong>на</strong> раньше.<br />

Call ЧтоВыделять<br />

Call СнятьФормат<strong>и</strong>рован<strong>и</strong>е<br />

With Selection.Find<br />

.Text = "^p^p"<br />

.Replacement.Text = "ГРАНИЦА АБЗАЦА"<br />

.Execute Replace:=wdReplaceAll<br />

.Text = "^p^t"<br />

.Replacement.Text = "АБЗАЦНЫЙ ОТСТУП"<br />

.Execute Replace:=wdReplaceAll<br />

.Text = "^p^w"<br />

.Replacement.Text = "АБЗАЦНЫЙ ОТСТУП"<br />

.Execute Replace:=wdReplaceAll


10<br />

.Text = "^p"<br />

.Replacement.Text = " "<br />

.Execute Replace:=wdReplaceAll<br />

.Text = "ГРАНИЦА АБЗАЦА"<br />

.Replacement.Text = "^p^p"<br />

.Execute Replace:=wdReplaceAll<br />

.Text = "АБЗАЦНЫЙ ОТСТУП"<br />

.Replacement.Text = "^p^t"<br />

.Execute Replace:=wdReplaceAll<br />

End With<br />

Selection.ParagraphFormat.Alignment = wdAlignParagraphJustify<br />

Selection.HomeKey Unit:=wdLine<br />

End Sub<br />

Sub ЧтоВыделять ()<br />

дл<strong>и</strong><strong>на</strong> = Len (Selection.Text)<br />

If дл<strong>и</strong><strong>на</strong> 0 And <strong>и</strong>нтервал < 10 Then<br />

<strong>и</strong>нтервал = "00:0" & Right (Str (<strong>и</strong>нтервал), 1)<br />

ElseIf <strong>и</strong>нтервал >= 10 And <strong>и</strong>нтервал < 60 Then<br />

<strong>и</strong>нтервал = "00:" & Right(Str (<strong>и</strong>нтервал), 2)<br />

Else<br />

КакЧастоСохранятьФайл = False<br />

End If<br />

End Function<br />

Sub Фраза ()<br />

слово = ""<br />

For счет = 1 To Len (Selection.Text)<br />

буква = Mid (Selection.Text, счет, 1)<br />

слово = слово & буква<br />

Next<br />

Selection.TypeText (слово)<br />

End Sub<br />

Sub Выдел<strong>и</strong>ть ()<br />

For Each с<strong>и</strong>мвол In Selection.Characters<br />

с<strong>и</strong>мвол.Font.Bold = True<br />

Next<br />

End Sub


11<br />

Sub Красный ()<br />

‘ Отдельные с<strong>и</strong>мволы по всему документу можно раскрас<strong>и</strong>ть,<br />

‘ как пятерку в этом макросе.<br />

For Each с<strong>и</strong>мвол In ActiveDocument.<strong>Word</strong>s<br />

If с<strong>и</strong>мвол = “5” Then с<strong>и</strong>мвол.Font.ColorIndex = wdRed<br />

Next<br />

End Sub<br />

Sub Следующ<strong>и</strong>йДокумент ()<br />

‘ Как автомат<strong>и</strong>ческ<strong>и</strong> пр<strong>и</strong>сво<strong>и</strong>ть новому документу следующ<strong>и</strong>й номер<br />

‘ Помест<strong>и</strong>те в него поле, <strong>на</strong>чн<strong>и</strong>те нумерац<strong>и</strong>ю, а остальное сделает макрос.<br />

On Error Resume Next<br />

старыйНомер = ActiveDocument.FormFields (1).Result<br />

ActiveDocument.FormFields (1).Result = старыйНомер + 1<br />

End Sub<br />

Sub Ж<strong>и</strong>рный ()<br />

‘ Выдел<strong>и</strong>те ж<strong>и</strong>рным шр<strong>и</strong>фтом столько букв, сколько захот<strong>и</strong>те.<br />

On Error Resume Next<br />

счет = InputBox (“Сколько ”)<br />

For счетч<strong>и</strong>к=1 To счет<br />

ActiveDocument.<strong>Word</strong>s (счетч<strong>и</strong>к).Font.Bold = True<br />

Next<br />

End Sub<br />

Sub Лат<strong>и</strong>н<strong>и</strong>цаК<strong>и</strong>р<strong>и</strong>лл<strong>и</strong>ца ()<br />

‘ Тот, кто переп<strong>и</strong>сывается по электронной почте с зарубежным<strong>и</strong><br />

‘ абонентам<strong>и</strong>, з<strong>на</strong>ет, что такое лат<strong>и</strong>н<strong>и</strong>ца. Это когда русск<strong>и</strong>е буквы<br />

‘ заменяют лат<strong>и</strong>нск<strong>и</strong>м<strong>и</strong>, оставляя русск<strong>и</strong>е фразы. Naprimer, tak.<br />

‘ Предлагаемая программа автомат<strong>и</strong>з<strong>и</strong>рует перевод выделенного<br />

‘ фрагмента <strong>и</strong>л<strong>и</strong> всего текста в лат<strong>и</strong>н<strong>и</strong>цу <strong>и</strong>л<strong>и</strong> обратно в к<strong>и</strong>р<strong>и</strong>лл<strong>и</strong>цу.<br />

‘ Функц<strong>и</strong>я ЧтоМенять <strong>и</strong> подпрограмма Вернуться вам уже з<strong>на</strong>комы.<br />

дл<strong>и</strong><strong>на</strong> = Len (Selection.Text)<br />

If дл<strong>и</strong><strong>на</strong>


12<br />

End If<br />

Selection.MoveRight Unit:=wdCharacter, Count:=1<br />

If текст = vbCancel Then Exit Sub<br />

Do Until Len (Selection.Text) = дл<strong>и</strong><strong>на</strong> Or дл<strong>и</strong><strong>на</strong> < 1<br />

буква = ЧтоМенять<br />

If функц<strong>и</strong>я = "К<strong>и</strong>р" Then<br />

новыйТекст = К<strong>и</strong>р<strong>и</strong>лл<strong>и</strong>ца (буква) & новыйТекст<br />

Else<br />

новыйТекст = Лат<strong>и</strong>н<strong>и</strong>ца (буква) & новыйТекст<br />

End If<br />

Loop<br />

Selection.TypeText (новыйТекст)<br />

End Sub<br />

Function К<strong>и</strong>р<strong>и</strong>лл<strong>и</strong>ца (буква)<br />

текст = К<strong>и</strong>р (буква)<br />

Select Case буква<br />

Case "e", "i", "u", "a"<br />

втораяБуква = ЧтоМенять<br />

If втораяБуква "y" Then<br />

Call Вернуться<br />

Select Case буква<br />

Case "e": текст = "э": Case "i": текст = "ы"<br />

Case "u": текст = "у": Case "a": текст = "а"<br />

End Select<br />

ElseIf буква = "e" Then: текст = "е"<br />

ElseIf буква = "i" Then: текст = "<strong>и</strong>"<br />

ElseIf буква = "u" Then: текст = "ю"<br />

ElseIf буква = "a" Then: текст = "я"<br />

Else<br />

Call Вернуться<br />

End If<br />

Case "j"<br />

текст = "ь"<br />

втораяБуква = ЧтоМенять<br />

If втораяБуква = "h" Then<br />

третьяБуква = ЧтоМенять<br />

If третьяБуква = "s" Then текст = "щ" Else _<br />

Call Вернуться<br />

Else<br />

Call Вернуться<br />

End If<br />

Case "s"<br />

текст = "с"<br />

втораяБуква = ЧтоМенять<br />

If втораяБуква = "t" Then текст = "ц" Else Call Вернуться<br />

Case "h"<br />

текст = "х"<br />

втораяБуква = ЧтоМенять<br />

If втораяБуква = "k" Then: текст = "х"


13<br />

ElseIf втораяБуква = "s" Then: текст = "ш"<br />

ElseIf втораяБуква = "c" Then: текст = "ч"<br />

ElseIf втораяБуква = "z" Then: текст = "ж"<br />

Else<br />

Call Вернуться<br />

End If<br />

Case "E", "I", "U", "A"<br />

втораяБуква = ЧтоМенять<br />

If втораяБуква "Y" Then<br />

Call Вернуться<br />

Select Case буква<br />

Case "E": текст = "Э": Case "I": текст = "Ы"<br />

Case "U": текст = "У": Case "A": текст = "А"<br />

End Select<br />

ElseIf буква = "E" Then: текст = "Е"<br />

ElseIf буква = "I" Then: текст = "И"<br />

ElseIf буква = "U" Then: текст = "Ю"<br />

ElseIf буква = "A" Then: текст = "Я"<br />

Else<br />

Call Вернуться<br />

End If<br />

Case "J"<br />

текст = "Ь"<br />

втораяБуква = ЧтоМенять<br />

If втораяБуква = "H" Then<br />

третьяБуква = ЧтоМенять<br />

If третьяБуква = "S" Then текст = "Щ" Else _<br />

Call Вернуться<br />

Else<br />

Call Вернуться<br />

End If<br />

Case "S"<br />

текст = "С"<br />

втораяБуква = ЧтоМенять<br />

If втораяБуква = "T" Then текст = "Ц" Else Call Вернуться<br />

Case "H"<br />

текст = "Х"<br />

втораяБуква = ЧтоМенять<br />

If втораяБуква = "K" Then: текст = "Х"<br />

ElseIf втораяБуква = "S" Then: текст = "Ш"<br />

ElseIf втораяБуква = "C" Then: текст = "Ч"<br />

ElseIf втораяБуква = "Z" Then: текст = "Ж"<br />

Else<br />

Call Вернуться<br />

End If<br />

End Select<br />

К<strong>и</strong>р<strong>и</strong>лл<strong>и</strong>ца = текст<br />

End Function


14<br />

Function Лат<strong>и</strong>н<strong>и</strong>ца (к<strong>и</strong>р)<br />

Select Case к<strong>и</strong>р<br />

Case "к" To "п"<br />

Лат = Chr (Asc ("k") + Asc (к<strong>и</strong>р) – Asc ("к"))<br />

Case "К" To "П"<br />

Лат = Chr (Asc ("K") + Asc (к<strong>и</strong>р) – Asc ("К"))<br />

Case "р" To "у"<br />

Лат = Chr (Asc ("r") + Asc (к<strong>и</strong>р) – Asc ("р"))<br />

Case "Р" To "У"<br />

Лат = Chr (Asc ("R") + Asc (к<strong>и</strong>р) – Asc ("Р"))<br />

Case "а": Лат = "a": Case "б": Лат = "b": Case "в": Лат = "v"<br />

Case "г": Лат = "g": Case "д": Лат = "d": Case "е": Лат = "ye"<br />

Case "ж": Лат = "zh": Case "з": Лат = "z": Case "<strong>и</strong>": Лат = "yi"<br />

Case "й": Лат = "y": Case "ф": Лат = "f": Case "х": Лат = "kh"<br />

Case "ц": Лат = "ts": Case "ч": Лат = "ch": Case "ш": Лат = "sh"<br />

Case "щ": Лат = "shj": Case "ъ": Лат = "`": Case "ы": Лат = "i"<br />

Case "ь": Лат = "j": Case "э": Лат = "e": Case "ю": Лат = "yu"<br />

Case "я": Лат = "ya": Case "А": Лат = "A": Case "Б": Лат = "B"<br />

Case "В": Лат = "V": Case "Г": Лат = "G": Case "Д": Лат = "D"<br />

Case "Е": Лат = "YE": Case "Ж": Лат = "ZH": Case "З": Лат = "Z"<br />

Case "И": Лат = "YI": Case "Й": Лат = "Y": Case "Ф": Лат = "F"<br />

Case "Х": Лат = "KH": Case "Ц": Лат = "TS": Case "Ч": Лат = "CH"<br />

Case "Ш": Лат = "SH": Case "Щ": Лат = "SHJ": Case "Ъ": Лат = "`"<br />

Case "Ы": Лат = "I": Case "Ь": Лат = "J": Case "Э": Лат = "E"<br />

Case "Ю": Лат = "YU": Case "Я": Лат = "YA": Case Else: Лат = к<strong>и</strong>р<br />

End Select<br />

End Function<br />

Function К<strong>и</strong>р (лат)<br />

Select Case лат<br />

Case "k" To "p"<br />

К<strong>и</strong>р = Chr (Asc ("к") + Asc (лат) – Asc ("k"))<br />

Case "K" To "P"<br />

К<strong>и</strong>р = Chr (Asc ("К") + Asc (лат) – Asc ("K"))<br />

Case "b": К<strong>и</strong>р = "б": Case "v", "w": К<strong>и</strong>р = "в"<br />

Case "g": К<strong>и</strong>р = "г"<br />

Case "d": К<strong>и</strong>р = "д": Case "z": К<strong>и</strong>р = "з"<br />

Case "y": К<strong>и</strong>р = "й"<br />

Case "f": К<strong>и</strong>р = "ф": Case "`": К<strong>и</strong>р = "ъ"<br />

Case "r": К<strong>и</strong>р = "р"<br />

Case "t": К<strong>и</strong>р = "т": Case "B": К<strong>и</strong>р = "Б"<br />

Case "V","W": К<strong>и</strong>р = "В"<br />

Case "G": К<strong>и</strong>р = "Г": Case "D": К<strong>и</strong>р = "Д"<br />

Case "Z": К<strong>и</strong>р = "З"<br />

Case "Y": К<strong>и</strong>р = "Й": Case "F": К<strong>и</strong>р = "Ф"<br />

Case "I": К<strong>и</strong>р = "Ы"<br />

Case "R": К<strong>и</strong>р = "Р": Case "T": К<strong>и</strong>р = "Т"<br />

Case Else: К<strong>и</strong>р = лат<br />

End Select<br />

End Function


15<br />

Sub По<strong>и</strong>ск ()<br />

Selection.HomeKey Unit := wdStory<br />

чтоИскать = InputBox (“Чего тебе <strong>на</strong>добно”)<br />

Do<br />

есть = Selection.Find.Execute (чтоИскать)<br />

еще = MsgBox (“Еще”, vbYesNo)<br />

Loop While еще = vbYes And есть = True<br />

End Sub<br />

Sub Определен<strong>и</strong>еТ<strong>и</strong>па<strong>Word</strong> ()<br />

Dim перемен<strong>на</strong>я As Characters<br />

Set перемен<strong>на</strong>я = Selection.Characters<br />

MsgBox "В переменной т<strong>и</strong>па Characters " & перемен<strong>на</strong>я.Count & " с<strong>и</strong>мволов"<br />

End Sub<br />

Sub Переопределен<strong>и</strong>еТ<strong>и</strong>паObject<strong>Word</strong> ()<br />

Dim перемен<strong>на</strong>я As Object<br />

Set перемен<strong>на</strong>я = Selection.Characters<br />

MsgBox "В переменной т<strong>и</strong>па Characters " & перемен<strong>на</strong>я.Count & " с<strong>и</strong>мволов"<br />

End Sub<br />

Sub Перемен<strong>на</strong>яВместоОбъекта<strong>Word</strong> ()<br />

Dim перемен<strong>на</strong>я As Object<br />

Set перемен<strong>на</strong>я = ThisDocument.Sentences<br />

With перемен<strong>на</strong>я<br />

.Last = "12345"<br />

.First = "Первая фраза"<br />

End With<br />

End Sub<br />

Sub Иерарх<strong>и</strong>яОбъектов<strong>Word</strong> ()<br />

Dim кн<strong>и</strong>га As Document, фраза As ParagraphFormat<br />

Set кн<strong>и</strong>га = ThisDocument<br />

With кн<strong>и</strong>га<br />

Set фраза = .Paragraphs.Item (1).Format<br />

With фраза<br />

.LeftIndent = 3<br />

.Alignment = wdAlignParagraphCenter<br />

.LineSpacing = 1<br />

End With<br />

End With<br />

End Sub<br />

Sub Клав<strong>и</strong>атура ()<br />

‘ Кому <strong>и</strong>з вас не случалось <strong>на</strong>ч<strong>и</strong><strong>на</strong>ть печатать пр<strong>и</strong> ош<strong>и</strong>бочной<br />

‘ раскладке клав<strong>и</strong>атуры — русской вместо англ<strong>и</strong>йской <strong>и</strong>л<strong>и</strong> <strong>на</strong>оборот<br />

‘ И потом, спохват<strong>и</strong>вш<strong>и</strong>сь, все ст<strong>и</strong>рать <strong>и</strong> <strong>на</strong>ч<strong>и</strong><strong>на</strong>ть с<strong>на</strong>чала. Теперь с эт<strong>и</strong>м<br />

‘ будет покончено: дан<strong>на</strong>я программа автомат<strong>и</strong>ческ<strong>и</strong> смен<strong>и</strong>т раскладку от<br />

‘ поз<strong>и</strong>ц<strong>и</strong><strong>и</strong> курсора до того места, где вы неверно переключ<strong>и</strong>л<strong>и</strong> клав<strong>и</strong>атуру.<br />

‘ В ней задействова<strong>на</strong> <strong>и</strong>звест<strong>на</strong>я вам функц<strong>и</strong>я ЧтоМенять.


16<br />

Dim масс<strong>и</strong>в (2, 64)<br />

Call Заполн<strong>и</strong>тьМасс<strong>и</strong>в (масс<strong>и</strong>в)<br />

буква = ЧтоМенять<br />

If буква < "А" Then<br />

<strong>на</strong>чало = "А"<br />

конец = "я"<br />

Else<br />

<strong>на</strong>чало = "A"<br />

конец = "z"<br />

End If<br />

Do While буква < <strong>на</strong>чало Or буква > конец<br />

прежняяСтрока = строка<br />

For i = 0 To 63<br />

If масс<strong>и</strong>в (0, i) = буква Then<br />

строка = масс<strong>и</strong>в (1, i) & строка<br />

ElseIf масс<strong>и</strong>в (1, i) = буква Then<br />

строка = масс<strong>и</strong>в (0, i) & строка<br />

End If<br />

Next<br />

If строка = прежняяСтрока Then строка = буква & строка<br />

If Len (Selection.Text) < Len (строка) Then<br />

буква = ""<br />

строка = Right (строка, Len (Selection.Text))<br />

Exit Do<br />

Else<br />

буква = ЧтоМенять<br />

End If<br />

Loop<br />

строка = буква & строка<br />

Selection.TypeText (строка)<br />

End Sub<br />

Sub Заполн<strong>и</strong>тьМасс<strong>и</strong>в (<strong>и</strong>мя)<br />

For i = 0 To 63<br />

<strong>и</strong>мя (1, i) = Chr (i + Asc("А"))<br />

Next<br />

<strong>и</strong>мя (0, 0) = "A": <strong>и</strong>мя (0, 1) = "" <strong>и</strong>мя (0, 31) = "Z" <strong>и</strong>мя (0, 32) = "f": <strong>и</strong>мя (0, 33) = ","<br />

<strong>и</strong>мя (0, 34) = "d": <strong>и</strong>мя (0, 35) = "u" <strong>и</strong>мя (0, 36) = "l": <strong>и</strong>мя (0, 37) = "t"<br />

<strong>и</strong>мя (0, 38) = ";": <strong>и</strong>мя (0, 39) = "p" <strong>и</strong>мя (0, 40) = "b": <strong>и</strong>мя (0, 41) = "q"<br />

<strong>и</strong>мя (0, 42) = "r": <strong>и</strong>мя (0, 43) = "k" <strong>и</strong>мя (0, 44) = "v": <strong>и</strong>мя (0, 45) = "y"<br />

<strong>и</strong>мя (0, 46) = "j": <strong>и</strong>мя (0, 47) = "g" <strong>и</strong>мя (0, 48) = "h": <strong>и</strong>мя (0, 49) = "c"


17<br />

<strong>и</strong>мя (0, 50) = "n": <strong>и</strong>мя (0, 51) = "e" <strong>и</strong>мя (0, 52) = "a": <strong>и</strong>мя (0, 53) = "["<br />

<strong>и</strong>мя (0, 54) = "w": <strong>и</strong>мя (0, 55) = "x" <strong>и</strong>мя (0, 56) = "i": <strong>и</strong>мя (0, 57) = "o"<br />

<strong>и</strong>мя (0, 58) = "]": <strong>и</strong>мя (0, 59) = "s" <strong>и</strong>мя (0, 60) = "m"<br />

<strong>и</strong>мя (0, 61) = Chr(39): <strong>и</strong>мя (0, 62) = ".": <strong>и</strong>мя (0, 63) = "z"<br />

End Sub<br />

В<strong>и</strong>зуальное программ<strong>и</strong>рован<strong>и</strong>е в <strong>Word</strong><br />

'Процедуры формы <strong>Word</strong>, в которой есть <strong>на</strong>дп<strong>и</strong>сь, поле <strong>и</strong> кнопк<strong>и</strong> Ввод <strong>и</strong> Удален<strong>и</strong>е<br />

Sub UserForm_Activate ()<br />

Call Ввод_Click<br />

End Sub<br />

Sub Ввод_Click ()<br />

Label1 = "Ввод<strong>и</strong>те сообщен<strong>и</strong>е"<br />

TextBox1.Enabled = True<br />

End Sub<br />

Sub Удален<strong>и</strong>е_Click ()<br />

Label1 = "Сообщен<strong>и</strong>е удалено"<br />

TextBox1 = ""<br />

TextBox1.Enabled = False<br />

End Sub<br />

Sub TextBox1_Change ()<br />

Selection.Characters.Text = UserForm1.TextBox1.Text<br />

End Sub<br />

'В форме <strong>Word</strong> <strong>на</strong>ходятся кнопка <strong>и</strong> переключател<strong>и</strong><br />

Sub CommandButton1_Click ()<br />

If OptionButton1 = True Then<br />

Selection.Font.Bold = True<br />

Selection.Font.Italic = True<br />

Else<br />

Selection.Font.Bold = False<br />

Selection.Font.Italic = False<br />

End If<br />

End Sub<br />

Visual Basic for <strong>Excel</strong><br />

Модель объектов <strong>Excel</strong><br />

Конкретные ячейк<strong>и</strong>, д<strong>и</strong>апазоны, рабоч<strong>и</strong>е л<strong>и</strong>сты, электронные кн<strong>и</strong>г<strong>и</strong> <strong>и</strong><br />

т.п. являются объектам<strong>и</strong> проекта, представляющ<strong>и</strong>м<strong>и</strong> сво<strong>и</strong> классы. В модель<br />

объектов <strong>Excel</strong> входят:


18<br />

• класс ячеек Cells;<br />

• класс д<strong>и</strong>апазонов Range;<br />

• классы строк <strong>и</strong> столбцов Rows <strong>и</strong> Columns, Row <strong>и</strong> Column;<br />

• классы л<strong>и</strong>стов <strong>и</strong> рабоч<strong>и</strong>х л<strong>и</strong>стов Sheets <strong>и</strong> Worksheets, Sheet <strong>и</strong><br />

Worksheet;<br />

• классы рабоч<strong>и</strong>х кн<strong>и</strong>г <strong>и</strong> окон Workbooks <strong>и</strong> Windows, Workbook <strong>и</strong><br />

Window;<br />

• классы меню <strong>и</strong> панелей <strong>и</strong>нструментов CommandBars, CommandBar;<br />

• классы д<strong>и</strong>аграмм <strong>и</strong> окон д<strong>и</strong>алога Charts <strong>и</strong> Dialogs, Chart <strong>и</strong> Dialog.<br />

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

спец<strong>и</strong>альным<strong>и</strong> лексемам<strong>и</strong>:<br />

• ActiveCell — акт<strong>и</strong>в<strong>на</strong>я ячейка;<br />

• ActiveChart — выделен<strong>на</strong>я д<strong>и</strong>аграмма;<br />

• ActiveControl — акт<strong>и</strong>вный элемент управлен<strong>и</strong>я;<br />

• ActiveMenuBar — акт<strong>и</strong>вное меню;<br />

• ActivePane — акт<strong>и</strong>в<strong>на</strong>я область экра<strong>на</strong>;<br />

• ActivePrinter — акт<strong>и</strong>вный пр<strong>и</strong>нтер;<br />

• ActiveSheet — акт<strong>и</strong>вный рабоч<strong>и</strong>й л<strong>и</strong>ст;<br />

• ActiveWindow — акт<strong>и</strong>вное окно;<br />

• ActiveWorkbook — акт<strong>и</strong>в<strong>на</strong>я рабочая кн<strong>и</strong>га;<br />

• Selection — выделенный объект.<br />

На<strong>и</strong>более общ<strong>и</strong>м сч<strong>и</strong>тается класс Application. К нему обращаются<br />

тогда, когда в программе <strong>на</strong>до <strong>и</strong>спользовать процедуры <strong>и</strong>л<strong>и</strong> функц<strong>и</strong><strong>и</strong> <strong>Excel</strong>,<br />

отсутствующ<strong>и</strong>е в языке <strong>VBA</strong>. З<strong>на</strong>я с<strong>и</strong>нтакс<strong>и</strong>с эт<strong>и</strong>х подпрограмм,<br />

программ<strong>и</strong>ст может вызывать <strong>и</strong>х <strong>и</strong>з авторск<strong>и</strong>х подпрограмм <strong>и</strong> функц<strong>и</strong>й.<br />

Класс Application расш<strong>и</strong>ряется классом Workbooks, оп<strong>и</strong>сывающ<strong>и</strong>м все<br />

открытые в <strong>Excel</strong> рабоч<strong>и</strong>е кн<strong>и</strong>г<strong>и</strong>. Кн<strong>и</strong>г<strong>и</strong> открываются методом Open <strong>и</strong>л<strong>и</strong><br />

создаются методом Add <strong>и</strong> закрываются методом Close класса Workbooks. Для<br />

учета ч<strong>и</strong>сла открытых кн<strong>и</strong>г <strong>и</strong>спользуется свойство Count. Каждая конкрет<strong>на</strong>я<br />

кн<strong>и</strong>га представляет объект класса Workbook. В <strong>Excel</strong> очень много функц<strong>и</strong>й,<br />

пред<strong>на</strong>з<strong>на</strong>ченных для конечного пользователя. Программ<strong>и</strong>ст может<br />

включать <strong>и</strong>х в тексты авторск<strong>и</strong>х подпрограмм также с помощью класса<br />

Application.<br />

Главным<strong>и</strong> компонентам<strong>и</strong> класса Workbook являются л<strong>и</strong>сты (Sheets), в<br />

том ч<strong>и</strong>сле — рабоч<strong>и</strong>е л<strong>и</strong>сты (Worksheets) <strong>и</strong> л<strong>и</strong>сты д<strong>и</strong>аграмм (Charts). Класс<br />

Worksheets охватывает все рабоч<strong>и</strong>е л<strong>и</strong>сты рабочей кн<strong>и</strong>г<strong>и</strong>. Каждый новый<br />

рабоч<strong>и</strong>й л<strong>и</strong>ст добавляется методом Add <strong>и</strong> удаляется методом Delete. Доступ<br />

к отдельным объектам открывается по <strong>и</strong>х <strong>и</strong>ме<strong>на</strong>м <strong>и</strong>л<strong>и</strong> <strong>и</strong>ндексам,


19<br />

представляющ<strong>и</strong>м поз<strong>и</strong>ц<strong>и</strong>ю рабочего л<strong>и</strong>ста в кн<strong>и</strong>ге — с первого по<br />

Worksheets.Count, с учетом скрытых л<strong>и</strong>стов.<br />

Дв<strong>и</strong>гаясь в глубь объектной <strong>и</strong>ерарх<strong>и</strong><strong>и</strong>, программ<strong>и</strong>ст может<br />

ман<strong>и</strong>пул<strong>и</strong>ровать самым<strong>и</strong> разным<strong>и</strong> объектам<strong>и</strong>. С помощью методов <strong>и</strong>л<strong>и</strong><br />

свойств объекта, стоящего выше в <strong>и</strong>ерарх<strong>и</strong>ческом ряду, в вызывающую<br />

подпрограмму возвращается объект н<strong>и</strong>жеследующего уровня.<br />

Пр<strong>и</strong>меры<br />

Sub СтандартныйД<strong>и</strong>алог ()<br />

Application.Dialogs (xlDialogSaveAs).Show<br />

End Sub<br />

Sub Функц<strong>и</strong>я<strong>Excel</strong> ()<br />

MsgBox "Округленное з<strong>на</strong>чен<strong>и</strong>е ч<strong>и</strong>сла ПИ: " & _<br />

Application.Round (Application.Pi (), 3)<br />

End Sub<br />

Sub РабочаяКн<strong>и</strong>га ()<br />

Workbooks.Open ("Кн<strong>и</strong>га1")<br />

Workbooks.Add<br />

<strong>и</strong>мя = "Новая кн<strong>и</strong>га"<br />

Workbooks (2).SaveAs (<strong>и</strong>мя)<br />

MsgBox "В кн<strong>и</strong>ге " & Workbooks (2).Name & " всего " _<br />

& Sheets.Count & " л<strong>и</strong>стов"<br />

Workbooks (1).Activate<br />

MsgBox "Открыты кн<strong>и</strong>г<strong>и</strong> " & ActiveWorkbook.Name _<br />

& " <strong>и</strong> " & Workbooks (2).Name<br />

ActiveWorkbook.Save<br />

Workbooks.Close<br />

End Sub<br />

Sub Кол<strong>и</strong>чествоЛ<strong>и</strong>стов ()<br />

Sheets.Add<br />

MsgBox "В кн<strong>и</strong>ге " & Sheets.Count & " л<strong>и</strong>стов"<br />

End Sub<br />

Sub Пере<strong>и</strong>менован<strong>и</strong>еЛ<strong>и</strong>стов ()<br />

Л<strong>и</strong>ст1.Name = "Первый"<br />

Л<strong>и</strong>ст2.Name = "Второй"<br />

Л<strong>и</strong>ст3.Name = "Трет<strong>и</strong>й"<br />

End Sub<br />

Sub Рабоч<strong>и</strong>йЛ<strong>и</strong>ст ()<br />

Worksheets.Add Count:=2<br />

Worksheets (1).Name = "Первый л<strong>и</strong>ст"<br />

Sheets ("Первый л<strong>и</strong>ст").Activate<br />

ActiveSheet.PageSetup.Orientation = xlLandscape<br />

ActiveSheet.PrintOut<br />

ActiveSheet.Visible = False<br />

MsgBox Worksheets (1).Name & " скрыт"<br />

Sheets ("Первый л<strong>и</strong>ст").Visible = True


20<br />

MsgBox Worksheets (1).Name & " открыт"<br />

End Sub<br />

Sub Операц<strong>и</strong><strong>и</strong>НадЛ<strong>и</strong>стам<strong>и</strong> ()<br />

Workbooks.Open ("Кн<strong>и</strong>га1")<br />

Workbooks ("Кн<strong>и</strong>га1.xls").Worksheets (2).Delete<br />

Workbooks ("Кн<strong>и</strong>га1.xls").Worksheets (1).Name = "Пр<strong>и</strong>мер"<br />

Workbooks ("Кн<strong>и</strong>га1.xls").Worksheets ("Пр<strong>и</strong>мер").Activate<br />

ActiveWorkbook.Styles ("Normal").Font.Bold = True<br />

MsgBox "Этот л<strong>и</strong>ст пере<strong>и</strong>менован, а следующ<strong>и</strong>й удален"<br />

Worksheets.Add After:=ActiveSheet<br />

MsgBox "Добавлен л<strong>и</strong>ст взамен удаленного"<br />

Worksheets ("Пр<strong>и</strong>мер").Move After:=Sheets (Sheets.Count)<br />

End Sub<br />

Процедурное программ<strong>и</strong>рован<strong>и</strong>е в <strong>Excel</strong><br />

Самые распространенные задач<strong>и</strong>, решаемые <strong>VBA</strong> в среде <strong>Excel</strong>,<br />

посвящены работе с ячейкам<strong>и</strong> рабоч<strong>и</strong>х л<strong>и</strong>стов, <strong>и</strong>х д<strong>и</strong>апазо<strong>на</strong>м<strong>и</strong>, столбцам<strong>и</strong> <strong>и</strong><br />

строкам<strong>и</strong>. Для этого в <strong>Excel</strong> есть ряд классов, методов <strong>и</strong> свойств:<br />

• метод Range класса Worksheet возвращает д<strong>и</strong>апазон (в частност<strong>и</strong>,<br />

ячейку) по <strong>и</strong>мен<strong>и</strong> <strong>и</strong>л<strong>и</strong> переменной, <strong>и</strong>спользуемой в качестве<br />

аргумента; каждый д<strong>и</strong>апазон является объектом класса Range;<br />

• метод Cells обеспеч<strong>и</strong>вает выбор одной ячейк<strong>и</strong> рабочего л<strong>и</strong>ста в<br />

соответств<strong>и</strong><strong>и</strong> с двумя ч<strong>и</strong>словым<strong>и</strong> аргументам<strong>и</strong> — <strong>и</strong>ндексам<strong>и</strong> строк<strong>и</strong><br />

<strong>и</strong> столбца; пр<strong>и</strong> отсутств<strong>и</strong><strong>и</strong> аргументов выб<strong>и</strong>раются все ячейк<strong>и</strong><br />

рабочего л<strong>и</strong>ста;<br />

• метод Offset класса Range задает смещен<strong>и</strong>е д<strong>и</strong>апазо<strong>на</strong> относ<strong>и</strong>тельно<br />

заданной ячейк<strong>и</strong>;<br />

• методы Column <strong>и</strong> Row класса Worksheets возвращают столбец <strong>и</strong><br />

строку.<br />

Некоторые члены (<strong>на</strong>пр<strong>и</strong>мер, свойство Value) пр<strong>и</strong> обращен<strong>и</strong><strong>и</strong> можно<br />

опускать как <strong>и</strong>спользуемые по умолчан<strong>и</strong>ю.<br />

Переменные <strong>VBA</strong> могут хран<strong>и</strong>ть объекты <strong>Excel</strong> <strong>и</strong> ман<strong>и</strong>пул<strong>и</strong>ровать<br />

<strong>и</strong>м<strong>и</strong>. Оператор Set превращает обычную переменную в объектную<br />

переменную, которую можно <strong>и</strong>спользовать в программе вместо объекта.<br />

Объект<strong>на</strong>я перемен<strong>на</strong>я указывает <strong>на</strong> объект до тех пор, пока ей не будет<br />

пр<strong>и</strong>свое<strong>на</strong> ссылка <strong>на</strong> другой объект <strong>и</strong>л<strong>и</strong> з<strong>на</strong>чен<strong>и</strong>е Nothing.<br />

Пр<strong>и</strong>меры<br />

Sub Д<strong>и</strong>апазоны1 ()<br />

Range ("a1").Value = 1234<br />

Range ("a1:c5").Select<br />

Range ("a5").Value = Range ("a1").Value


21<br />

Range ("a6").Value = "Пр<strong>и</strong>вет"<br />

Range ("b1:b8").Formula = "=rand ()"<br />

Range ("b2:g1").Borders (xlBottom).LineStyle = xlDouble<br />

End Sub<br />

Sub Д<strong>и</strong>апазоны2 ()<br />

Л<strong>и</strong>ст1.Cells.Font.Bold = True<br />

Л<strong>и</strong>ст1.Activate<br />

Range ("a1:c5") = 1234<br />

Range ("a1:c5").Select<br />

Range ("c9") = Range ("a1").Value * 2<br />

Range ("a6") = "Пр<strong>и</strong>вет"<br />

Range ("b1:b8") = "=sum (a1:a3)"<br />

End Sub<br />

Sub Ячейк<strong>и</strong> ()<br />

With Worksheets (1)<br />

.Cells (3, 1).Value = 5678<br />

.Cells (4, 1).Formula = "=sum (b1:b8)"<br />

.Range (.Cells(3, 1), .Cells(5, 10)).Borders.LineStyle = xlThick<br />

End With<br />

End Sub<br />

Sub Смещен<strong>и</strong>е ()<br />

Л<strong>и</strong>ст1.Activate<br />

Cells.HorizontalAlignment = xlCenter<br />

Activesheet.Range ("a1").Select<br />

Selection.Offset (3, 1).Select<br />

ActiveCell.Value = "Сообщен<strong>и</strong>е"<br />

Selection.Font.Bold = True<br />

Selection.Font.Name = "Courier New Cyr"<br />

содержан<strong>и</strong>е = ActiveCell.Value<br />

MsgBox содержан<strong>и</strong>е<br />

Activesheet.Range ("e5").Select<br />

ActiveCell.Value = "Центр"<br />

ActiveCell.Offset (1, 0).Value = "Юг"<br />

ActiveCell.Offset (0, -1).Value = "Запад"<br />

ActiveCell.Offset (-1, 1).Value = "Северо-Восток"<br />

End Sub<br />

Sub Област<strong>и</strong> ()<br />

Л<strong>и</strong>ст1.Activate<br />

Range ("a1:d4").ClearContents<br />

Union (Range("a1:b2"), Range ("c2:d4")).Select<br />

кол<strong>и</strong>чество = Selection.Areas.Count<br />

MsgBox "Выделено областей: " & кол<strong>и</strong>чество<br />

Selection.Clear<br />

End Sub<br />

Sub Объект<strong>на</strong>яПеремен<strong>на</strong>я<strong>Excel</strong> ()<br />

Worksheets ("Первый л<strong>и</strong>ст").Activate<br />

Range ("c5") = "Тест"


22<br />

простоПеремен<strong>на</strong>я = Range ("c5")<br />

MsgBox "Перемен<strong>на</strong>я рав<strong>на</strong> " & простоПеремен<strong>на</strong>я<br />

Cells (5, 3) = 1234<br />

Set объект<strong>на</strong>яПеремен<strong>на</strong>я = Range ("c5")<br />

MsgBox "Ячейка " & объект<strong>на</strong>яПеремен<strong>на</strong>я.Address & _<br />

" содерж<strong>и</strong>т " & объект<strong>на</strong>яПеремен<strong>на</strong>я.Value<br />

End Sub<br />

Sub Перемен<strong>на</strong>яВместоОбъекта<strong>Excel</strong> ()<br />

Set перемен<strong>на</strong>я = Л<strong>и</strong>ст1.Range ("a2")<br />

With перемен<strong>на</strong>я<br />

.Font.Bold = True<br />

.Font.ColorIndex = 3<br />

.Font.Size = 16<br />

.Value = "Тест"<br />

End With<br />

End Sub<br />

Структурное программ<strong>и</strong>рован<strong>и</strong>е в <strong>Excel</strong><br />

Sub Рабоч<strong>и</strong>йЛ<strong>и</strong>ст ()<br />

Worksheets.Add Count:=2<br />

Worksheets (1).Name = "Первый л<strong>и</strong>ст"<br />

Sheets ("Первый л<strong>и</strong>ст").Activate<br />

ActiveSheet.PageSetup.Orientation = xlLandscape<br />

ActiveSheet.PrintOut<br />

If MsgBox ("Скрыть л<strong>и</strong>ст ", vbYesNo + vbQuestion) = vbYes Then<br />

ActiveSheet.Visible = False<br />

If MsgBox ("Показать л<strong>и</strong>ст ", vbYesNo + vbQuestion) = vbYes Then<br />

Sheets ("Первый л<strong>и</strong>ст").Visible = True<br />

End If<br />

End If<br />

End Sub<br />

Sub Име<strong>на</strong>Л<strong>и</strong>стов ()<br />

Sheets.Add<br />

MsgBox "Всего л<strong>и</strong>стов: " & Sheets.Count<br />

For Each л<strong>и</strong>ст In Worksheets<br />

л<strong>и</strong>ст.Activate<br />

л<strong>и</strong>ст.Name = InputBox ("Имя " & ActiveSheet.index & "-го л<strong>и</strong>ста")<br />

Next<br />

End Sub<br />

Sub Ячейк<strong>и</strong> ()<br />

With Worksheets (1)<br />

.Cells (3, 1).Value = 5678<br />

.Cells (4, 1).Formula = "=sum (b1:f1)"<br />

For год = 1 To 5<br />

.Cells (1, год + 1).Value = 1990 + год<br />

Next год<br />

.Range (.Cells (3, 2), .Cells (5, 6)).Borders.LineStyle = xlThick


23<br />

End With<br />

End Sub<br />

Sub Удален<strong>и</strong>еЛ<strong>и</strong>стов ()<br />

сколько = InputBox ("Сколько л<strong>и</strong>стов удал<strong>и</strong>ть")<br />

For i = сколько To 0 Step -1<br />

If Worksheets.Count


24<br />

.Value = "Тест"<br />

End With<br />

End Sub<br />

Sub Иерарх<strong>и</strong>яОбъектов<strong>Excel</strong> ()<br />

Dim кн<strong>и</strong>га As Workbook, табл<strong>и</strong>ца As Worksheet, д<strong>и</strong>апазон As Range<br />

Set кн<strong>и</strong>га = Workbooks (1)<br />

With кн<strong>и</strong>га<br />

Set табл<strong>и</strong>ца = .Worksheets (1)<br />

With табл<strong>и</strong>ца<br />

Set д<strong>и</strong>апазон = .Range ("a2:b4")<br />

With д<strong>и</strong>апазон<br />

.Font.Italic = True<br />

.Value = 3.5<br />

End With<br />

End With<br />

End With<br />

End Sub<br />

В<strong>и</strong>зуальное программ<strong>и</strong>рован<strong>и</strong>е в <strong>Excel</strong><br />

Sub Поле<strong>Excel</strong> ()<br />

Л<strong>и</strong>ст2.Activate<br />

UserForm1.Show<br />

Call UserForm1.TextBox1_Change<br />

End Sub<br />

Sub TextBox1_Change ()<br />

Range ("a2") = UserForm1.TextBox1<br />

End Sub<br />

Sub Автосохранен<strong>и</strong>е ()<br />

' Форма <strong>Excel</strong> содерж<strong>и</strong>т поле Время <strong>и</strong> флажок флагСохранен<strong>и</strong>я.<br />

‘ Функц<strong>и</strong>я КакЧастоСохранятьФайл пр<strong>и</strong>веде<strong>на</strong> ранее,<br />

‘ а запускаемая таймером подпрограмма Старт — в последней главе.<br />

On Error GoTo конец<br />

If UserForm1.флагСохранен<strong>и</strong>я = True Then<br />

<strong>и</strong>нтервал = Val (UserForm1.Время)<br />

If Not КакЧастоСохранятьФайл (<strong>и</strong>нтервал) Then<br />

UserForm1.флагСохранен<strong>и</strong>я = False<br />

Exit Sub<br />

End If<br />

Call Старт <strong>и</strong>нтервал<br />

End If<br />

Exit Sub<br />

конец:<br />

End Sub<br />

Sub Сч<strong>и</strong>татьСтаж ()<br />

‘ Дан<strong>на</strong>я программа сч<strong>и</strong>тает срок (стаж, выслугу) между двумя датам<strong>и</strong>,


25<br />

‘ выражая его в днях, месяцах <strong>и</strong> годах, а пр<strong>и</strong> необход<strong>и</strong>мост<strong>и</strong> —<br />

‘ в полных днях <strong>и</strong>л<strong>и</strong> месяцах. Для этого в форму помещены поля:<br />

‘ днПоле, мнПоле, гнПоле <strong>на</strong>чальной даты <strong>и</strong> дкПоле, мкПоле, гкПоле<br />

‘ конечной даты, <strong>на</strong>дп<strong>и</strong>с<strong>и</strong> для вывода срока <strong>и</strong> флажок CheckBox,<br />

‘ определяющ<strong>и</strong>й в<strong>и</strong>д результата.<br />

On Error GoTo ош<strong>и</strong>бка<br />

d0 = Val (днПоле)<br />

m0 = Val (мнПоле)<br />

y0 = Val (гнПоле)<br />

d1 = Val (дкПоле)<br />

m1 = Val (мкПоле)<br />

y1 = Val (гкПоле)<br />

If m0 < 1 Or m0 > 12 Then GoTo ош<strong>и</strong>бка<br />

If d1 < 1 Or m1 > 12 Then GoTo ош<strong>и</strong>бка<br />

If y0 < -9999 Or y0 > 9999 Then GoTo ош<strong>и</strong>бка<br />

If y1 < -9999 Or y1 > 9999 Then GoTo ош<strong>и</strong>бка<br />

If d1 > ДнейВМесяце (m1, y1) Or d1 < 1 Then GoTo ош<strong>и</strong>бка<br />

If d0 > ДнейВМесяце (m0, y0) Or d0 < 1 Then GoTo ош<strong>и</strong>бка<br />

If d0 12 Then m = m - 12<br />

d = d + ДнейВМесяце (m, y1)<br />

Next<br />

End If<br />

d = d + days


26<br />

If CheckBox.Value = False Then<br />

дс = days<br />

мс = months<br />

<strong>на</strong>дп<strong>и</strong>сь.Caption = "Срок: дней, месяцев, лет"<br />

Else<br />

дс = d<br />

мс = years * 12 + months<br />

<strong>на</strong>дп<strong>и</strong>сь.Caption = "Полных дней, месяцев, лет"<br />

End If<br />

гс = years<br />

Exit Sub<br />

ош<strong>и</strong>бка:<br />

дс = "": мс = "": гс = ""<br />

сообщен<strong>и</strong>е = "Ввод<strong>и</strong>те день месяц год" _<br />

& Chr(13) & "- Конец позднее Начала"<br />

MsgBox сообщен<strong>и</strong>е, , "Срок<strong>и</strong>"<br />

днПоле.SetFocus<br />

End Sub<br />

Function ДнейВМесяце (m, y)<br />

‘ Сколько дней в месяце (m) с учетом года (y) <br />

Select Case m<br />

Case 1, 3, 5, 7, 8, 10, 12<br />

ДнейВМесяце = 31<br />

Case 4, 6, 9, 11<br />

ДнейВМесяце = 30<br />

Case 2<br />

If В<strong>и</strong>сокосныйГод (y) = True Then ДнейВМесяце = 29 _<br />

Else ДнейВМесяце = 28<br />

Case Else<br />

ДнейВМесяце = 0<br />

End Select<br />

End Function<br />

Function В<strong>и</strong>сокосныйГод (y)<br />

‘ В<strong>и</strong>сокосный л<strong>и</strong> год<br />

В<strong>и</strong>сокосныйГод = False<br />

If (y Mod 100) = 0 Then<br />

If (y Mod 400) = 0 Then В<strong>и</strong>сокосныйГод = True<br />

Else<br />

If (y Mod 4) = 0 Then В<strong>и</strong>сокосныйГод = True<br />

End If<br />

End Function<br />

Sub КалейдоскопКвадратов<strong>Excel</strong> ()<br />

номерЦвета = 1<br />

Л<strong>и</strong>ст1.Activate


27<br />

For Each ф<strong>и</strong>гура In Л<strong>и</strong>ст1.Shapes<br />

ф<strong>и</strong>гура.Select<br />

Selection.Interior.ColorIndex = номерЦвета<br />

номерЦвета = номерЦвета + 1<br />

Next ф<strong>и</strong>гура<br />

End Sub<br />

Программ<strong>и</strong>рован<strong>и</strong>е <strong>и</strong>нтерфейса пользователя<br />

Меню<br />

Меню создаются <strong>и</strong> редакт<strong>и</strong>руются под управлен<strong>и</strong>ем редактора меню<br />

<strong>и</strong>л<strong>и</strong> с помощью процедур, размещаемых в модулях. Редактор меню<br />

представлен вкладкой Команды меню В<strong>и</strong>д .Панел<strong>и</strong> <strong>и</strong>нструментов<br />

.Настройка…<br />

Разл<strong>и</strong>чают встроенные меню пр<strong>и</strong>ложен<strong>и</strong>я <strong>и</strong> авторск<strong>и</strong>е меню<br />

пользователя. Каждому пункту авторского меню соответствует<br />

<strong>и</strong>нд<strong>и</strong>в<strong>и</strong>дуальный макрос <strong>и</strong>л<strong>и</strong> функц<strong>и</strong>я. Редактор меню позволяет удалять<br />

любой пункт меню, открыв его контекстное меню <strong>и</strong> выбрав <strong>и</strong>з него Сброс<br />

<strong>и</strong>л<strong>и</strong> Удал<strong>и</strong>ть пр<strong>и</strong> открытом окне Настройка. Пр<strong>и</strong> этом встроенные меню не<br />

удаляются, а скрываются. В любое меню можно добав<strong>и</strong>ть новый пункт через<br />

вкладку Команды меню В<strong>и</strong>д .Панел<strong>и</strong> <strong>и</strong>нструментов .Настройка,<br />

перетащ<strong>и</strong>в необход<strong>и</strong>мый элемент <strong>и</strong>з сп<strong>и</strong>ска Команды в меню.<br />

Для программ<strong>и</strong>рован<strong>и</strong>я строк меню <strong>и</strong>спользуются объекты классов<br />

CommandBars <strong>и</strong> CommandBar <strong>и</strong>з б<strong>и</strong>бл<strong>и</strong>отек<strong>и</strong> Microsoft Office. Первый <strong>и</strong>з<br />

классов хран<strong>и</strong>т все строк<strong>и</strong> встроенных меню. Он служ<strong>и</strong>т <strong>и</strong>нструментом<br />

<strong>и</strong>спользован<strong>и</strong>я меню пр<strong>и</strong>ложен<strong>и</strong>я <strong>и</strong> создан<strong>и</strong>я авторск<strong>и</strong>х меню. Второй класс<br />

представляет все пункты конкретного меню. Он служ<strong>и</strong>т <strong>и</strong>нструментом<br />

<strong>и</strong>спользован<strong>и</strong>я пунктов меню пр<strong>и</strong>ложен<strong>и</strong>я <strong>и</strong> создан<strong>и</strong>я авторск<strong>и</strong>х пунктов.<br />

Ссылк<strong>и</strong> <strong>на</strong> пункты меню определяются свойством Controls.<br />

Для отображен<strong>и</strong>я контекстных меню <strong>и</strong>спользуется метод ShowPopup, а<br />

для удален<strong>и</strong>я всех новых меню, не выведенных <strong>на</strong> экран, – методы Delete <strong>и</strong><br />

Reset.<br />

Пр<strong>и</strong>меры<br />

Sub ВсеСтрок<strong>и</strong>Меню ()<br />

For Each строкаМеню In CommandBars<br />

Debug.Print строкаМеню.Index, " ", строкаМеню.Name<br />

Next<br />

End Sub<br />

Sub ВсеПунктыМеню ()<br />

For Each пункт In CommandBars ("Menu Bar").Controls<br />

сп<strong>и</strong>сок = сп<strong>и</strong>сок & пункт.Index & " " & пункт.Caption & Chr(13)<br />

Next


28<br />

MsgBox сп<strong>и</strong>сок<br />

End Sub<br />

Sub ЕщеСтрокаМеню ()<br />

Set новоеМеню = CommandBars.Add (Name:="Игры", _<br />

Position:=msoBarFloating, MenuBar:=False, Temporary:=True)<br />

новоеМеню.Visible = True<br />

End Sub<br />

Sub Наполнен<strong>и</strong>еСтрок<strong>и</strong>Меню ()<br />

Set меню = CommandBars (CommandBars.Count)<br />

Set новыйПункт = меню.Controls.Add (Type:=msoControlPopup)<br />

новыйПункт.Caption = "Информац<strong>и</strong>я"<br />

Set подпункт1 = новыйПункт.Controls.Add (Type:=msoControlPopup)<br />

подпункт1.Caption = "О меню"<br />

Set подпункт2 = новыйПункт.Controls.Add (Type:=msoControlPopup)<br />

With подпункт2<br />

.Caption = "О панелях"<br />

.Enabled = True<br />

.OnAction = "процедураИл<strong>и</strong>Макрос"<br />

End With<br />

End Sub<br />

Sub Удален<strong>и</strong>еМеню ()<br />

For Each меню In CommandBars<br />

If Not меню.BuiltIn And Not меню.Visible Then меню.Delete<br />

Next<br />

End Sub<br />

Sub Восстановлен<strong>и</strong>еМеню ()<br />

On Error Resume Next<br />

For i = 1 To CommandBars.Count<br />

CommandBars (i).Reset<br />

Next<br />

End Sub<br />

Панел<strong>и</strong> <strong>и</strong>нструментов<br />

<strong>VBA</strong> позволяет <strong>и</strong>змен<strong>и</strong>ть <strong>и</strong>зображен<strong>и</strong>е любой кнопк<strong>и</strong> панел<strong>и</strong><br />

<strong>и</strong>нструментов с помощью меню В<strong>и</strong>д .Панел<strong>и</strong> <strong>и</strong>нструментов .Настройка.<br />

Пр<strong>и</strong> программ<strong>и</strong>рован<strong>и</strong><strong>и</strong> панел<strong>и</strong> <strong>и</strong>нструментов рассматр<strong>и</strong>ваются как<br />

разнов<strong>и</strong>дност<strong>и</strong> меню.<br />

Пр<strong>и</strong>меры<br />

Sub НоваяПанельИнструментов ()<br />

On Error GoTo ош<strong>и</strong>бка<br />

Dim новаяПанель As CommandBar<br />

Set новаяПанель = CommandBars.Add (Name:="Игры", _<br />

Position:=msoBarFloating, MenuBar:=False, Temporary:=True)<br />

With новаяПанель.Controls


29<br />

.Add Type:=msoControlEdit<br />

.Add Type:=msoControlButton , Id:=4<br />

.Add Type:=msoControlButton , Id:=21<br />

.Add Type:=msoControlDropdown<br />

.Add Type:=msoControlComboBox<br />

End With<br />

новаяПанель.Controls (1).OnAction = "мойМакрос"<br />

новаяПанель.Visible = True<br />

номерПанел<strong>и</strong> = CommandBars.Count<br />

MsgBox "Перед вам<strong>и</strong> панель " & новаяПанель.Name _<br />

& " номер " & номерПанел<strong>и</strong><br />

ош<strong>и</strong>бка:<br />

CommandBars ("Игры").Delete<br />

End Sub<br />

Sub НовыйЭлемент ()<br />

On Error GoTo ош<strong>и</strong>бка<br />

Dim панель As CommandBar<br />

Dim элемент As CommandBarComboBox<br />

Set панель = CommandBars (3)<br />

Set элемент = панель.Controls.Add (Type:=msoControlDropdown)<br />

With элемент<br />

.AddItem "Кофе", 1<br />

.AddItem "Чай", 2<br />

.AddItem "Сок", 3<br />

.DropDownWidth = 75<br />

.DropDownLines = 3<br />

.ListIndex = 3<br />

End With<br />

панель.Visible = True<br />

ош<strong>и</strong>бка:<br />

элемент.Delete<br />

End Sub<br />

Sub Панел<strong>и</strong>Инструментов ()<br />

For Each панель In CommandBars<br />

If панель.Index > 2 And панель.Index < 19 Then панель.Visible = False<br />

Next панель<br />

MsgBox "Все панел<strong>и</strong> <strong>и</strong>нструментов скрыты." & Chr (13) & _<br />

"Сейчас он<strong>и</strong> будут последовательно возвращаться"<br />

For Each панель In CommandBars<br />

If панель.Index > 2 And панель.Index < 19 Then<br />

панель.Visible = True<br />

MsgBox "Это панель " & панель.Name<br />

End If<br />

Next панель<br />

If MsgBox ("Убрать л<strong>и</strong>шн<strong>и</strong>е ", vbYesNo) = vbYes Then<br />

For счетч<strong>и</strong>к = 18 To 5 Step -1<br />

CommandBars (счетч<strong>и</strong>к).Visible = False<br />

Next счетч<strong>и</strong>к


30<br />

End If<br />

End Sub<br />

Началь<strong>на</strong>я установка <strong>и</strong>нтерфейса<br />

Пр<strong>и</strong> открыт<strong>и</strong><strong>и</strong> документа <strong>Word</strong> всегда в первую очередь<br />

автомат<strong>и</strong>ческ<strong>и</strong> обрабатывается событ<strong>и</strong>е Open объекта Document, а закрыт<strong>и</strong>ю<br />

предшествует событ<strong>и</strong>е Close. Каждый новый документ <strong>Word</strong> обрабатывает<br />

событ<strong>и</strong>е New.<br />

Пр<strong>и</strong> открыт<strong>и</strong><strong>и</strong> рабочей кн<strong>и</strong>г<strong>и</strong> <strong>Excel</strong> с<strong>на</strong>чала обрабатывается событ<strong>и</strong>е<br />

Open объекта Workbook, а закрыт<strong>и</strong>ю предшествует событ<strong>и</strong>е BeforeClose.<br />

Каждый рабоч<strong>и</strong>й л<strong>и</strong>ст <strong>Excel</strong> обрабатывает событ<strong>и</strong>я Activate, SheetChange <strong>и</strong><br />

Deactivate.<br />

Свойство OnWindow запускает заданную процедуру пр<strong>и</strong> выделен<strong>и</strong><strong>и</strong><br />

определенного ок<strong>на</strong>. С помощью свойства OnTime программа может<br />

реаг<strong>и</strong>ровать <strong>на</strong> событ<strong>и</strong>я, связанные со временем. Для отмены реакц<strong>и</strong><strong>и</strong> <strong>на</strong><br />

событ<strong>и</strong>е свойству OnTime пр<strong>и</strong>сва<strong>и</strong>вается пустая строка.<br />

Пр<strong>и</strong>меры<br />

Sub Document_Open ()<br />

Call СчетОткрыт<strong>и</strong>йДокумента<br />

End Sub<br />

Sub Document_Close ()<br />

Call Следующ<strong>и</strong>йДокумент<br />

ActiveDocument.Save<br />

End Sub<br />

Sub СчетОткрыт<strong>и</strong>йДокумента ()<br />

' С<strong>на</strong>бд<strong>и</strong>те документ полем в колонт<strong>и</strong>туле, а в форму UserForm1<br />

‘ помест<strong>и</strong>те поле Счетч<strong>и</strong>к<br />

On Error GoTo форма<br />

ПереходВКолонт<strong>и</strong>тул<br />

счетч<strong>и</strong>кОткрыт<strong>и</strong>й = Selection.Fields (1).Result<br />

UserForm1.Счетч<strong>и</strong>к.Text = счетч<strong>и</strong>кОткрыт<strong>и</strong>й<br />

Selection.Fields (1).Select<br />

x = Val (счетч<strong>и</strong>кОткрыт<strong>и</strong>й) + 1<br />

z = "QUOTE """ & x & """"<br />

Selection.Fields.Add Range := Selection.Range, _<br />

Type := wdFieldEmpty, Text := z<br />

форма:<br />

ActiveWindow.ActivePane.View.SeekView = wdSeekMainDocument<br />

UserForm1.Show<br />

End Sub<br />

Public Sub ПереходВКолонт<strong>и</strong>тул ()


31<br />

ActiveWindow.ActivePane.View.Type = wdPageView<br />

ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageHeader<br />

Selection.EndKey Unit:=wdStory, Extend:=wdExtend<br />

End Sub<br />

Sub Workbook_Open ()<br />

парольДляЧтен<strong>и</strong>я = "гость"<br />

парольДляИзменен<strong>и</strong>я = "хозя<strong>и</strong>н"<br />

With Л<strong>и</strong>ст1<br />

.Activate<br />

пароль = InputBox ("Ваше <strong>и</strong>мя ")<br />

Select Case пароль<br />

Case парольДляЧтен<strong>и</strong>я<br />

.Protect (парольДляЧтен<strong>и</strong>я)<br />

MsgBox "Только для чтен<strong>и</strong>я"<br />

.Visible = True<br />

Case парольДляИзменен<strong>и</strong>я<br />

.Unprotect<br />

.Visible = True<br />

MsgBox "Доступ к чтен<strong>и</strong>ю <strong>и</strong> зап<strong>и</strong>с<strong>и</strong>"<br />

Case Else<br />

MsgBox "Неверный пароль"<br />

.Visible = xlVeryHidden<br />

End Select<br />

End with<br />

End Sub<br />

Sub Workbook_BeforeClose (Cancel As Boolean)<br />

MsgBox "До св<strong>и</strong>дан<strong>и</strong>я"<br />

End Sub<br />

Sub Document_New ()<br />

MsgBox "Перед Вам<strong>и</strong> ч<strong>и</strong>стый л<strong>и</strong>ст электронной бумаг<strong>и</strong>. Твор<strong>и</strong>те!"<br />

End Sub<br />

Sub Worksheet_Activate ()<br />

Application.Dialogs (xlDialogOpen).Show<br />

End Sub<br />

Sub Worksheet_Change (ByVal Target As.Range)<br />

MsgBox "В ячейку занесено з<strong>на</strong>чен<strong>и</strong>е " & Target<br />

End Sub<br />

Sub Worksheet_Deactivate ()<br />

Application.Dialogs (xlDialogSaveAs).Show<br />

End Sub<br />

Sub Workbook_Open ()<br />

ThisWorkbook.OnWindow = "Сообщен<strong>и</strong>е"<br />

ThisWorkbook.Windows (1).OnWindow = "Предупрежден<strong>и</strong>е"<br />

End Sub


32<br />

Sub Сообщен<strong>и</strong>е ()<br />

MsgBox "Открывается программа"<br />

End Sub<br />

Sub Предупрежден<strong>и</strong>е ()<br />

MsgBox "Открывается программа " & "Парол<strong>и</strong>"<br />

End Sub<br />

Sub Старт ()<br />

' Вызывается <strong>и</strong>з процедур Автосохранен<strong>и</strong>е <strong>и</strong> Сохран<strong>и</strong>ть<br />

' <strong>и</strong>нтервал – общая перемен<strong>на</strong>я<br />

On Error Resume Next<br />

Application.OnTime Now + TimeValue (<strong>и</strong>нтервал), "Сохран<strong>и</strong>ть"<br />

End Sub<br />

Sub Сохран<strong>и</strong>ть ()<br />

ActiveDocument.Save<br />

Call Старт<br />

End Sub

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!