Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

VBA. Практическое программирование

.pdf
Скачиваний:
0
Добавлен:
12.08.2026
Размер:
666 Кб
Скачать

Создание собственного меню

проблема легко решается через опции Сервис/Параметры, или в самом проекте нужно поместить несколько строк, выполняемых перед закрытием проекта в которых восстанавливается строка состояния, строка формул, сетка и т. д.

Второе замечание, которое касается этого примера — данный файл является заготовкой для создания настоящего проекта и ряд команд в нем повторяется. Мы будем рассматривать лишь ту часть кода, которая необходима для понимания.

В отдельном самостоятельном модуле располагается особая процедура с именем 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