VBA для тех кто любит думать

         

Что такое API?


Для того, чтобы облегчить труд своих коллег и обеспечить всем программам для Windows универсальный интерфейс, программисты Microsoft создали такую вещь, как API - "Application Programming Interface".

Это - набор функций и процедур, которые могут наиболее часто использоваться программами: отображение дерева каталогов, поиск файлов, отображение стандартного окна с кнопками закрытия, минимизации и развертывания на весь экран и многих других. В итоге разработчик, создающий программу для Windows, не должен продумывать и разрабатывать специальные подпрограммы для отображения окна программы, окна для выбора папки и остальных подобных элементарных операций, - ему достаточно просто вызвать из библиотек kernel32.dll или user32.dll, содержащих функции и процедуры API, нужную ему функцию, а она уже все сделает за него сама. Таких функций и процедур много - порядка 600.

В операционной системе MS-DOS такого понятия, как API, не было, - тот, кто брался писать программу для этой операционной системы, обязан был сам, от начала до конца, продумать и реализовать способы выдачи на экран изображения, получения данных от пользователя, путешествия по файловой системе, рисования графики, если таковая возможность была необходимой[15]. Это делало процесс разработки программ с удобным для пользователя интерфейсом весьма трудоемким процессом, зачастую затраты времени и сил на создание приемлемого графического интерфейса программы превосходили затраты на реализацию собственного алгоритма программы, ради которого она и создавалась. Недаром были очень распространены так называемые "консольные" приложения, то есть программы, работающие только из командной строки, без интерфейса, - ввод данных происходил в той же командной строке или производился из указанного в ней файла, а вывод результатов шел в простом текстовом режиме.

С появлением операционной системы Windows каторжный труд программистов по разработке внешнего вида программы и удобных способов ввода и вывода информации резко облегчился, - уже в Windows 3.0 использовались функции API.
Теперь программист, если он, например, желал создать окно ввода текста или полосу прокрутки, должен был всего лишь написать вызов функции отображения такого окна с необходимыми ему параметрами, так же, как и любой другой функции языка, на котором он писал свою программу, а не вводить огромные обьемы кода ради создания программы, заново рисующей такое окно или полосу (сознавая при этом, что при разработке следующей программы, в которой тоже будут использоваться такие объекты, ему придется вновь разрабатывать такой код или пытаться частично использовать старый, приспосабливая его к нуждам этой новой программы). Поэтому появление API совершило революционный прорыв в технологии программирования, позволяя создавать нужные программы с привычным удобным интерфейсом гораздо быстрее, не заботясь о таких рутинных деталях, как программирование стандартных объектов интерфейса для ввода и вывода информации.

В языке Visual Basic for Applications (VBA) многие функции и процедуры API вызываются сами при выполнении программы интерпретатором, так что использовать их для отображения окон ввода и вывода текста, рисования на экране геометрических фигур и других простых действий совершенно нет необходимости, - их VBA вызывает по мере надобности, а программе на нем достаточно использовать соответствующие функции этого языка. Однако иногда возникает необходимость в некоторых действиях, для которых либо нет аналогов во встроенных функциях VBA, либо они работают нерационально или слишком медленно. Например, окно выбора папки с изображением дерева каталогов (рис.5.1) или программа поиска файлов (аналог на функциях VBA - объект "Application.FileSearch" - работает слишком медленно при больших количествах файлов). Для таких случаев в VBA предусмотрена возможность вызова функций API.

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



В подавляющем большинстве случаев при программировании для Office можно обойтись без использования API, но иногда только вызов API-функции может привести к достижению нужного результата. Скажем, вам надо обеспечить вызов разных макросов при простом нажатии мышью кнопки на какой-либо панели инструментов Word и в случае одновременного нажатия этой кнопки и клавиши Shift или Control. Вот фрагмент кода, делающего это:

Declare Function GetAsyncKeyState Lib "user32.dll" (ByVal kState As Long) As Integer

Sub Program()

GetAsyncKeyState (vbKeyShift Or vbKeyControl)

If GetAsyncKeyState(vbKeyShift) Then

Call macro1: Exit Sub

ElseIf GetAsyncKeyState(vbKeyControl) Then

Call macro2: Exit Sub

End If

Call macro3

End Sub



Первая строчка - это как бы "резервирование" функции API для использования в программе на VBA. Видно, что вызывается функция  GetAsyncKeyState из библиотеки (файла, содержащего программы, предназначенные только для использования другими программами) user32.dll, причем в эту функцию передается номер клавиши, а возвращает она целое число (а именно - 0, если клавиша с соответствующим номером не нажата, и -32767 или 1, если нажата). Любую функцию или процедуру, вызываемую из библиотек, не относящихся к VBA, необходимо так резервировать с помощью команды Declare.

Фраза vbKeyShift в команде - это заменитель кода клавиши Shift (его значение - 16), а vbKeyControl, как нетрудно понять - заменитель кода клавиши Control. Структура инструкций "If…Then", думается, ясна[16], а если нет - посмотрите в справке VBA. Команда Call перед именем макроса, как вы помните, означает его запуск.

В Интернете есть русские сайты, посвященные API[17]. Посетите их, чтобы узнать больше об этом наборе функций.

08_09.bmp

Рис. 8.9. Это окно вызывается функцией API.

Но помните, что программы, использующие функции API, в принципе не смогут быть мультиплатформенными, - об использовании их в Microsoft Office for Macintosh придется забыть.

*       *       *


Функция XOR


1 вход

2 вход

Результат

0

0

0

1

0

1

0

1

1

1

1

0

Иными словами, это некое подобие функции Или[18], которая в отличие от настоящей Или возвращает 0, если на входы было подано сразу две единицы.

А теперь - приглядитесь повнимательнее и обратите внимание на интереснейшую вещь: если на вход функции Xor подать значение 1 входа и результат, то получится значение 2-го входа! И то же самое - со значением 2 входа и результатом: получается значение 1-го входа. Следовательно, зная итог функции Xor и значение на любом из входов, можно получить значение на другом входе, то есть функция Xor обратима.

А отсюда вытекает и принцип парольного шифрования. Берем некий текст, который должен быть зашифрован и некое слово, служащее паролем. Любой текст - это последовательность букв-байтов, а любой байт равен восьми битам, что позволяет представить текст как последовательность битов - нулей и единиц:

11010101010110101001101010111110101010111110101010001…

Представляем так же пароль:

10010101010011

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

11010101010110101001101010111110101010111110101010001…

10010101010011100101010100111001010101001110010101010…

И теперь - шифруем: применяем к этим двум последовательностям функцию Xor:

01000000000101001100111110000111111111110000111111011…

Все - шифрование закончено! Полученную последовательность можно хранить в качестве зашифрованного паролем файла. Ну, а когда потребуется расшифровка, то будет необходимо просто применить ту же самую функцию Xor к этой последовательности вместе с паролем, и тогда в результате получится исходный текст. Преобразовать же последовательность нулей и единиц обратно в текст труда не составит.

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

Функция Xor, разумеется, присутствует и в VBA. Вот пример кода, реализующего возможности шифрования с ее помощью.

Sub encrypt()

Dim a, b, c, d As String

Исходный текст для шифрования - запрашивается от пользователя, к примеру:

a = "secret text from kgb agent from newyork rezidentura…"

Пароль: может запрашиваться от пользователя:

b = "password"

Итог шифрования:

c = ""

Узнаем длины каждой из строк - пароля и исходного текста:

lentext = Len(a)

lenpass = Len(b)

Собственно шифрование:

For cn = 1 To lentext

В этой строке попробуйте разобраться самостоятельно. Здесь выполняется функция Xor с каждым символом исходной строки и соответствующим символом пароля, как бы "повторенным" на всю длину исходного текста. Mid берет из середины строки символ, Asc - превращает его в ASCII-код, Str - превращает число в строку, Trim - удаляет пробелы:

 

d = Trim(Str(Asc(Mid(a, cn, 1)) Xor Asc(Mid(b, ((cn - 1) Mod lenpass) + 1, 1))))

А теперь сделаем так, чтобы каждый символ занимал ровно три позиции, вне зависимости от величины его ASCII-кода. А иначе как потом при расшифровке разбивать строку на символы?

 

Select Case Val(d)

Case 0 To 9

d = "00" + d

Case 10 To 99

d = "0" + d

End Select

c = c + d

Ну вот и все, и так - с каждым символом из исходной строки:

Next cn

Теперь в переменной с - шифрованная строка, каждой исходной букве соответствует 3 символа. Ее можно записать, например, в документ:

Selection.TypeText Text:=c



End Sub

 

А теперь - программа расшифровки данных. Точно так же разберем ее по строкам.

Sub decrypt()

Dim a, b, c, d As String

Строка для расшифровки:

c = "003004016001018027082016021025007083017029029009"

Пароль:

b = "password"

Итог расшифровывания:

a = ""

Узнаем длины каждой из строк:

lentext = Len(c)

lenpass = Len(b)

Собственно расшифровывание (попробуйте разобраться самостоятельно в структуре команды - это не так сложно):

 

For cn = 1 To lentext Step 3

a = a + Chr(Val(Mid(c, cn, 3)) Xor Asc(Mid(b, (Int(cn / 3) Mod lenpass) + 1, 1)))

Next cn

В итоге в переменной a - расшифрованная строка, ее можно записать в любое место - в документ, к примеру:

Selection.TypeText Text:=a

End Sub

 

Можно, конечно, еще добавлять в этот простой код всевозможные дополнения, например, функцию перевода строки цифр в строку символов, чтобы зашифрованный текст выглядел как бессмысленный набор букв. Но это - уже по желанию.

*       *       *


Хранение скрытой информации в документе


Иногда автору программы необходимо записать в документ информацию "для внутреннего пользования": например, чтобы при следующей обработке документа программой использовать определенные предыдущие данные.

Можно, конечно, использовать Свойства документа (объект "Dialogs(wdDialogFileSummaryInfo).Comments"), но лучше сделать такую запись с помощью добавления специальной переменной прямо в документ Word:

 

ActiveDocument.Variables.Add Name:="x1", Value:="Текст"

ActiveDocument.Variables.Add Name:="x2", Value:=12

Прочитать эти переменные можно будет с помощью похожей функции:

y1 = ActiveDocument.Variables("x1").Value

y2 = ActiveDocument.Variables("x2").Value

Кроме как с помощью этой функции, значения заданных в документе переменных узнать нельзя никак! Таким способом можно помещать в документ служебную информацию для макросов: сохраненные параметры, скрытые комментарии и и.д. Но не думайте, что для надежного сокрытия секретной информации достаточно поместить ее в переменные документа - с помощью функции

For Each per In ActiveDocument.Variables

Debug.Print per.Name + " " + per.Value

Next per

абсолютно все переменные будут благополучно помещены в окно отладки, где их легко и просто можно просмотреть.

*       *       *



Немного о паролировании и шифровании


Защита доступа с помощью пароля - самый распространенный способ хранения всяческих секретов на компьютере. Однако о принципах такой защиты большинству пользователей известно плохо. В чем же ее основы? И как можно преодолеть такую защиту?

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

Среди математических логических функций, таких, как И, Или и других, есть весьма примечательная функция Xor. Команда, выполняющая эту функцию, есть практически во всех языках программирования. Ее действие отражено в следующей таблице:



Открытый и закрытый коды


Наверняка все слышали такие фразы: "Шифрование с открытым ключом", "Шифрование с закрытым ключом", "Публичный ключ". О том, что они означают, можно писать большие книги, однако стоит вкратце описать ситуацию для полноты изложения. 

При шифровании с закрытым ключом для кодирования и расшифровки используется одна и та же последовательность символов в качестве пароля - ключа. Пример - тот, что описан выше. При шифровании же с открытым ключом используются две последовательности символов, причем зашифрованное с помощью первой последовательности можно расшифровать только с помощью второй, и наоборот. Обе последовательности связаны между собой по определенному закону, при этом из второй последовательности можно получить первую, но из первой вторую не узнаешь, - обратное преобразование невозможно.

Сгенерировав специальной программой пару таких последовательностей (называемых ключами), можно первую из них сообщить тому, от кого ждешь секретных посланий ("сообщить ему публичный ключ"), а вторую оставить себе и хранить как зеницу ока ("оставить себе секретный ключ"). То, что будет зашифровано отправителем этим публичным ключом, даже сам отправитель расшифровать не сможет. Это сможет сделать только обладатель секретного ключа.

Другое применение шифрования с открытым ключом - это электронная подпись, назначение которой - подтверждать неизменность электронного текста при пересылке или хранении. При ее использовании рассчитывается контрольная сумма (скажем, сумма всех кодов букв) сообщения, а затем она шифруется секретным ключом. Любой, у кого есть второй (публичный) ключ из этой пары, может расшифровать ее и, рассчитав самостоятельно контрольную сумму пришедшего сообщения, сравнить полученную величину с расшифрованной. При несовпадении этих двух величин можно думать о несанкционированном изменении текста сообщения в процессе пересылки.

Именно на таком принципе работает механизм шифрования PGP.

*       *       *

Ответы на вопросы


Эта книга написана по мотивам цикла статей "Начала программирования на VBA", публиковавшегося в журнале "Мир ПК" в 2000-2001 годы. После публикации статей цикла мне пришло немало писем с различными вопросами о программировании. Ниже представлены ответы на наиболее интересные из них.

1.

"В документе я хочу защитить от изменений пользователем только рисунок. Могу ли я это сделать? Метод Protect, похоже, этого сделать не дает."

Нет. Microsoft Word делать это не позволяет.

Впрочем, можно пойти на хитрость. Создайте документ Doc1.doc и вставьте в него рисунок. Затем сохраните документ с рисунком, задав ему пароли на открытие и на изменения. Создайте документ Doc2.doc. В том месте, где должен быть рисунок, вызовите окно Вставка-Обьект-Создание из файла и укажите в пути файл doc1.doc, отметив предварительно пункт "Связь с файлом". Введите пароль на открытие - и рисунок в Вашем документе. Сохраните его.

Теперь при открытии файла doc2.doc рисунок будет виден, но при попытке изменить его будет запрашиваться пароль на открытие файла doc1.doc. Проблема остается в том, что оба файла - и с рисунком, и с текстом - должны присутствовать, причем в тех местах, где они были изначально. То есть вся эта конструкция труднопереносима.

2.

"Возможно ли в Word проводить сравнение двух документов по словам..."

Да, разумеется. Откройте один из сравниваемых документов, выберите пункт меню "Сервис"-"Исправления"-"Сравнить версии" и выберите в открывшемся диалоговом окне второй файл для сравнения. Все разночтения будут выделены, в зависимости от их характера - зачеркиванием, цветом и др.

3.

"Как можно узнать количество страниц в Word2000  из макроса?"

С помощью команды

p = ActiveDocument.ComputeStatistics(wdStatisticPages)

где в переменную p запишется количество страниц в активном документе.

4.

"Сделал документацию на свою VBA-программу в Word 97 в doc-файле.


Включил в нее screenshot'ы, на которые наложил автофигуры Word - выноски, стрелки, скобки, надписи и проч., что разъясняло бы назначение частей рисунков. Теперь хочется поставлять документацию в формате HTML, но... при конвертации Word начисто игнорирует свои же автофигуры, оставляя в итоговых gif-файлах чистый рисунок. Как цивилизовано выйти из ситуации?"

Да, автофигуры Word97 при конвертации в HTML игнорируются. Для реализации желаемой Вами задачи выделите все автофигуры рисунка вместе с самим рисунком (инструментом "Выделение обьектов" панели "Рисование"), сгруппируйте их, вырежьте в Буфер обмена, а затем вставьте то, что в буфере, на то место, где был исходный рисунок, с помощью команды "Правка"-"Специальная вставка", используя в качестве формата вставляемого изображения "Точечный рисунок" или "Метафайл Windows", т.е. что угодно, кроме "рисунка MS Office". После этого у Вас в документе появится рисунок с всеми вставленными автофигурами, который, однако, спокойно конвертируется в GIF-формат при конвертации всего документа в HTML. Так следует поступить со всеми рисунками в документе. В Word2000 и Word2002 такой проблемы нет – там автофигуры сохраняются в самой генерируемой web-странице, но при просмотре ее в старых браузерах могут быть не видны.

5.

"Можно ли Word 2000 убрать автоматический запуск панели "Буфер обмена"?"

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

Макрос для полного скрытия панели:

Sub clipboard_hide()

CommandBars("Clipboard").Enabled = False

End Sub

Макрос для показа панели:

Sub clipboard_show()

CommandBars("Clipboard").Enabled = True

CommandBars("Clipboard").Visible = True

End Sub

Назначьте этим макросам кнопки и используйте их.



К счастью, в Word XP эта рекомендация уже неактуальна - там Область задач с вкладкой "Буфер обмена" вызывается только тогда, когда дважды нажата комбинация клавиш Ctrl+C.

6.

"Как определить с помощью макроса в документе Word текущий номер страницы, где произошло при поиске вхожение заданной подстроки."

Существуют функции Selection.Information(wdActiveEndPageNumber), которая возвращает номер страницы по счету, на которой располагается конец выделения, и функция Selection.Information(wdActiveEndAdjustedPageNumber), которая возвращает присвоенный номер страницы, на которой располагается выделенный фрагмент. Вторую функцию следует использовать тогда, когда необходимо получить тот номер страницы, который указан на ней непосредственно (т.е. с учетом ручных установок нумерации), а первую - если номер необходим абсолютный. Описание обеих команд можно получить в Справке VBA по слову Information.

При работе подпрограммы поиска каждое вхождение выделяется. Вот, к примеру, фрагмент кода макроса, который отображает в диалоговом окне номера страниц, на которых найден текст "text".

Selection.HomeKey Unit:=wdStory

Dim a As String

a = ""

Selection.Find.ClearFormatting

Selection.Find.Replacement.ClearFormatting

With Selection.Find

.Text = "text"

.Forward = True

.Wrap = wdFindStop

End With

While Selection.Find.Execute = True

a = a + " " + Str(Selection.Information(wdActiveEndPageNumber))

Wend

MsgBox a

7.

"Открыт документ Word, хочу запустить в нем макрос, который в свою очередь запускает макрос Excel, обрабатывающий Excel-таблицу. После этого через Clipboard из Excel макрос пересылает в Word-документ заданную прямоугольную область таблицы. Макрос Word обрабатывает эту область и начинает в требуемой последовательности копировать в Word-документ через Clipboard фрагменты Excel-таблицы. По окончании копирования Word закрывает все ненужные макросы, включая макрос Excel.


Как все это сделать, чтобы работало?"

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

Так, чтобы можно было из Word'ового макроса работать с Excel'ем, следует создать обьект Excel.Sheet (здесь "es" - простое наименование переменной, у вас может быть любым).

Dim es As Object

Set es = CreateObject("Excel.Sheet")

Если надо сразу открыть какой-либо файл Excel'а, то можно использовать команду GetObject:

Set es= GetObject("Путь к файлу Excel'а")

При желании можно сделать созданный обьект Excel видимым:

es.Application.Visible = True

Теперь можно этому обьекту es (т.е. просто запущенному Excel'у) посылать команды такие же, как и в макросах Excel'а  (предваряя текстом "es.Application." те из команд, которые не требуют прямого указания обьекта, - так как надо дать понять программе, что работа идет именно с Excel'ем). Так, чтобы открыть файл Excel'а, можно также дать команду

es.Application.Workbooks.Open FileName:="Путь к файлу Excel'а"

а чтобы, например, поместить в первую ячейку открытой книги текст, используйте команду

es.Cells(1, 1).Value = "Это столбец A, строка 1"

В принципе я бы вам посоветовал поместить тот макрос, который Вы планировали для Excel'а, именно в исходный Word'овый, переписав его команды в соответствии с принципом связывания (т.е. управления одним приложением из другого - так, как описано выше).

Закрыть Excel можно командой

es.Application.Quit

Set es= Nothing

Если работать с таблицей из Word почему-либо нельзя, и требуется именно вызвать Excel'евский макрос, то для вызова макроса следует использовать команду



es.Application.Run "имя макроса"

Также можно автоматически запустить какой- либо макрос при открытии файла Excel:

es.Application.Workbooks.Open FileName:="Путь к файлу Excel'а!имя макроса" (например, es.Application.Workbooks.Open FileName:="c:\book1.xls!macr1", точно так же, разделяя имя файла и имя макроса восклицательным знаком - и в команде Shell)

В общем, есть простор для творчества. Про работу из Word'а с Excel'ем и т.д. почитайте разделы Справки VBA (для Microsoft Office 97 - по-русски):  "Работа с приложениями", "Функция CreateObject", "Функция GetObject", "Программирование объектов".

8.

"Можно ли в Word при помощи гиперссылки вызвать команду меню, в частности команду "Найти"?"

Непосредственно с помощью гиперссылки - нет. Но можно поместить текст гиперссылки в элемент формы, который уже связать с макросом, вызывающим диалоговое окно. Для реализации данного способа необходимо вывести на экран панель инструментов "Элементы управления", включить кнопкой "Режим Конструктора", добавить элемент "Надпись", в меню правой кнопки мыши выбрать "Свойства", в разделе Caption поместить текст ссылки, оформить шрифт и цвет текста в соответствующем разделе Свойств, затем из меню правой кнопки мыши выбрать "Исходный текст", а в появившийся макрос вписать команду

Private Sub Label1_Click()

On Error Resume Next

Dialogs(wdDialogEditFind).Show

End Sub

или любые другие, какие пожелаете. После того, как Вы отключите Режим конструктора, созданная надпись с гиперссылкой будет работать так, как Вы желаете - при нажатии на нее вызовется окно поиска текста.

"Я сделал так, как Вы сказали, но при вводе в появляющееся окно поиска фрагмента, которого в тексте нет, не отображается сообщение о безрезультатности поиска - как при использовании непосредственно команды "Найти".


Можно ли сделать так, чтобы вызываемое окно работало точь-в-точь так же, как и обычное?"

К сожалению, с командой Dialogs… ничего сделать нельзя - так уж будет себя вести это диалоговое окно.

Однако можно использовать "финт ушами". В VBA есть функция SendKeys, которая передает активному окну нажатия клавиш - как если бы они были нажаты на клавиатуре. (Подробнее - смотрите в Справочной системе VBA.) Поэтому можно ее использовать:

Private Sub Label1_Click()

SendKeys "^f"

End Sub

предполагая, что комбинация клавиш Ctrl+f вызывает окно "Найти", как, впрочем, устанавливается по умолчанию. Список кодов функциональных клавиш - в Справке.

Если Вы используете функцию SendKeys, то вызванное ею окно будет вести себя абсолютно так же, как при ручном вызове. Однако помните, что если пользователь переопределит заложенную Вами в макрос комбинацию клавиш, то Ваша программа начнет работать некорректно.

*       *       *


Отличия новых версий Office


Отличия VBA в новых версиях Office в основном заключаются в добавлении новых функций, событий, процедур и объектов. Например, в Office 2000 появились события обьекта Application, позволяющие перехватить почти любое происходящее в документе событие. Так, событие "DocumentBeforeClose" выполняется перед закрытием документа, "DocumentBeforePrint" - перед его печатью, "WindowBeforeRightClick" - сразу после клика правой кнопкой мыши в окне программы, "WindowSelectionChange" - при изменении выделения, смещении точки ввода (за исключением простого ввода текста).

В Office2000 изменилась система защиты от вирусов в макросах. Так, в Word2000 для того, чтобы иметь возможность запускать макросы, необходимо, чтобы в диалоговом окне "Сервис - Макросы - Безопасность" был установлен "Средний" или "Низкий" уровень защиты от макросов (лучше "Средний" - тогда при открытии документов с макросами пользователю будет выдан запрос о необходимости разрешения исполнения макросов).

Также в Word2000 для того, чтобы пользователь имел возможность запускать макросы из шаблонов, установленных в папку автозагружаемых файлов Word, необходимо на вкладке "Надежные источники" диалогового окна "Сервис - Макросы - Безопасность" установить отметку в пункте "Доверять всем установленным надстройкам и шаблонам". Обо всем этом следует упомянуть в документации к разрабатываемой вами программе.

Рис.5.5. Если в OfficeXP вы хотите копировать и удалять файлы с помощью VBA – выключите здесь “Службу индексирования”.

">То же самое верно и для Office XP, однако отличия есть и здесь.

Во-первых, по умолчанию компоненты Office XP, отвечающие за запуск макросов, на жесткий диск не ставятся – таким образом, похоже, Microsoft пытается защитить наиболее неразумных пользователей от макровирусов. По большому счету, подобные ее действия обычно приносят больше вреда, чем пользы, для авторов же программ на VBA из этого следует, что в справочных файлах к своим программам им следует упоминать о необходимости доустановки компонентов Office перед началом использования макросов.


Во-вторых, для того, чтобы иметь возможность программно копировать модули и формы макросы между документами и шаблонами, необходимо, чтобы  в диалоговом окне "Сервис - Макросы - Безопасность", на вкладке "Надежные источники" имелась отметка в пункте “Доверять доступ к Visual Basic Project”. Об этом тоже следует упомянуть в справке к программе.

Из появившихся новых событий в Office XP можно отметить возможность отслеживать изменение размеров окна приложения (обработчиком события WindowSize).

В OfficeXP скопировать файл из одной папки в другую или удалить его посредством программного кода можно только при отключенной Службе индексирования (cсылка “Параметры поиска” на панели “Обычный поиск", рис.8.10). К сожалению, по умолчанию эта Служба включена, а программно ее отключить невозможно. Поэтому, несмотря на декларируемую "совместимость сверху вниз" версий Office, автору программ на VBA настоятельно рекомендуется тестировать свои программы во всех версиях Office и отлаживать их при необходимости.

08_10.bmp

Рис. 8.10. Если в OfficeXP вы хотите копировать и удалять файлы с помощью VBA

– выключите здесь "Службу индексирования".

Более подробно о новшествах в Visual Basic for Applications в новых версиях Microsoft Office читайте в разделах их Справочных систем, которые так и называются - "Whats New for Office Developers" и, для Word, "Whats New for Word Developers".

Опыт товарищей

*       *       *

О том, как создавать программы на встроенном в Microsoft Office языке программирования Visual Basic for Applications (VBA), было подробно рассказано в предыдущих главах. Но теория будет еще полезнее, если подкрепить ее практикой - примерами реально работающих программ, написанных на этом языке. А таких - немало. К сожалению, многие из них не такие уж и известные, но весьма интересные и полезные для очень многих пользователей.

В этой главе вы найдете небольшой обзор существующих на настоящее время программ на языке VBA, работающих в среде Microsoft Office.


Обратите внимание на них - если вы часто и много используете текстовый редактор Microsoft Word или другие компоненты Office, то они могут серьезно помочь вам в работе. Отличительная особенность большинства программ, описанных здесь – то, что они распространяются с открытым кодом. То есть – вы можете свободно просматривать текст программ, исследовать его, учиться на опыте ваших коллег, изучая код их программ и стремясь понять предназначение каждой строчки и каждой команды.

Не думайте, что изучение кода уже созданных программ как-то неправильно или незаконно. Вы тем самым служите распространению знаний на Земле (хотя бы и просвещаясь самостоятельно), а это - весьма благородная цель. К тому же и вашим коллегам это принесет пользу - их труд по написанию красивого и быстрого кода, помимо создания хорошей программы, еще и даст вам возможность стать умелым программистом.

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

"Untaco" - расшифровка чисел и их обновление

Довольно часто в бухгалтерской и финансовой документации вместе с цифровой записью числа требуется указывать и его текстовую расшифровку - например, писать "сто" после числа 100. Довольно ясно, что делать это вручную утомительно, да и небезопасно - можно легко ошибиться. И не случайно данный процесс весьма большое количество пользователей решило поручить макросам - программам на VBA. Дополнений для Word, помещающие в документ текстовые расшифровки чисел, создано немало.

Однако программа Untaco (рис.9.1) серьезно отличается от своих аналогов одной особенностью. Дело в том, что Untaco умеет автоматически обновлять те расшифровки, которые вставлены с ее помощью. Если после вставления расшифровки числа вы измените его значение, то расшифровка тоже соответственно изменится при сохранении, печати документа или вызове специальной команды, и вам не придется вставлять ее повторно.


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

Кроме того, параметры вставляемых с помощью Untaco расшифровок можно весьма широко настраивать (рис.9.2). Так, расшифровка может производиться на русском или украинском языках в именительном или дательном падеже, а также на английском языке, иметь вид наименования денежной единицы (поддерживается шесть их видов), простой текстовой расшифровки, а также количества процентов. В двух последних случаях расшифровываются и доли чисел вплоть до тысячных. Нетрудно научить программу помещать часть расшифровки или всю ее в скобки, делать ее первую букву заглавной. Компоненты программы могут копироваться в редактируемый документ, что позволит обеспечивать обновление расшифровок даже на компьютере, где Untaco не установлена.

09_01.bmp

Рис.9.1. Untaco - многофункциональный конвертор "число-текст" с возможностью автоматического обновления расшифровок чисел

09_02.bmp

Рис.9.2. Untaco. Отличается богатством настроек - от языка до скобок.

В Untaco реализованы интересные технические решения, связанные с ра-ботой с переменными в документе, закладками, интеллектуальной обработкой текстовых строк, а также с операциями над самими макросами (их копирование и удаление). Также в Untaco показано, как осуществить подмену стандартных команд Word (например, "Сохранить", "Печать") макрокомандами. Простой и удобный инсталлятор демонстрирует возможность помещения компонентов программ в шаблон Normal.dot.

Программа Untaco доступна с адресов: http://antorlov.chat.ru или http://www.newtech.ru/~orlov.

TreeView - кнопка "Пуск" для Microsoft Word

Те, кто часто и много работают с текстовым редактором Microsoft Word, наверняка хранят на своем жестком диске множество наработанных документов. Со временем их количество все увеличивается, растет обьем, множатся папки с файлами.


Ориентироваться в них становится все затруднительнее, и зачастую на поиск и открытие нужного файла уходит масса времени. Давно уже возникла необходимость в улучшении диалогового окна Word "Открыть…", так, чтобы можно было бы более свободно работать со своими документами. И вот, наконец, желания пользователей сбылись - появилась программа "TreeView".

Данная разработка способна серьезно облегчить труд тех, чей рабочий инструмент - Microsoft Office. Коротко можно сказать, что она - окно "Открыть файл", сделанное по образцу папки Internet Explorer'a "Избранное" (или меню Windows "Пуск"), - в виде выпадающего меню отображаются все документы в текущей папке и в любых других, указанных пользователем, что позволяет искать и открывать документы, не выходя из Word и не роясь в изрядно поднадоевшем окне Word "Открыть" (рис.9.3).

09_03.bmp

Рис.9.3. Меню программы TreeView.

После установки программы среди панелей Word появляются новые (рис.9.4).

09_04.bmp

Рис.9.4. Новые панели в Word.

На первой из них Вы увидите две кнопки, при нажатии на одну из которых появляется список документов в текущей папке, а при нажатии на другую - список документов в папке "Мои документы" (или назначенной вместо нее). Другая панель содержит кнопки с иерархической структурой каждого из логических дисков. Еще на одной панели изначально находятся кнопки, открывающие список файлов на рабочем столе и в папке "Мои документы" или ее заменяющей. Впоследствии эту панель хорошо использовать для добавления своих кнопок.

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

Программа может очень гибко настраиваться под желания пользователя. Так, можно создать любое необходимое Вам количество панелей, на которых разместить столько указывающих на папки кнопок, сколько вам нужно! Если у Вас на жестком диске есть двенадцать папок, где Вы храните свои документы, то можно создать панель с кнопками, соответствующими все этим двенадцати папкам, и получать доступ к их содержимому одним нажатием мыши, не роясь ни в окне открытия файла, и не активизируя "Проводник".


Вы также можете указать программе, файлы какого типа стоит отображать в выпадающих меню: ясно, что если в папке с документами хранятся еще и картинки, и звуковые файлы, то открыть их Word'ом не удастся, - а зачем тогда загромождать список файлов? Файлы разных типов могут отображаться в выпадающих меню разными значками, причем пользователь может сам выбрать, какими (рис.9.5).

09_05.bmp

Рис.9.5. Настройка панелей.

Обратите внимание, что выбор значков у пользователя TreeView гораздо больше, чем в окне настройки панелей Word: в выпадающем меню назначения значка представлены несколько десятков лучших значков, имеющихся в библиотеках Microsoft Office. Кроме того, можно настроить программу так, что, например, при выборе для открытия текстового файла она откроет его в программе "Блокнот" или задаст пользователю вопрос, в какой программе он желал бы этот файл открыть.

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

Программа имеет двуязычный интерфейс и работает как в русских, так и в английских версиях Microsoft Word 2000 и Microsoft Word 97. Имеется удобный инсталлятор, причем для установки программы даже не нужно выходить из Word или перезагружать его. Эта разработка поставляется с открытым исходным кодом, так что любой пользователь, интересующийся программированием на VBA, может его просмотреть и насладиться программистским мастерством автора этой программы.

Данная разработка заняла призовое место на конкурсе Microsoft Office Extensions за ноябрь 1999 года. Кроме того, она имеет Знак Качества "Yes, It's Works" от Тестовой лаборатории журнала PC Magazine, а также знак "User's Choice" от сервера программ Listsoft (www.listsoft.ru). Программа распространяется бесплатно.



В целом можно сказать, что эта программа будет настоящей находкой для тех, кто много и часто работает в Word и имеет сложную и разветвленную структуру папок со своими файлами, в которых не так-то и просто разобраться. Радует большое количество возможных настроек - программу можно настроить практически на любой вкус: разместить кнопки вызова меню с файлами там, где нужно пользователю, задать режимы отображения только файлов с определенными расширениями, заранее назначить кнопкам определенные папки. Вместе с тем стоит посетовать на чрезмерную сложность кода и большой обьем программы - она состоит из двух компонентов (устанавливающихся автоматически) общим обьемом в 250 килобайт и на не очень быстрых компьютерах может несколько замедлить загрузку Word.

В программе реализованы такие функции, как обращение к командам API для поиска файлов, динамическое изменение содержимого панелей инструментов и выпадающих меню, работа с реестром, работа с изменяемым автозагружаемым шаблоном. Если вас интересует, как можно сделать все вышеизложенное - поучитесь на наглядном примере.

Автор "TreeView" - Антонюк Дмитрий Александрович, г.Комсомольск-на Амуре.

Программу можно загрузить с адреса http://treeview.chat.ru.

SuperTypist - набиратель текстов

Небольшая программа SuperTypist, созданная Константином Ушаковым, предназначена для быстрого и удобного набора текстов. Для работы с программой сначала нужно создать небольшой словарь с теми словами, которые, по Вашему желанию, должны набираться автоматически (о том, как создавать этот словарь и куда его потом помещать, написано в инструкции к программе). Когда же вы начнете набирать какое-нибудь слово из словаря, макрос автоматически подставит его окончание, как только это слово будет однозначно определено (рис.9.6). Если вы желаете набрать другое слово, начинающееся с тех же букв, что и записанное в словаре, то просто продолжайте набор, и подставленное слово исчезнет. А если вы согласны с макросом, то нажмите стрелку влево, и курсор автоматически перейдет к концу вставленного слова.



09_06.bmp

Рис.9.6.Все умеют макросы... Даже текст за вас набирать. Вот только сочинять его еще не научились.

Изучение SuperTypist будет полезно при необходимости обеспечить работу программы с файлами, а также переназначить клавиши, - для выполнения своих функций SuperTypist делает так, что программа, проверяющая наличие набираемого слова в словаре и помещающая его в документ срабатывает каждый раз, когда на клавиатуре нажимается какая-либо буквенная клавиша.

Загрузить SuperTypist можно из Библиотеки Microsoft Office Extensions, расположенной по адресу http://www.microsoft.ru/offext. (Подробный рассказ об этой Библиотеке смотрите в конце статьи.)

ВерсткаТекстаКнижкой - книгоиздательство в Word

Иногда при подготовке документов в Microsoft Word возникает необходимость распечатать их в виде книжки размером в половину листа, так, чтобы после печати ее можно было бы сшить посередине. Такую книжку удобно взять с собой, да и просто читать, а для учебных материалов подобный вид был бы самым удобным. Зачастую методические пособия в высших учебных заведениях выпускаются именно в таком формате.

До недавнего времени стандартными средствами Word сделать такую книжку было невозможно. Многие пользователи прибегали к различным ухищрениям (к примеру, устанавливая "зеркальные" поля в полстраницы и пропуская каждый лист через принтер четыре раза) или пытались освоить специализированные программы верстки вроде PageMaker'а. В любом случае создание брошюры было весьма непростой задачей. В OfficeXP возможность делать брошюры появилась, однако просмотреть макет перед печатью и вывести на принтер его отдельные листы невозможно, так что при сбое принтера приходится перепечатывать весь макет заново. Кроме того, системные требования данного пакета программ весьма немалые.

Но книжку можно спокойно сделать в Word любой версии, начиная с 97-го, с помощью программы, написанной специально для этого и называющейся просто - "ВерсткаТекстаКнижкой". Она использует довольно оригинальный способ создания макета книжки, в качестве основы для него взяв надписи - обьекты Microsoft Word, способные содержать в себе текст.


Надписи могут быть между собою связаны, и текст, вводимый в одну из них, при исчерпании свободного места в ней перетечет в другую, следующую по порядку связывания надпись. Эта возможность и используется в программе, которая заполняет макет книжки связанными надписями, соответствующими ее отдельным страничкам, а затем копирует в них текст из исходного документа. В результате получается макет книжки, готовый к печати (рис.9.7), который в случае необходимости можно спокойно редактировать, а при сбое в процессе печати нетрудно перепечатать любой лист макета. Макет составлен так, что каждый второй лист в нем является обратной стороной первого, поэтому на принтере с двусторонней печатью получить готовую книжку можно, просто послав на печать документ со сверстанным макетом. На обычных принтерах необходимо посылать на печать вначале нечетные, а затем четные страницы макета (для автоматизации данного процесса служит специальный макрос, входящий в комплект поставки программы). При необходимости макет книжки можно перенести для печати на другой компьютер, где данная программа не установлена.

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

Исходный документ при работе макроса не изменяется. В тексте могут содержаться графические обьекты, сноски, диаграммы, которые автоматически переносятся в макет книжки.

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


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

Также в комплект поставки входит программа "Файлообьединялка", которая поможет вам обьединить содержимое множества однотипных файлов в один.

Разумеется, у программы есть и недостатки, в основном обусловленные ограничениями Word в плане работы с надписями. Так, при наличии в исходном документе таблиц процесс верстки брошюры серьезно затрудняется, так как ширину таблиц приходится подгонять под ширину полученных страничек. Иногда при попадании таблицы на границу страничек пара ее строчек, примыкающих к этой границе, перестают отображаться (следствие ошибки в самом Word'е) - приходится принудительно разбивать таблицу. В случае наличия в исходном документе рисунков зачастую необходимо неоднократно переверстывать макет заново (впрочем, это нетрудно благодаря входящей в комплект дополнительной утилите), подбирая нужный размер рисунка, - программа их не масштабирует. Впрочем, данные проблемы возникают лишь при работе со сложными документами, содержащими большое количество таблиц и графики.

 

09_07.bmp

Рис.9.7. Сделать книгу в Word теперь не проблема. Вот написать бы еще ее сначала

Ознакомиться с кодом компонентов пакета программ "ВерсткаТекстаКнижкой" рекомендуется всем, кто интересуется возможностями VBA по работе с содержимым документа, пользовательскими формами. Также весьма примечателен инсталлятор программы, который нетрудно приспособить для установки собственных разработок.

"ВерсткуТекстаКнижкой" можно загрузить с адресов: http://antorlov.chat.ru или http://www.newtech.ru/~orlov.

Красоты из глубин Word

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


Гибкая система настройки панелей и меню в Microsoft Word дает возможность это сделать весьма неплохо. Однако при добавлении новых команд на панели инструментов часто хочется присвоить командам красочные значки, отличающиеся от однообразных стандартных. Но набор значков, предоставляемый Word'ом по умолчанию в выпадающем списке выбора иконки для кнопки, не больно-то и велик...

 09_08.bmp

Рис.9.8. И все это хранит в себе Word

Эту проблему успешно решает программа "Генератор иконок". Впрочем, вернее ее бы можно было бы назвать "Вытаскиватель иконок". Дело в том, что Microsoft Office содержит в себе, в своих исполняемых файлах и библиотеках около 3000 значков. Эти значки по умолчанию назначены разным командам, большую часть которых обычный пользователь никогда не вызывает по причине ненадобности или отсутствия информации о них. Но это не значит, что значки для этих команд нельзя использовать для своих целей! Icon Generator извлечет из "недр" Word'а эти значки, разместив их на специально созданных панелях инструментов (рис.9.8), так что вам останется лишь скопировать их на свои панели с помощью стандартной функции "Копировать значок" режима настройки панелей. Пусть ваш Word расцветится красивыми иконками!

Если Вы разрабатываете макросы для Word, то эта программа облегчит Вам жизнь - Вы сможете назначить своим макросам оригинальные иконки, не тратя время на их рисование. В шаблоне с макросом также имеется готовая подборка специально отобранных красивых значков.

Программу "Генератор иконок" можно загрузить с адресов http://antorlov.chat.ru/develop.htm или http://www.newtech.ru/~orlov/develop.htm.

Создай свой каталог

Если вы уже запутались в множестве документов и файлов на вашем жестком диске или разрабатываете web-сайт с большим количеством однотипных компонентов, то эта программа - для вас! Вы также ее оцените, если захотите собрать смотреть ваши любимые графические файлы, открыв всего лишь один файл.



Пакет программ "Каталогизатор", доступный с адреса http://antorlov.nm.ru/catalog.htm или http://www.newtech.ru/~orlov/catalog.htm, состоит из двух компонентов: собственно программы Каталогизатор и программы КаталогКартинок.

Программа Каталогизатор вставляет в документ, открытый в Word, список из гиперссылок на все или какие-либо определенные файлы в заданной пользователем папке (рис.9.9). Имеется возможность сортировать файлы при такой каталогизации, а также вставлять после каждой ссылки на картинку в формате Gif или Jpeg эту самую картинку.

09_09.bmp

Рис.9.9. Эффективная работа - это мощный компьютер плюс порядок на жестком диске. А "Каталогизатор" поможет вам его обеспечить.

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

Программа КаталогКартинок создает web-страничку, содержащую ссылки на все или какие-либо определенные файлы в какой-либо директории, при этом рядом с каждой ссылкой на картинку в формате Gif или Jpeg вставляется ее изображение. Получается нечто вроде картинной галереи на странице (рис.9.10). Пользователь может во многом определить внешний вид будущей web-странички с картинками: указать, какие имена указывать в ссылках - с включением полного пути к файлу или без него, выбрать, где располагать ссылки на файлы - снизу, сверху или сбоку от картинок.

09_10.bmp

Рис.9.10. Картинная галерея. Сиди, жми Space, любуйся....

Макрокоманда не использует встроенный в Word конвертор HTML, а пишет html-код сама, так что недостатки стандартного Word'овского HTML-конвертора, такие, как большой размер кода, лишние тэги, проявляться не будут.

Программа "Каталогизатор" может быть крайне полезной для обеспечения более удобной работы со своими файлами, а также при создании сайта, состоящего из множества страниц, - с ее помощью будет очень удобно сделать, к примеру, карту сайта.



Для студентов и программистов

Пакет макросов, который называется очень просто - "Дополнения для Word", создан Петром Каньковски и доступен с адреса http://kankowski.narod.ru. Основное его предназначение - расширение возможностей пользователя Word, в особенности в плане составления документов, удовлетворяющих требованиям современных научных издательств и ВУЗов. Так, в комплекте пакета есть шаблоны "Реферат", "Заявление", позволяющие быстро оформить соответствующий документ, а параметры основного шаблона программы во многом соответствуют российским требованиям к оформлению научных публикаций. При установке программы большому расширению подвергается список автозамены - после установки пакета в него добавляются многие сокращения, позволяющие серьезно сэкономить время при наборе текста  (например, "док-т" заменяется на "документ", "эл-т" - на "элемент"), в Word добавляются новые полезные функции (рис.9.11).

09_11.bmp

Рис.9.11. Дополнения для Word.

"Дополнения для Word", а также другие разработки Петра Каньковски особенно заинтересуют тех, кто создает программы на VBA, так как все они поставляются с открытым исходным кодом и подробными комментариями в нем. Особенно примечательны специальные компоненты для разработчиков, доступные так же с сайта Петра - "Пакет для разработчиков" и "Ice In Eyes" (рис.9.12 - доступен со страницы http://kankowski.narod.ru/dev.htm). Помимо действительно полезных макросов, например, набора математических функций, и коллекции красивых значков, программисты на VBA найдут в этих разработках и коды функций работы из VBA с API - программным интерфейсом Windows, позволяющие отображать диалоговые окна Windows, вызывать команды операционной системы. Одна из разработок представляет собой HTML-конвертор, позволяющий эффективно и качественно преобразовать файл Excel в web-страницу. Этот конвертор в отличие от встроенных в Office средств сохранения данных в формате HTML генерирует компактный и корректный код.



09_12.bmp

Рис.9.12. Ice In Eyes. Все для программиста.

Весьма примечательным является "Справка" к пакету, содержащая, помимо его описания, еще и обширную подборку советов по работе с Word. С "Дополнениями…" поставляется методическое пособие "Как написать реферат", которое может помочь студентам в учебной работе с излишне строгими преподавателями. К сожалению, у пакета есть мелкие дефекты интерфейса, однако они не умаляют его достоинств и не мешают с ним работать.

На сайте Петра есть подборка ссылок на Интернет-ресурсы, посвященные VBA, а также сборник полезных советов по работе с Word и использованию API.

WOPR - Woody's Office Portal

WORP, или Woody's Office Portal - это большой и мощный пакет макросов, выполняющих самые разнообразные задачи, - от предоставления пользователю усовершенствованных диалоговых окон сохранения и открытия файлов до создания и печати конвертов или буклетов. С помощью компонентов WORP можно вставить в документ зеркальное отображение любого его фрагмента, свободно изменять даты создания и изменения файлов, удобно настраивать параметры вставляемых рисунков. WORP поможет пользователю в восстановлении поврежденных документов Word или в управлении стилями.

Сайт программы расположен по адресу http://www.wopr.com. Основная версия программы работает под Word 97, однако на сайте есть модули, использующие возможности новых версий Word. К сожалению, по умолчанию код WORP закрыт от просмотра, однако вам может помочь решить эту проблему упоминаемая в прошлой главе бесплатная версия программы AVPR с сайта www.passwords.ru. Программа распространяется по принципу Shareware, а объем установочного файла превышает три мегабайта.

Библиотека макросов

В Интернете есть целый сайт, посвященный программам на VBA. Это - неоднократно уже упомянутая Библиотека Microsoft Office Extensions - http://www.microsoft.ru/offext (рис.9.13). Там представлены макросы на любой вкус: и для набора текстов, и для бухгалтерской работы, и даже игры.


На сайте программы Microsoft Office Extensions есть также специальный раздел "VBA-форум", в ко-тором публикуются статьи специалистов по VBA как для начинающих, так и для опытных разработчиков.

09_13.bmp

Рис.9.13. Библиотека макросов. Единственная в своем роде...

Всем программам, помещаемым в Библиотеку Microsoft Office Extensions, выдается специальный Знак Качества "Yes, Its Works" (рис.9.14). Его можно размещать на сайте программы, на коробках с дистрибутивом, в общем, где угодно! Так что если вы хотите, чтобы ваша программа имела престижную оценку от Тестовой лаборатории PC Magazine - обязательно отправьте ее в Библиотеку.

09_14.bmp

Рис.9.14. Пусть этот Знак Качества будет и вашим! Отправьте свою программу в Библиотеку Microsoft Office Extensions и получите его.

Но самое главное - если вы отправите в Библиотеку свою программу, то у вас появится шанс получить приз за нее, если ваше творение будет признано наилучшим. На сайте Microsoft Office Extensions проводится конкурс на лучшую разработку для Microsoft Office, и победителям этого конкурса выдаются вполне реальные призы, например, персональный компьютер или клавиатура с оптической мышью. Условия получения призов представлены на сайте конкурса. Фактически конкурс Microsoft Office Extensions на настоящее время является единственным местом в Сети, где разработчики бесплатных программ могут получить достойное вознаграждение за свой труд.

Когда вы наконец-то решите представить свою разработку на конкурс, то для начала посетите страницу http://www.microsoft.ru/offext/rules и загрузите с нее Лицензионное соглашение и Анкету разработчика, которые вам необходимо заполнить. Вы можете свободно изменять Лицензионное соглашение так, как вам заблагорассудится, но в Анкете должны указать точные данные. Помните, что оба этих документа будут распространяться вместе с вашей разработкой, так что не указывайте там слишком конфиденциальных данных.

Затем поместите вашу разработку, а также Анкету и Лицензионное соглашение в архив формата Zip и отошлите его в виде аттачмента по адресу offext@microsoft.com.


В течение 24 часов вам должно придти потверждение получения вашей разработки, отправляемое автоматически. Если оно не пришло, то повторите отправку - видно, почтовые серверы сработали с ошибками.

Требования к представляемым программам немногочисленные и вполне разумные. Во-первых, программа должна работать в русской версии Microsoft Office XP. Во-вторых, она не должна повреждать какие-либо файлы системы или пользователя, не должна вызывать зависание системы.

Однако есть также и Пожелания Тестовой лаборатории PC Magazine разработчикам. Если представляемая программа им соответствует, то это повышает ее шансы на выигрыш в конкурсе.  И вот какие это пожелания:

•   Во-первых, программа должна хорошо выполнять свою функцию и работать программа должна надежно - не допускать непредсказуемости своего функционирования даже в случае не совсем адекватной работы самого Office.

•   Во-вторых, программа должна работать корректно - то есть не допускать потери данных пользователя. Так, если программа не предназначена для изменения параметров текста, то она и не должна их менять.  Кроме того, она должна уметь обрабатывать все возможные начальные условия, а не только те, которые счел нужным задать программист - то есть быть гибкой. Скажем, если в программе необходимо ввести номер телефона, то она должна позволять вводить столько цифр, сколько надо, а не 7 или 5.

•   В-третьих, желательно, чтобы разработка имела удобный интерфейс и подробную документацию на русском языке.

•   В-четвертых, программа должна работать наиболее простым способом. Так, для вычисления значения числового выражения в Word не стоит вызывать Microsoft Excel, - для этого есть как встроенные функции самого Word, так и команды VBA.

•   В-пятых, желательно наличие программы установки и удаления разработки, если это, конечно, необходимо. Крайне желательно, чтобы разработка предоставляла возможность как автоматической установки, так и ручной.

•   И, в-шестых, весьма желательно, чтобы разработка поставлялась с кодом, не закрытым от просмотра паролем.


Во всяком случае, доверия тогда к разработчику будет больше, а значит, и вероятность получить приз выше.

На сайте Microsoft есть Форум для разработчиков программ на VBA - (http://www.microsoft.ru/offext/officedev/newsgroup. Посетите его, если желаете получить ответ на какой-нибудь вопрос или, наоборот, поделиться своими наработками с сетевым сообществом.

*       *       *

Конечно, в этом кратком обзоре нельзя рассказать обо всех созданных к настоящему времени макросах. Однако и описанные здесь программы серьезно помогут вам в работе. А если вы все же решите начать самостоятельно писать программы на Visual Basic for Applications, то, поисследовав макросы из этого обзора, вы узнаете очень много полезного... А, научившись программировать на этом языке, вы можете даже выиграть приз!

Удачи вам в работе - и в программировании!

Напутствие

*       *       *

Создавая программы для Microsoft Office, вы сможете на опыте получить представление практически обо всех современных принципах программирования: как структурных - основанных на последовательном выполнении всех команд программы, так и "событийных", согласно которым программа должна реагировать соответствующим образом на различные действия пользователя. В современном программировании используются оба этих принципа: интерфейс программ построен по принципу реакции на события, а функции, выполняемые программой - по принципу независимой работы. Например, графический редактор Paint, да и тот же текстовый процессор Word в большей своей части являются приложениями, управляемыми событиями - действиями пользователя; а, скажем, программы дефрагментации или проверки диска работают почти независимо от пользователя, он только должен задать им начальные параметры. В Visual Basic for Applications можно писать как программы, управляемые событиями (посредством разработки форм), так и работающие последовательно и независимо (используя только модули), а также, разумеется, и приложения, сочетающие в себе оба этих принципа.

Visual Basic for Applications может служить не только полноценной средой разработки приложений, работающих в Microsoft Office, но и как бы "учебным центром" по освоению принципов и различных приемов современного программирования.


Работа с системным реестром, с файловой системой и даже со встроенными в Windows функциями программирования API, - все это вы сможете изучить на опыте, используя Visual Basic for Applications, причем сделать это Вам будет значительно легче, чем если бы вы сразу начали учиться программировать на Delphi или Visual Basic for Windows. Средство записи макросов, возможность легкого анализа уже написанных программ (так как фактически любая программа на Visual Basic for Applications распространяется вместе со своим исходным текстом), русский интерфейс редактора, большая и четко написанная справка, обилие примеров, - все это очень помогает в освоении этого языка и делает возможным его самостоятельное изучение - даже без использования дополнительной литературы. Другие языки программирования так освоить практически невозможно. Кроме того, редактор Visual Basic for Applications обладает большими возможностями по коррекции ошибок, и поэтому программа на этом языке вряд ли вызовет ошибку системы и необходимость перезагрузки, если только не увлекаться вызовом функций API.

Если Вы научитесь программировать на Visual Basic for Applications, поймете принципы разработки алгоритмов и основные приемы программирования, освоите среду написания программ - редактор Visual Basic for Applications, то для Вас практически не составит труда начать создавать программы на Visual Basic for Windows. У этого языка абсолютно такой же синтаксис, такая же среда разработки с контекстной справкой и пошаговыми подсказками, на первый взгляд он отличается от Visual Basic for Applications разве что набором доступных встроенных процедур и функций и отсутствием возможности записи макросов. Безусловно, есть и более глубокие различия, но при создании не очень сложных программ они не будут иметь большого значения. Вы сможете легко освоить средство разработки программ Delphi, однако логика языка Pascal, лежащего в основе Delphi, несколько отличается от логики Visual Basic. Однако и среда разработки, и общие принципы программирования в Delphi те же.


Несколько труднее будет освоить C++ и его производные из-за серьезно отличающегося синтаксиса и высокой сложности этого языка, но это не всегда необходимо, - подавляющее большинство проектов программ можно реализовать на Visual Basic или Delphi.

*       *       *

Среди тех, кто занимается программированием уже много лет и достиг в этом деле определенных высот, весьма распространено мнение, что Visual Basic for Applications, да и просто Visual Basic - языки, на которых нельзя создать быстро и хорошо работающие программы. В определенной степени это соответствует действительности: программы на Visual Basic обычно работают несколько медленнее и занимают больше места, чем аналогичные им программы на С++, на Visual Basic весьма проблематично решение некоторых программистских задач и приемов. Поэтому профессиональные программисты часто считают, что Visual Basic - язык для дилетантов в программировании, а любой уважающий себя специалист в области информационных технологий обязан знать и использовать такие языки, как С++ или ассемблер. Но не следует забывать, что изначальное предназначение компьютерных технологий - помощь человеку в обработке и создании информации, а отнюдь не "служение самим себе", своему дальнейшему развитию. Поэтому основная функция большинства компьютерных программ - получение нужного результата, обработка вводимой информации, например, анализ электрокардиограммы или расчет траектории космической ракеты, а быстродействие, малый размер, да и удобство интерфейса - всего лишь их хорошие свойства, которые могут серьезно облегчить работу с программой.

Бесспорно, в настоящее время крупные программные комплексы делаются не в одиночку. Специалисты в какой-либо области пишут подробное техническое задание, а программисты его реализовывают. Однако в любой области человеческой деятельности есть множество задач, для решения которых привлекать сторонние коллективы слишком затратно. И вот тут-то и приходят на помощь легкие в освоении, но богатые возможностями языки программирования - Visual Basic, VBA, Delphi.


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

На вопрос: "Какой язык программирования лучше всего?" стоит отвечать так: "Тот, на котором ты можешь лучше всего писать программы и реализовывать свои проекты." Проще всего освоить Visual Basic и Delphi. И поэтому не стоит так уж стремиться обязательно знать ассемблер, выучить все функции API и жалеть, что не можешь вводить программы сразу в машинных кодах, - лучше повнимательнее изучить более простой язык даже вроде того же Visual Basic for Applications для того, чтобы уметь использовать все его возможности для воплощения своих пожеланий в жизнь. Ну, а если кто желает посвятить свою жизнь информационным технологиям, создавать новые языки общения с компьютером, то тому знание Visual Basic никогда не помешает, а остальные знания, как говорится, дело наживное, - надо лишь начать учиться и освоить общие принципы.

Не стоит думать, что "программирование мне никогда не понадобится" - современные компьютерные технологии развиваются с огромной быстротой, и скоро практически любая область человеческой деятельности будет компьютеризирована. А чтобы получить в своей работе наилучший результат, нужно уметь приспособить орудие труда - компьютер - под свои нужды, то есть - программировать.

*       *       *

И, наконец, стоит сказать об использовании программирования на Visual Basic for Applications в процессе обучения в школе, институте, да и в самостоятельном образовании. Даже если человек не желает посвятить свою жизнь информационным технологиям, умение программировать ему всегда пригодится, так как использование возможностей компьютеров сейчас возможно практически в любой области человеческой деятельности. Но главное - это то, что обучение искусству составления программ на собственном опыте, путем самостоятельного исследования возможностей языка и среды разработки является одним из наилучших способов научиться так называемому "научному мышлению", тому подходу к различным явлениям окружающего мира, на котором стоит вся современная наука.


Самостоятельно обучаясь использованию Visual Basic for Applications, можно как бы на маленькой модели испробовать почти все исследовательские приемы, которые используются современной наукой, - и наблюдение, и анализ результатов, и эксперимент… Например, вынесение из записанного макроса неизвестной команды в отдельную процедуру для выяснения ее функции, - чем не эксперимент в контролируемых условиях? Или изменение параметров команды с целью узнать, к чему это приведет, - разве не так действуют исследователи, изменяя начальные условия эксперимента?

Так что изучение Visual Basic for Applications может стать целым "научным исследованием", в течение которого можно будет отработать основные приемы современного научного подхода.

*       *       *

Напоследок хотелось бы пожелать всем, кого заинтересовала информация данной книги, успехов на пути познания секретов VBA, - этого простого, но в то же время удивительно богатого возможностями языка, созданного стараниями сотен зачастую безвестных программистов. И пусть вершины мастерства не будут для вас недосягаемыми. Впрочем, это уже как раз от вас и зависит.

Удачи!

Орлов Антон Александрович,

2002 г.

Адрес сайта: http://antorlov.chat.ru или http://www.newtech.ru/~orlov

Приложение 1

Игры с Office

Эта небольшая глава непосредственно не относится к теме книги. Она скорее представляет собой дополнение к ней и посвящена ни чему иному, как играм, скрытым в недрах Office. Разумеется, они встроены туда неофициально – это, скорее, развлечение разрабатывавших Office программистов. Имеются эти игры во всех версиях Office, начиная с 95-го. Наиболее богата на игры программа Excel, хотя и Word иной раз не отстает.

Поскольку игры "неофициальные", то, естественно, и кнопок или команд, их вызывающих, в Microsoft Office не найти. Для запуска игр служат определенные последовательности действий, выполнить которые случайно практически невозможно. Как же они стали известными? Да очень просто - со слов тех, кто эти игры и писал.


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

 

Doom в Excel 95

 

В Excel 95 встроена игра наподобие Doom'а. Для ее вызова надо сделать следующее:

1. Открыть Excel c чистой книгой.

2. Прокрутить лист (мышью или клавишами) до строки с номером 95.

3. Выделить всю 95-ю строку, кликнув мышью на номере строки в служебной колонке слева.

4. Нажать клавишу Tab.

5. Открыть меню "Help - About Microsoft Excel" (в англоязычных версиях) или "? - О программе" (в русской версии).

6. Удерживая одновременно клавиши Ctrl, Alt и Shift, кликнуть мышью на кнопке "Technical Support" ("Техническая поддержка").

После этого откроется небольшое окно (рис.11.1), в котором и запустится игра. Передвигаться по залу (он называется "Hall of Tortured Souls" - "Зал Измученных Душ", наверное, назван так из-за творческих мук программистов, создавших Excel) можно с помощью курсорных клавиш. Поднявшись по лестнице, проход на которую виден в конце зала, можно прочитать имена разработчиков Excel'а, бегущие на вделанном в стену экране.

11_01.bmp

Рис. 11.1. Вход в "Зал Измученных Душ".

Если же перед обратным спуском с лестницы в "Зал Измученных Душ" (рис..11.2) ввести (без кавычек) с клавиатуры слово "excelkfa" (любители "Doom'а" наверняка сразу вспомнят другую знакомую комбинацию), то стена, противоположная той, в которой находится вход на лестницу, упадет, и взгляду предстанет дорога над пропастью (рис.11.3).



11_02.bmp

Рис. 11.2. "Зал Измученных Душ". Лестница звезд.

11_03.bmp

Рис. 11.3. "Зал Измученных Душ". Дорога над пропастью.

Пройдя по ней (это нелегко), можно дойти до стены, оклеенной фотографиями разработчиков Excel'а (рис.11.4).

11_04.bmp

Рис. 11.4. "Зал Измученных Душ". Фотографии разработчиков Excel 95.

 

Descent из Excel 97

 

Descent - это игра-симулятор космического корабля, перемещающегося в инопланетных шахтах. В Excel 97 встроена "леталка": игра, смысл которой заключается в полете над местностью и просмотре открывающихся красот. Вот как ее можно запустить.

1. Запустите Excel 97 и проследите, чтобы в пункте "Сервис - Параметры - Общие" не стояла отметка в пункте "Стиль ссылок R1C1".

2. Создайте чистую таблицу. Нажмите F5 и введите в строке ссылки для перемещения фразу "x97:l97" (т.е. переход к ячейкам от X97 до L97 с их выделением). Нажмите Ввод.

3. Вы перейдете к строке номер 97. Нажмите Tab, а затем, удерживая Shift и Ctrl, щелкните левой кнопкой мыши по иконке "Мастера диаграмм" (рис.11.5). Подождите немного, пока открывающееся окно не распахнется на весь экран.

11_05.bmp

Рис. 11.5. Именно эта кнопка запускает Descent из недр Excel'а.

Вот вы и в Excel Descent! Все управление - мышью. Левая кнопка - ускорение вперед, правая - назад, движения мыши задают направление. Выход из игры - Esc. Местность замкнута: если лететь в каком-либо направлении, то в конце концов прилетишь туда же, откуда начал полет. К сожалению, "посадка" в игре не отработана: через возвышенности можно спокойно пролетать насквозь. Встречаются весьма привлекательные ландшафты, например, некое подобие моря с колышущимися волнами (рис.11.6).

11_06.bmp

Рис.11.6. "Descent из недр Excel'а". Море.

Подлетев к центру местности, можно увидеть камень на высоком постаменте. На поверхности камня последовательно проплывают имена разработчиков Excel 97 (рис.11.7).



11_07.bmp

Рис. 11.7. "Descent из недр Excel'а". Список разработчиков программы.

Pinball в Word 97

 

Игра, встроенная в Word97, довольно проста и в правилах, и в оформлении (рис.11.8). Это всего лишь Пинболл - игра, задачей которой является удержание на наклонном поле катающегося по этому самому полю шарика с помощью ударов двух приделанных в нижней точке поля лопаточек. Для ее вызова запустите Word 97, создайте в нем новый пустой документ и напечатайте в нем слово "Blue" (без кавычек). Выделите это слово (мышью или курсором с удержанием клавиши Shift), вызовите диалог установки свойств шрифта ("Формат - Шрифт") и задайте выделенному фрагменту полужирное начертание шрифта и синий цвет (в англоязычной версии Word соответственно "Bold" и "Blue"). После этого поставьте курсор в конец слова "Blue" и напечатайте после него один пробел. Теперь вызовите пункт меню "О программе" ("? - О программе", в англоязычной версии - "Help - About") и, удерживая клавиши Ctrl и Shift, кликните левой кнопкой мыши на иконке Word'а в иллюстрации в левой части появившегося окна.

11_08.bmp

Рис. 11.8. Word Pinball. Всегда к вашим услугам.

В появившейся на экране игре управление осуществляется всего двумя клавишами: "Z" - удар левой лопаточкой, "М" - удар правой лопаточкой. Ну, и еще есть клавиша "Esc" для выхода.

В правой части окна игры медленно проплывает список разработчиков Word'а.

 

Автогонки в Excel 2000

 

Если в Microsoft Excel 97 имеется встроенная игра-"леталка", то в следующей версии этой программы работы с электронными таблицами присутствуют даже настоящие автогонки.

Для выхода на трассу запустите Excel 2000 и создайте новую книгу с помощью команды "Создать" из меню "Файл". Затем сохраните эту книгу как web-страницу с помощью соответствующей команды (т.е. "Сохранить как Web-страницу") того же меню, при этом в диалоговом окне сохранения установите в разделе "Сохранить" отметку в пункте "выделенное: Лист" и поставьте галочку в пункте "Добавить интерактивность".


Откройте полученную страницу в браузере Microsoft Internet Explorer (версии не ниже 5.0, впрочем, последняя автоматически устанавливается при установке Microsoft Office 2000), во внедренном в нее листе Excel перейдите с помощью клавиши PageDown к строке 2000, а с помощью линейки горизонтальной прокрутки - к столбцу WC. Выделите строку 2000 (просто нажав мышью на ее номер в указателе номеров строк слева листа) и с помощью клавиши Tab переведите выделение на ячейку WC2000. После этого, нажав одновременно левые клавиши Ctrl, Alt и Shift, кликните левой кнопкой мыши на эмблеме Office в левом верхнем углу внедренного в web-страницу листа Excel.

Вот вы и на трассе (рис.11.9).

11_09.bmp

Рис. 11.9. Автогонки в Excel'е 2000.

Ехать вперед - клавиша "стрелка вверх", тормозить - "стрелка вниз", поворачивать - соответственно стрелки вправо и влево. Включить фары - клавиша "о" (латинская), пробел - стрелять и уничтожать машины соперников. Соприкосновение с обочиной означает проигрыш: аварию автомобиля (рис.11.10).

11_10.bmp

Рис. 11.10. Автогонки в Excel'е 2000. Авария - опять начинай сначала…

На трассе чередуются ночь и день, - ночью освещение дороги дают только фары. На асфальте написаны имена разработчиков Excel'а (рис.11.11).

11_11.bmp

Рис. 11.11. Автогонки в Excel'е 2000. Езжай и читай, кто вам такое удовольствие доставил

Поскольку игра базируется не только на Excel'е, но и на средствах сопряжения этой программы с web-страницей, в том случае, если игра у вас не запускается, проследите, чтобы на компьютере были установлены Microsoft Web Components (компонент Office 2000) и в том случае, если они отсутствуют, установите их из дистрибутива Office.

К сожалению, в Excel XP ни автогонки, ни "леталка" не присутствуют. Однако наверняка в скором времени можно будет услышать, как в этой программе запустить какую-нибудь Free Space или еще что почище...

Думается, теперь вам ясно, почему программы от Microsoft имеют такой большой обьем.


Ведь в них помимо собственно тех функций, ради которых они и приобретаются, есть еще и множество скрытых возможностей. Впрочем, иной раз эти открывающиеся с помощью волшебной последовательности действий возможности могут скрасить нудную работу или помочь отдохнуть. Ведь для того, чтобы поиграть в автогонки, Pinball или "леталку", вам не потребуется ничего, кроме соответствующей версии Excel’а или Word'а.

[1] Это означает, что пользователи должны платить за информацию столько, сколько они могут заплатить, а не столько, сколько назначает производитель, - при условии, что информация не предназначена исключительно для этих пользователей.

[2] Строго говоря, название "макросы" для них не является точным: в классическом программировании под макросом понимают имеющую имя группу команд, которая подставляется на место этого имени в текст программы перед ее переработкой в машинные коды и служит для облегчения труда программиста.

[3]

Библиотека - это (в общем случае) файл, содержащий в себе код подпрограмм, используемых другими программами. Библиотеки делаются для того, чтобы несколько программ, которым требуются одни и те же подпрограммы, могли их брать из библиотек и тем самым не содержать их в себе и быть меньшего обьема. Кроме того, библиотека может загружаться в оперативную память лишь при ее вызове из программы и тем самым не загромождать ее, когда содержащиеся в ней функции не нужны.

[4]Например, если вы в своей программе используете переменную "а", то в том случае, если ваша программа вызовет другую программу, в этой другой программе переменная "а" будет иметь именно то значение, которое ей было задано в первой программе только тогда, когда она в этой первой программе обьявлена (возможно, и как Variant - главное, чтобы обьявление было). Скажем, если в первой программе переменной "а" присваивается значение "3", а во второй к этой переменной прибавляется 2, то в том случае, если в первой программе обьявление переменной "а" отсутствует, результатом сложения будет 2, а не 5, - так как вторая программа сочтет "а" новой переменной, равной нулю.



[5]

Кроме того, при вызове процедуры или функции иногда требуется указывать команду Call (подробнее смотрите в справочной системе).

[6]

Это означает, что расстояние до бегунка можно получить командой типа "a= ScrollBar.Value", где ScrollBar - имя полосы прокрутки (задается в Окне Свойств, в параметре Name).

[7]

За некоторым исключением - отдельные команды из новых версий Visual Basic for Applications убраны. Впрочем, их не так много и они используются в весьма специфических целях.

[8]

При сохранении нового документа ему дается по умолчанию либо имя по его первой строчке (как бы "по заголовку текста"), либо, если первая строчка пустая - имя Doc1.doc (наш случай). Однако в том случае, если в папке сохранения документов по умолчанию, в которой сохраняется этот новый документ, уже есть файл с именем Doc1.doc, то новому документу по умолчанию предлагается уже имя Doc2.doc - чтобы не произошло перезаписи предыдущего файла с подобным именем. Так же происходит и при сохранении последующих документов, - некий "интеллектуальный механизм" раздавания файлам уникальных имен.

[9]

Место сохранения можно задать, включив в имя документа в пункте “FileName” полный путь к его новому местоположению.

[10]

У этого варианта, впрочем, есть один недостаток - при большом числе документов, загруженных в Word, увеличивается расход оперативной памяти и замедляется быстродействие программы, но для моего случая это несущественно, так как время здесь не является лимитирующим фактором.

[11] Существует программа "Генератор иконок", специально предназначенная для извлечения иконок из недр Word'а. О ней рассказано в главе 9.

[12] Вы можете в этом убедиться, использовав фрагмент кода

For Each J In CommandBars

Debug.Print J.Name

Next J

который выведет в Окно отладки имена всех присутствующих в Word и в открытых и загруженных документах и шаблонах панелей инструментов.

[13] Стоит признать, что в Excel концепция панелей инструментов значительно хуже продумана, чем в Word.Этим и обьясняются такие сложности при работе с ними.

[14]

Благодарю Тестовую лабораторию PC Magazine RE за эту рекомендацию.

[15]

В MS-DOS, впрочем, присутствовала возможность включать в программу так называемые "Esc-последовательности", определяющие внешний вид окна программы, вместо того, чтобы самостоятельно прорисовывать все его элементы. Однако аналогом API данное средство считать нельзя, - все же слишком мало функций было доступно программисту.

[16]

Двоеточие - разделитель команд, расположенных в одной строке.

[17]

Например, http://NikolayAM.narod.ru. Также про API и использование его в VBA есть немало информации на сайте программы Microsoft Office Extensions (http://www.microsoft.ru/offext).

[18]

Функция Или возвращает 1, если на хотя бы один из входов подано значение 1.


ProgressBar в ваших программах


Во многих программах для Windows используется такой элемент, как ProgressBar - индикатор, показывающий, на сколько продвинулся тот или иной процесс. В частности, он есть практически во всех программах-инсталляторах. К сожалению, в VBA этот элемент отсутствует, но его можно сделать самостоятельно!

Выглядеть он будет, например, так, как на рис.8.6.

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

1. Создаем небольшую форму и помещаем на нее: надпись с пояснительным текстом (например, "Label1") и две другие надписи, (скажем, "Label2" и "Label3"), низкие и широкие, которые расположим одну над другой (рис.8.7).

08_06.bmp

Рис. 8.6. ProgressBar в программе на VBA

08_07.bmp

Рис. 8.7. А вот как он сделан

К примеру, их координаты и размеры:

Label2: Top - 45, Left - 15, Height - 15, Width - 250

Label3: Top - 45, Left - 15, Height - 15, Width - 0

Зададим в качестве фонового цвета для "Label2" - серый, а для "Label3" - зеленый (свойство "BackColor", вкладка "Палитра" - рис.8.8).

08_08.bmp

Рис. 8.8. Выбор фонового цвета для ProgressBar'а - здесь.

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

Private Sub UserForm_Activate()

… остальной текст программы, которая должна выполняться во время отображения ProgressBar'а …

Unload Me

End Sub

Все, что находится в теле этого обработчика, будет выполняться, в то время как форма будет находиться на экране. По окончании выполнения программы форма будет выгружена (хотя выгружать ее не обязательно, если после окончания программы в обработчике предполагается продолжение работы с формой). Однако никакие другие события формой обрабатываться в это время не будут.


3. Идея такова. Ширину третьей надписи "Label3" можно изменять программно. Поэтому для отображения ProgressBar'а надо вставить в код строки, изменяющие ширину этой надписи. К примеру, цикл в программе выполняется n раз. Тогда ширина надписи "Label3" будет определяться командой в теле цикла по формуле "Label3.Width = (scet / n) * 250", где "scet" - это счетчик цикла, а 250 - ширина надписи Label2.

После каждой такой команды надо вставлять инструкцию "Me.Repaint", чтобы перерисовать форму с учетом новых параметров третьей надписи, - автоматической перерисовки до полного отображения формы (которое произойдет, когда кончится обработка события "UserForm_Activate()"

и форма не будет выгружена) не происходит. Если форма с ProgressBar'ом должна долго находится на экране без изменений, то рекомендуется почаще использовать команду "Me.Repaint", так как без перерисовки внешний вид формы может быть легко испорчен окнами других приложений, когда пользователь решит воспользоваться ими во время работы макроса.

Итак, код для формы с ProgressBar'ом должен иметь такой вид ("n" - количество необходимых выполнений цикла):

Private Sub UserForm_Activate()

Me.Repaint

For t=1 to n

… … … … необходимые команды программы в цикле … … … …

Label3.Width = ((t / n) * 250)

Me.Repaint

Next t

Unload Me

End Sub

Разумеется, в нем возможны изменения и улучшения. Можно несколько раз использовать ProgressBar в одной форме, каждый раз обнуляя ширину третьей надписи. Можно поместить на одну форму несколько ProgressBar'ов, где один, например, показывает выполнение всего задания, а другой - его текущей части.

*       *       *


VBA: для тех, кто любит думать


VBA: для тех, кто любит думать

Введение

*       *       *

Вашему вниманию предлагается книга, посвященная весьма интересной теме - возможностям и способам создания программ, работающих в среде пакета программ Microsoft Office. Нет нужды говорить о популярности этого пакета в нашей стране, однако, к сожалению, немногие пользователи знают и применяют в своей деятельности возможности его компонентов в области автоматизации своей работы с помощью макросов. И уж совсем единицы используют Microsoft Office как среду разработки программных продуктов. Отчасти такая ситуация вызвана несколько пренебрежительным отношением многих профессиональных разработчиков программ к Visual Basic for Applications - языку программирования, "встроенному" во все компоненты пакета программ Microsoft Office (начиная с версии 95). Однако Visual Basic for Applications (сокращенно - VBA) - вполне полнофункциональный язык программирования, с помощью которого можно создавать вполне законченные и работоспособные программы, как просто облегчающие работу с Microsoft Office, так и предназначенные для проведения расчетов, обработки данных.

Но самое главное - на VBA могут создавать программы даже те, кто ранее никогда не занимался программированием, причем для этого не потребуются ни толстые книги, ни дорогие курсы обучения. Необходимо лишь уметь думать: наблюдать, исследовать, ставить эксперименты, делать выводы, - проявлять способности к научному подходу.

Для написания программ на VBA вам не потребуются многостраничные руководства. Лучше всего даже, чтобы они появились у Вас тогда, когда Вы освоите по меньшей мере треть или даже половину возможностей этого языка, и тогда они будут прочитаны Вами как захватывающий детектив, а не как занудные учебники. Более того, тогда оставшиеся две трети информации о возможностях VBA будут усвоены вами гораздо быстрее и легче. Кроме того, создавая программы на этом языке, Вы получите прекрасную возможность смоделировать в данном процесе способы подхода к этому миру со стороны исследователя, экспериментатора, ученого, научиться принципам научного подхода к исследованию различных явлений или вспомнить их.
И необьятный простор открывает такая, казалось бы, обыкновенная вещь, как Microsoft Office и его средства разработки программ для обучения и воспитания подрастающего поколения, - программирование в среде этого пакета программ является превосходным средством для выработки у учеников самостоятельности в исследованиях, способности сопоставлять различные факты и анализировать информацию, - всего того, что нужно разумному человеку или даже будущему ученому.

Эта книга, посвященная программированию в среде Office, естественно, не может охватить всех тонкостей искусства создания программ на VBA, да такая задача перед ней и не стоит. Она является, скорее, введением в этот язык, и предназначена для того, чтобы познакомить вас с ним, описать основные его возможности, помочь в начале работы, предостеречь от некоторых затруднений и ошибок.

Программы на VBA - макросы - можно создавать для любой программы пакета Microsoft Office: для Word, Excel, Access, PowerPoint и даже Outlook. В этой книге будет преимущественно рассмотрен процесс создания макросов для Microsoft Word. Среда Microsoft Word выбрана для начального изучения работы с Редактором VBA и принципов программирования на Visual Basic for Applications из-за того, что, во-первых, именно Word является наиболее популярной программой из всего пакета Microsoft Office (по подсчетам исследователей из Microsoft, из каждой сотни запусков программ из комплекта Microsoft Office в 60% случаев запускаемой программой будет именно Word), а, во-вторых, писать программы, работающие в среде данного текстового редактора, несколько проще, чем дополнения для других компонентов Office. Научившись работать с VBA в Word, вам будет довольно просто перейти к программированию для остальных компонентов Office.

Не обязательно читать все главы книги подряд. После небольшого экскурса в историю программирования второй главы в третьей и четвертой главах будут описаны основные компоненты Microsoft Office, предназначенные для написания программ, рассказано о работе с ними, а также описан сам язык VBA, его синтаксис.


Они скорее представляют собой небольшой справочник, полезный на первых порах, к которому иногда стоит возвращаться. Следующие три главы посвящены написанию программ на VBA, в них подробно описаны все шаги такой работы. Еще одна глава расскажет вам о полезных и интересных приемах программирования. В последней главе вы найдете краткий обзор некоторых интересных программ на VBA, которые можно использовать для обучения в качестве примеров. А в Приложении вы узнаете о том, какие игры есть в Microsoft Office (да-да, именно игры - посмотрите первую главу Приложения!) и о новых возможностях новой версии Microsoft Office - Microsoft Office XP.

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

Предполагается, что читатели знакомы с программой Microsoft Word и знают основные приемы работы в этом текстовом процессоре.

*       *       *

На настоящее время выпущено три версии Microsoft Office, содержащие в себе возможности работы с VBA - 97, 2000 и 2002, иначе именуемая XP. За некоторыми исключениями все они между собой совместимы "сверху вниз", то есть программа, написанная для Word97 и в среде этого редактора, будет работать и в Word2000, и в WordXP. Обратное же верно не всегда: в Word2000 и особенно в WordXP добавлены новые команды VBA, и программа, их использующая, в Word97 уже не заработает.

В предстоящих главах в качестве основной среды программирования рассматривается Microsoft Office 97, так как вследствие вышесказанного наиболее разумным будет использовать в качестве среды разработки именно 97-ю версию Microsoft Office, в частности, для того, чтобы создаваемую программу могли применять пользователи всех версий Office. Кроме того, только в Microsoft Office 97 часть Справочной системы по VBA, входящей в состав Microsoft Office, русифицирована. Об особенностях же программирования для Office 2000 и Office XP сообщается отдельно там, где эти особенности имеют какое-либо значение.



*       *       *

О ценности информации

Немного философии...

С появлением информационных технологий человеческое общество фактически перешло в новую фазу развития. И связано это с тем, что достижения компьютерной техники позволяют неограниченно и крайне дешево размножать такую вещь, как информацию. Ранее, например, лет пятьсот назад, для получения новой копии информации приходилось прилагать немало усилий: переписать книгу (а перед этим еще подготовить листы для книги из пергамента), прочитать и выучить текст, нарисовать копию картины, перед этим подготовив холст и краски. Зачастую усилия на создание новой копии источника информации были сравнимы с усилиями на создание самого этого источника, - например, переписывание книг занимало года. И создавать новые копии могли лишь специально подготовленные люди: ученые монахи-переписчики, художники, поэты. С появлением книгопечатания процесс облегчился: теперь книгу, ставшую основным носителем информации, можно было распечатать в большом количестве, и для этого не требовалось квалифицированного творческого труда. Но все равно затраты на размножение информации оставались немалыми: книгу надо сверстать, напечатать, сшить, распространить... 

Но с появлением компьютерных технологий и, в особенности, сети Интернет затраты сил и средств на получение новой копии какой-либо информации стали ничтожными.

Ценность любой информации определяется суммой тех материальных и духовных благ, которые может дать конкретному человеку ее использование. Поэтому каждое копирование информации увеличивает количество благ, привносимых ею в мир, фактически на столько же, на сколько оно было увеличено при ее создании, - естественно, при условии попадания ее в нужные руки. При каждом копировании информации с помощью современных компьютерных технологий происходит умножение совокупного богатства человечества с крайне малыми затратами. Это уникальная ситуация - представьте себе, что один человек испек пирог и накормил им множество человек, причем пирог, который сьел каждый, был точно такой же по размерам, что и первоначальный.



Из этого следует закономерный вывод - надо всячески стремиться к размножению и копированию информации. Для того, чтобы максимально увеличить количество благ, которыми располагает человечество.

Но, к сожалению, в последнее время возобладала прямо противоположная тенденция - запрещать копирование информации, "охранять" ее. Да, разумеется, создатели информации должны получать вознаграждение за свой труд, и немалое - работа тяжелая, даже очень. Но почему это должно достигаться путем запретов на копирование? Ведь есть и другие пути - скажем, можно централизованно собирать со всех, использующих информационные ресурсы, небольшой налог и из этих средств выплачивать авторам вознаграждения, сообразуюсь с мнением пользователей о качестве той или иной информации? Поскольку авторов информации гораздо меньше, чем ее потребителей, то налог может быть очень небольшим. К тому же подобная ситуация приведет к стремлению всех, и авторов, и потребителей, максимально увеличить количество пользователей информационных сетей, как можно больше делать копий, - ведь тогда средств будет собираться больше! В выигрыше будут все. Единственно, что надо для этого - изменить существующий взгляд на информацию как на продаваемый товар: "заплатил - пользуйся, не заплатил - не пользуйся", и считать деньги, выплачиваемые автору информации, вознаграждением ему за труд, а не платой за получение этой информации. Изменить сформировавшееся в последние годы мировоззрение "собственника".

Тем более что обьективных предпосылок для такого мировоззрения нет. Стоит помнить, что те, кто сейчас создает информационные ресурсы и получает огромные прибыли за счет их продажи из-за разницы в себестоимости и доходе, фактически стоят "на плечах предков". Миллионы людей работали долгие годы для того, чтобы сейчас у человечества появилась возможность копировать информацию почти без затрат сил и ресурсов, зачастую не получая достаточного вознаграждения своего труда. И они тоже могут рассчитывать на прибыль от распространения информации в настоящее время.


Ну, уже, увы, не они - так их потомки, дети и внуки. А в то время, когда ученые разрабатывали первые компьютеры, без которых было бы невозможно создание современных компьютерных систем, этих ученых кто-то должен был кормить, одевать, кто-то строил им дома. Значит, и эти люди имеют право на долю прибыли от продажи информации, созданной и распространяемой с помощью компьютеров! Так что все здесь взаимосвязано, и выяснить, кто конкретно имеет право на доходы от продажи той или иной информации, нельзя.

Поэтому развитие технологии, появление компьютерных систем и глобальных информационных сетей требует создания новой системы межчеловеческих взаимоотношений. Только отказ от принципа "продажи" информации, только связанное с этим изменение мировоззрения людей позволят максимально использовать открывшиеся новые возможности. Только восприятие денег, выплачиваемых за информацию, как вознаграждение ее автору за его тяжелый труд, а не как стоимость этой информации, только отказ от принципов "охраны интеллектуальной собственности" (но не авторского права!)[1] даст возможность человечеству приумножить свое совокупное богатство во много раз практически без затрат труда и ресурсов.

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

Однако ясно, что односторонний отказ от сложившейся системы "торговли" информацией ни к чему хорошему не приведет, - ведь другие держатели информации отнюдь не обязательно добровольно последуют благому примеру. Создание глобальной централизованной системы распространения информационных ресурсов можно осуществить лишь на государственном уровне. Одним из наиболее прискорбных моментов истории развития компьютерных технологий была ориентация производителей программного обеспечения на продажи своих продуктов на рынке, вместо воздействия на государственные структуры с целью обьединения всех производителей программ в централизованную систему распространения информации. Последствием этого неправильного решения станет серьезное замедление развития нашей цивилизации.