VBA. Практическое программирование
.pdf
Создание собственного меню
проблема легко решается через опции Сервис/Параметры, или в самом проекте нужно поместить несколько строк, выполняемых перед закрытием проекта в которых восстанавливается строка состояния, строка формул, сетка и т. д.
Второе замечание, которое касается этого примера — данный файл является заготовкой для создания настоящего проекта и ряд команд в нем повторяется. Мы будем рассматривать лишь ту часть кода, которая необходима для понимания.
В отдельном самостоятельном модуле располагается особая процедура с именем Auto_open(), которая запускается при загрузке файла. В этой процедуре происходит объявление переменных, в которых хранятся указания на будущие объекты, относящиеся к меню. В проекте предполагается создание одной панели с четырьмя кнопками Для первых 3-х предполагается создать выпадающие меню, при щелчке по 4-й должна выполняться команда.
Public Sub Auto_open() Dim cMain As CommandBar
Dim But1 As CommandBarPopup Dim But11 As CommandBarButton Dim But12 As CommandBarButton Dim But13 As CommandBarButton Dim But14 As CommandBarButton Dim But2 As CommandBarPopup
.................................................
Dim But4 As CommandBarButton
.................................................
Затем происходит добавление новой панели меню
Set cMain = CommandBars.Add(«Mmenu», Position:=msoBar-
Top, MenuBar:=True, Temporary:=True)
И кнопок на это меню
Set But1 = cMain.Controls.Add(Type:=msoControlPopup)
But1.Caption = ''Литература 7''
Set But11 = But1.Controls.Add(Type:=msoControlButton)
But11.Style = msoButtonCaption
But11.Caption = ''Сказки''
But11.OnAction = ''ttt11()''
Set But12 = But1.Controls.Add(Type:=msoControlButton)
But12.Style = msoButtonCaption
But12.Caption = ''Былины''
81
2. «Быстрое» программирование
But12.OnAction = ''ttt12()''
...................................................................................
Set But2 = cMain.Controls.Add(Type:=msoControlPopup) But2.Caption = ''Литература — 8''
...................................................................................
Set But4 = cMain.Controls.Add(Type:=msoControlButton) But4.Style = msoButtonCaption
But4.Caption = ''Настройка'' But4.OnAction = ''nasti''
cMain.visible = True End Sub
Также в этом модуле содержится группа процедур, вызываемых при нажатии на кнопки меню. Так для But4 предусмотрена процедура nasti, в которой запрашивается пароль, и в случае, если он введен правильно, происходит переход на Лист 6, где можно изменить вид меню!
Public Sub nasti() pas$ = ''tolik''
A$ = InputBox(''Введите пароль'', ''Доступ к настройкам'') If A$ = pas$ Then
Worksheets(6).visible = True Worksheets(6).Activate
End If End Sub
Для But12 и остальных подобных кнопок в этом проекте необходимы почти одинаковые процедуры копирования данных из одного листа на другой. Познакомьтесь с этим кодом и обратите внимание — в программе этот код разбит на 2 строки с помощью комбинации символов '' _'' (пробел и знак подчеркивания)
Public Sub ttt11()
Worksheets(''tt1'').Range(''b1:D9'').Copy _
Destination:=Worksheets(''dsp'').Range(''b1'')
End Sub
В модуле Эта Книга (This WorkBook) помещена процедура, которая срабатывает при открытии книги. В этой процедуре становятся невидимыми стандартные меню электронной таблицы, а также ряд рабочих листов. Это необходимо для будущего проекта. Чтобы эта часть процедуры сработала только один раз, используется переменная fl. Также в этой процедуре закрывается строка
82
Создание собственного меню
формул и строка состояния. Активным становится первый рабо- чий лист книги.
Private Sub Workbook_Open()
Static fl As Integer If fl = 0 Then
Application.CommandBars(''Standard'').visible = False Application.CommandBars(''Formatting'').visible = False Application.CommandBars(''Control Toolbox'').visible = False
Worksheets(2).visible = False Worksheets(3).visible = False
.................................................................
fl = 1 End If
With Application
.DisplayFormulaBar = False
.DisplayStatusBar = False End With Worksheets(1).Activate End sub
Перед закрытием рабочей книги необходимо восстановить стандартные панели. Эта процедура полезна также тем, что если Вам необходимо в проекте воспользоваться стандартными меню, то необходимо попытаться закрыть проект, и на запрос «Сохранять изменения» нажать «Отмена».
Private Sub Workbook_BeforeClose()
Application.CommandBars(''Worksheet Menu Bar'').visible = True
Application.CommandBars(''Standard'').visible = True
Application.CommandBars(''Formatting'').visible = True
End Sub
На листе 6 с именем «nasti» можно изменить надписи на кнопках меню. Для этого достаточно заполнить таблицу и нажать кнопку «Изменить меню». В этом случае начнет выполняться процедура, в которой использование циклов обусловлено тем, что кнопки являются элементами коллекции и имеют свои номера.
Private Sub CommandButton1_Click() For j = 1 To 3
CommandBars(''Mmenu'').Controls(j).Caption = Cells(2, j + 2) For i = 1 To 4
83
2. «Быстрое» программирование
CommandBars(''Mmenu'').Controls(j).CommandBar
.Controls(i).Caption = Cells(i + 2, j + 2)
Next i
Next j
End Sub
При выходе из режима настройки необходимо скрыть все рабо- чие листы, которые могли быть открыты к этому времени, кроме первого.
Private Sub CommandButton3_Click()
If Worksheets(''tt1'').visible = True Then Worksheets(''tt1'')
.visible = False
If Worksheets(''nast'').visible = True Then Worksheets(''nast'')
.visible = False
..................................................................................
End Sub
Применение VBA в редакторе Word
В силу ограниченности объема мы не будем перечислять все, даже основные объекты VBA в Word и свойства этих объектов. Тем не менее, чтобы определить возможности VBA важно понять следующее.
Word содержит очень большое количество объектов, но для программирования представляют интерес те объекты и те их методы и свойства, которые целесообразно использовать именно в режиме программирования. Одна из серьезных задач при создании программ — это получение доступа к той или иной части документа. Для этого используют такие коллекции объектов как Sections (разделы), Paragraphs (абзацы), Sentences (предложения), Words (слова) и другие. Эти коллекции имеют такой метод как Count, который позволяет определить число объектов в коллекции, вариант записи кода в виде «......Words(5).» дает возможность перейти к пятому слову в документе. Таким же образом можно вызвать для обработки какой либо абзац, предложение и.д. Поэтому целесообразно для большей доступности к тем или иным фрагментам документа, предварительно структурировать сам документ. Необходимо отметить, что Excel по сравнению с текстовым редактором в этом плане обладает большими возможностями. Очевидным недостатком электронной таблицы является невозможность работы с текстом или, точнее говоря, с определенными фрагмен-
84
Применение VBA в редакторе Word
тами текста. Именно Word в сочетании с VBA предоставляет широкие возможности в этом направлении.. Если удалось перейти к определенной части документа, то может быть использован такой важный объект, как Font, который позволяет изменять свойства шрифта, а также другие объекты форматирования. Также для обработки текста может быть использован объект Range, который является базовым объектом в операции редактирования. Его можно рассматривать, как определенный тем или иным способом непрерывный фрагмент текста (никак не связанный с выделенной областью), который не зависит от положения курсора. Объект Range включает в себя такие объекты как «Слово» или «Предложение» и поэтому при обращении к этим объектам сам объект Range указывать не нужно, тогда как для «Раздела» или «Абзаца» это делать необходимо. Рассмотрим примеры кода, поясняющие вышесказанное.
MyDoc.Paragraphs(5).Range.InserAfte ''Привет'' — здесь в документ под именем «MyDoc» после 5-ãî абзаца вставляется текст «Привет».
MyDoc.Sentences(5).InserAfte ''Привет'' — текст вставляется после 5-ãî предложения
MyDoc.Words(5).InserAfte ''Привет'' — текст вставляется после 5-ãî слова.
MyDoc.Range(10,15).Bold = True — символы с 10 по 15 выделяются жирным шрифтом
Объект Range поддерживает основные методы, которыми пользуются при форматировании текста, в том числе такие как «Копировать», «Вставить», «Вырезать», команды меню «Формат».
Уделим внимание такому объекту как Font. Из названия становится понятно, что этот объект предназначен для работы с шрифтом. Этот объект содержит методы, находящиеся в панели меню «Формат/Шрифт». Посмотрите пример.
MyDoc Sentences(5).Font.ColorIndex wdDarkBlue
MyDoc Sentences(5).Font.Size = 24 — устанавливает в 5 предложении темно — голубой цвет шрифта размером 24 пункта.
Èç-çà òîãî, ÷òî Font является объектом, имеется возможность создать свой тип шрифта как отдельный объект и использовать его при форматировании части текста, как это сделано в следующем примере по отношению к 1 разделу активного документа.
Set myFont = New Font myFont.Bold = True
85
2. «Быстрое» программирование
myFont.Name = ''Arial'' ActiveDocument.Paragraphs(1).Range.Font = myFont
Для знакомства с примерами кодов целесообразно воспользоваться приемом, когда Вы форматируете часть документа в режиме записи макроса, а потом анализируете код макроса и редактируете его.
Предлагает Вам рассмотреть пример небольшой программки, которая позволяет провести разбор предложения (как это делают детишки младших классов). После нажатия кнопки «Старт» все слова в тексте приводятся к одному и тому же формату, и происходит выделение первого слова в тексте. Вам необходимо определить, к какой-части речи относится то или иное слово и нажать соответствующую кнопку. Если Вы не определились, то используется кнопка «Дальше». Для завершения работы используют «Финиш». Обращаем Ваше внимание, что это только пример, или основа для будущего теста. Сама программа находится в документе «Разбор предложения.doc». Откройте документ и поработайте с программой.
Познакомьтесь с кодом
Модуль «ThisDocument» — стандартный модуль для любого документа
Private Sub Document_Open() При открытии документа открывается
элемент управления «Форма»
UserForm1.Show
End Sub
Модуль «UserForm1» этот модуль вставлен при программировании
Public n As Integer, i As Integer |
Объявление двух общедоступных |
|
|
переменных (блок General) |
|
|
|
|
Private Sub CmdStart_Click() |
В этой процедуре при щелчке по |
|
|
кнопке «Старт» определяется общее |
|
n = Thisdocument.Words.Count |
||
число слов в документе n, и затем в |
||
|
||
For i = 1 To n |
||
цикле для каждого слова |
||
|
устанавливается «нормальный» шрифт |
|
Nomfont |
||
с помощью вызываемой процедуры |
||
|
||
Next |
||
nomfont. Затем указатель i |
||
i = 1 |
приравнивается 1, то есть к первому |
|
слову. Затем к этому слову |
||
|
||
Vidfont |
||
применяется процедура «выделенный» |
||
|
||
End Sub |
шрифт |
|
|
||
|
|
86
|
Применение VBA в редакторе Word |
|
|
|
|
|
|
|
Private Sub Cmdpodl_Click() |
Процедура при щелчке по кнопке |
|
With |
«Подлежащее» выделенное слово |
|
получает другой вид шрифта |
||
ActiveDocument.Words(i).Font |
||
(окрашивается в красный цвет и |
||
.Size = 12 |
||
убирается двойное подчеркивание). |
||
|
||
.ColorIndex = wdRed |
Затем в строке I = I + 1 происходит |
|
.Underline = wdUnderlineNone |
переход на следующее слово и оно |
|
«приобретает» «выделенный» шрифт |
||
End With |
||
|
||
i = i + 1 |
|
|
Vidfont |
|
|
End Sub |
|
|
Private Sub Cmdskaz_Click() |
Процедура для кнопки «Сказуемое». |
|
With |
Слово окрашивается в зеленый цвет. |
|
Далее, так же как и в предыдущей |
||
ActiveDocument.Words(i).Font |
||
процедуре |
||
|
||
.Size = 12 |
||
|
||
|
|
|
.ColorIndex = wdGreen |
|
|
|
|
|
.Underline = wdUnderlineNone |
|
|
|
|
|
End With |
|
|
|
|
|
i = i + 1 |
|
|
|
|
|
Vidfont |
|
|
|
|
|
End Sub |
|
|
|
|
|
Private Sub Cmnddal_Click() |
В этой процедуре (кнопка «Дальше») |
|
|
происходит переход к следующему |
|
Nomfont |
||
слову с соответствующими |
||
|
||
i = i + 1 |
||
изменениями шрифтов текущего и |
||
Vidfont |
следующего слова. |
|
|
||
|
|
|
End Sub |
|
|
|
|
|
Public Sub nomfont() |
Процедура для оформления слова |
|
|
«нормальным» шрифтом, то есть |
|
With |
||
размер — 12, цвет — черный, двойного |
||
ActiveDocument.Words(i).Font |
||
подчеркивания нет. |
||
|
||
.Size = 12 |
||
|
||
|
|
|
.ColorIndex = wdBlack |
|
|
|
|
|
.Underline = wdUnderlineNone |
|
|
|
|
|
End With |
|
|
|
|
|
End Sub |
|
|
|
|
|
|
|
87
2. «Быстрое» программирование
Public Sub vidfont() |
Процедура для оформления слова |
|
With |
«выделенным» шрифтом, то есть |
|
размер — 12, цвет — черный, двойное |
||
ActiveDocument.Words(i).Font |
||
подчеркивание. |
||
.Size = 12 |
||
|
||
.ColorIndex = wdBlack |
|
|
.Underline = wdUnderlineDouble |
|
|
End With |
|
|
End Sub |
|
|
Private Sub CmndEnd_Click() |
Процедура «Финиш» |
|
End |
|
|
End Sub |
|
|
|
|
88
3. Проекты на VBA
Анализ текста
Предварительные замечания
Особенность этого примера заключается в том, что он посвящен взаимодействию между собой двух различных приложений, в частности рабочей книги Excel и документа Word. При организации такого взаимодействия необходимо учитывать следующее:
1.Офисные приложения могут быть связаны между собой через команды меню. В частности, в приложении Word предусмотрена возможность слияния основного документа с базами данных, чтобы на основе созданного шаблона подготовить ряд однообразных документов (поздравительных открыток, приглашений), различа- ющихся между собой содержанием только в некоторых позициях (полях) текста. При этом в качестве источника данных могут быть не только базы данных, но и грамотно оформленная электронная таблица. И если аккуратно применять команды слияния, необходимость программирования отпадает.
2.Не следует, также, забывать о возможности передачи данных из одного приложения в другое через стандартный буфер обмена (Команды «Копировать», «Вырезать» и «Вставить»).
3.В электронной таблице, кроме того, имеется возможность установить связь с новой или существующей базой данных, чтобы по максимуму использовать те или иные преимущества различных приложений.
4.Объект PowerPoint может быть вставлен в электронную таблицу вручную и запускаться из этой таблицы двойным щелчком.
Перечисленный список нельзя считать исчерпанным, но он дает представления о возможности «ручного» объединения офисных приложений при решении различных задач.
Отметим также, что когда речь идет о программном оформлении взаимодействия приложений, то здесь скрывается ряд «ловушек» о которых необходимо знать и подумать, каких образом их избежать, или вообще отказаться от программирования некоторых операций. Основная проблема будет заключаться в сохранении и загрузке файлов, а конкретнее, в необходимости все время следить за местоположением «старых» и вновь создаваемых файлов. Если
89
3. Проекты на VBA
эти операции проделываются вручную, то вероятность ошибки или сбоя меньше, чем при работе программы. Вторая группа «ловушек» связана с различиями исходных кодов в разных версиях VBA. По-видимому, разработчики улучшают свои программы, а для пользователя это иногда может служить причиной головной боли. И конечно, неприятно, когда, программа, работавшая в Offiсe98, перестает работать в Office2000 (а еще хуже — просто в другой версии Office98). Но такие неприятности обычно возникают при использовании «непростых», мало разработанных кодов, которые и связаны с организацией взаимодействия различных приложений.
И, наконец, полезно знать, что существующие программы по обеспечению безопасности компьютера (антивирусные программы) могут в фоновом режиме запретить выполнение макросов или кодов, в которых находятся инструкции по открытию файлов
Программа для лингвистов
Но, тем не менее, есть задачи, которые требуют программирования. В качестве такой задачи рассмотрим пример, который представляет определенный интерес для лингвистов. Представим себе, что возникла необходимость, проанализировать в каком — либо тексте частоту, с которой встречаются те или иные буквы алфавита в качестве начальных букв слов. Другими словами, нужно подсчитать для каждой буквы алфавита сколько раз она стоит в начале слова.
Подобная задача может быть разбита на следующие этапы.
1.Ввод текста (набор, сканирование, копирование из других форматов и т. д.)
2.Анализ текста — просмотр каждого слова, выбор из него первой буквы и сохранение результата
3.Сортировка всех выбранных букв и проведение статистиче- ской обработки.
4.Табличное и графическое представление данных.
Вы уже наверно догадались, что первые два этапа успешно могут быть решены в Worde, а для реализации последующих двух необходима электронная таблица, и при переходе от 2 к 3-му этапу необходимо произвести передачу специфических данных (только начальных букв всех слов) от Worda к Excel.
90
