Язык WordBasic - практический подход
Форматирование символов
Сначала посмотрим как перевести символы в верхний или нижний регистр (т. е. прописные или строчные буквы).Оператор SmallCaps [On] устанавливает или удаляет форматирование в буквы нижнего регистра для текущего выделения или символов, которые будут вводиться в точке вставки. On=1 устанавливает перевод в нижний регистр, On=0 отменяет его. По умолчанию (если аргумент опущен) устанавливается режим преобразования.
Функция SmallCaps() возвращает следующие значения:
0 – выделенный текст не преобразован в нижний регистр;
-1 – часть текста в нижнем регистре;
1 – весь выделенный текст в нижнем регистре.
AllCaps [On] – в зависимости от параметра (1 – on или 0 – off) включает или выключает преобразование текста в выделенной области в прописные буквы (в верхний регистр). Функция AllCaps() возвращает 0, -1 или 1, если текст, соответственно, не преобразован в верхний регистр, преобразован частично или преобразован полностью.
Пример.
If AllCaps() = -1 Then AllCaps 1
Следующие операторы и функции позволяют сделать выделенные символа соответственно подстрочными и надстрочными и проверить, не являются ли они такими.
Subscript, Subscript()
Superscript, Superscript()
Теперь рассмотрим операторы меняющие вид шрифта. Вся группа этих операторов устроена совершенно одинаково. Все они имеют аргумент, принимающий значение 1 или 0, в зависимости от которого включается или выключает режим заданного форматирования выделенного текста. Соответствующие данным операторам функции возвращают одно из трёх значений:
0 – выделенный текст
не преобразован;
-1 – часть текста преобразована;
1 – преобразован весь выделенный.
Форматирование
К выделенному или выбранному программно блоку текста можно применить все доступные в WinWord способы выравнивания, которые задаются следующими операторами:
LeftPara по левому краю
CenterPara по центру
JustifyPara равномерно
RightPara по правому краю
Каждому из этих операторов соответствует одноименная функция, возвращающая результат проверки блока текста на наличие указанного типа выравнивания (см. примеры в Справке)..
SpacePara15 SpacePara15()
SpacePara1 SpacePara1()
SpacePara2 SpacePara2()
Пример.
Сначала проверим, отцентрирована ли выделенная часть текста полностью или частично. Если нет, то отцентрировать его.
Sub MAIN
If CenterPara() = 1 Then
MsgBox “Выделенный текст уже полностью отцентрирован.”
ElseIf CenterPara() = - 1 Then
MsgBox “Текст отцентрирован частично.”
ElseIf CenterPara() = 0 Then
MsgBox “Отцентрировать.”
CenterPara
End If
End Sub
Еще один пример:
Проверим интерлиньяж в выделенном участке текста и, если он равен одному интервалу, заменим его на двойной.
Sub MAIN
A = SpacePara2()
If A < 1 Then
MsgBox "Установим двойной интервал."
SpacePara2
Else
MsgBox "Двойной интервал уже установлен."
End If
End Sub
Оператор ChangeCase [On] меняет вид текст в выделенной области из верхнего регистра в нижний и наоборот. Функция ChangeCase().
CharColor НомерЦвета, CharColor(), CharColor$
Функция DocumentProtection()
Возвращает значение, задающее режим защиты активного документа. Чтобы изменить его, используйте ToolsProtectDocument. ВWord 6.0, DocumentProtection() недоступна и генерирует ошибку.
Возвращаемые значения
0 (нуль) Документ не защищен.
1 Пользователь может выбирать и модифицировать текст в поле формы.
2 Пользователь может только добавить аннотации.
3 Пользователь может выбирать и редактировать текст, но все изменения трассируются с маркерами изменений.
Задает, что текст, который вы хотите найти или заменить, выделен.
EditFindHighlight. Когда этот оператор следует за EditFind или EditReplace, в которых параметр .Format установлен в 1, то задает, что текст, который вы хотите найти выделен яркостью. Word ищет любой выделенный текст, даже если в одном документе для выделения были использованы различные цвета. В Word 6.0, EditFindHighlight недоступна и генерирует ошибку.
Пример
Находятся все вхождения в документ выделенного текста, убирается выделение, а сам текст делается полужирным.
EditFindClearFormatting
EditReplaceClearFormatting
EditFindHighlight
EditReplaceFont .Bold = 1
EditReplaceNotHighlight
EditReplace .Find = "", .Replace = "", .Format = 1, .ReplaceAll
Задает, что текст, который вы хотите найти или заменить, не выделен.
EditFindNotHighlight. Когда этот оператор следует за EditFind или EditReplace, в которых параметр .Format установлен в 1, то задает, что текст, который вы хотите найти не выделен яркостью. В Word 6.0, EditFindNotHighlight недоступна и генерирует ошибку.
Функция Hidden()
Синтаксис:
Hidden()
Возвращаемое значение:
0 – если внутри выделенной области нет скрытого текста;
1 – если часть выделенной области отформатирована как скрытая;
-1 – если вся выделенная область отформатирована как скрытая.
Пример:
Вывести сообщение, если выделенный текст помечен как “скрытый”:
Sub MAIN
Insert "Это тест."
StartOfLine 1
Hidden 1
if Hidden()=1 then print "Весь выделенный текст помечен HIDDEN."
End Sub
Функция Today()
В отличие от Now() возвращает целое число, соответствующее установленной в компьютере системной дате.yr = Year(Today())
MsgBox Str$(yr)
Функция Day() – служит для определения порядкового дня месяца.
ToolsMacro .Name = text [,.Edit][,.Show=number][,.Delete] [,.Rename][,.Description=text][,.NewName=text][,.SetDesc]
Эта мощная макрокоманда выполняет все действия по работе с макрокомандами. Ее опции соответствуют опциям диалогового окна Макрокоманда меню Сервис.
Русская версия WinWord автоматически преобразовывает первую букву в названиях дней недели в заглавную. В режиме автокоррекция отсутствует опция эквивалентная “Copitalite Names of Days” из английской версии. чтобы изменить такой режим нужно создать макрокоманду
Sub MAIN
Tools.AutoCorrect, Days=0
End Sub
Использование кнопки записи макро
Создание макрокоманды, создающей рисованный объект, далеко не такая простая задача, как это может показаться с первого взгляда. Поэтому я рекомендую вам использовать кнопку Record Next Command в окне редактирования макрокоманд, по нажатию которой WordBasic запишет выполняемое вами действие с панелью Рисованиев виде оператора языка. Второй способ – дважды щелкнуть по кнопке Rec в строке статуса в нижнем правом углу экрана. Разумеется, что управляющие структуры, типа операторов цикла, необходимо записывать вручную. Этот способ быстрой разработки макрокоманды, безусловно, применим и в ряде других случаев. Кто-то сказал, что бывают знания, полезные как марсианские деньги – есть, а деть некуда. Опираясь на свою историю, я могу сказать, что это не так: просто никогда не знаешь, какую “кредитную карточку” придётся достать в тот или иной момент.
Язык WordBasic: практический подход
Э. ПройдаковКогда не знаешь куда идти, любая дорога приведет тебя к цели.
Восточная мудрость
Элементы языка
Те, кто знаком с языком Бейсик, могут этот раздел либо пропустить, либо посмотреть бегло на возможные отличия и детали.
Когда в WinWord вы вызвали подменю Сервис, выбрали в нем пункт Макрокоманда и ввели имя новой макрокоманды (лучше давать русское название, отражающее выполняемое макрокомандой действие), в диалоговом окне становится доступной опция Создать. Если ее активизировать, то в окне для записи текста макрокоманды появятся скобки главной процедуры:
Sub MINE
End SUB
Между ними вы можете вписывать операторы языка WordBasic, т. е. создавать “тело” будущей макрокоманды. Таким образом каждая из макрокоманд – последовательность операторов WordBasic, расположенных между маркерами Sub Main и End Sub:
Sub MAIN
Последовательность операторов WordBasic
End Sub
Прежде всего макрокоманды используются для быстрого ввода часто повторяющихся последовательностей символов или выполнения повторяющихся действий. Связав с нажатием определенной комбинации клавиш выполнение некоторой макрокоманды, можно значительно сэкономить время при работе с документом. Однако так как запоминать даже небольшое число таких сочетаний весьма утомительно, WinWord предоставляет возможность связать имя макроса не только с нажатием комбинации клавиш, но и с пиктограммой на панели инструментов или кнопкой в документе.
По области действия макросы в WinWord делятся на глобальные, которые могут действовать в любом документе, и макросы шаблона, используемые только в документах, создаваемых на базе данного конкретного шаблона. Макросы могут создаваться создаются несколькими способами: программированием на языке WordBasic, с помощью специального средства записи последовательности действий (записывателя макросов), сочетанием первого и второго способов. Хранятся макросы тоже несколькими способами: как команды, как глобальные макросы или как макросы шаблона.
Я думаю, что одна из причин медлительности редактора Word в том, что его команды меню, диалоговые окна и многие другие средства в действительности – макрокоманды, хранящиеся непосредственно в программе Word.
Макрокоманды, созданные пользователем, хранятся либо в шаблоне NORMAL.DOT (глобальные макросы), либо в заданном вами шаблоне документа.
Перечислим кратко основные элементы языка WordBasic.
Метки. Используются в операторах переходов для изменения порядка выполнения инструкций макрокоманды. Метки могут быть цифровыми (числа от 1 до 32759, сохранены в языке для совместимости с предыдущими версиями), алфавитными и алфавитно-цифровыми. В последних случаях метка начинается с буквы, может иметь длину до 40 знаков. Метка должна располагаться с самого начала строки (т.е. ей не должны предшествовать пробелы или символы табуляции) и заканчиваться двоеточием. Правила для имен меток такие же, как и для имен переменных. Лучше располагать метку на отдельной строке. Как это принято в новых Бейсиках, строки программы не нумеруются.(Необходимость нумерации операторов в первых Бейсиках была связана с удобством их построчного редактирования и вставки новых операторов с помощью имевшихся тогда средств.)
Переменные.
Переменная – это место для хранения какой-либо строки знаков или числа. В ходе выполнения макрокоманды содержимое переменной можно изменить. Использование переменных обеспечивает гибкость при написании макрокоманд: меняя значение переменной можно использовать одну и ту же макрокоманду для работы с разными словами.
WordBasic поддерживает два типа данных: числовые и строковые. Соответственно, строковые переменные служат для хранения в них текста (состоящего из букв, чисел, пробелов, знаков пунктуации и любых других знаков), а числовые – чисел. Признаком строковой переменной является знак доллара в конце ее имени. Такая переменная может иметь длину до 65 280 символов (если хватает памяти), т. е. в нее можно считать текстовый файл среднего размера. Двойные кавычки служат для обозначения начала и конца строки текста. (Чтобы включить в строку двойную кавычку или непечатаемый символ используется функция Chr$). Присвоим произвольной строковой переменной какое-нибудь смешное значение:
Реплика$ = "Элементарно, Ватсон!"
Эту переменную можно в подходящем месте программы вывести на экран:
Print Реплика$
Пустая строка – это строка не содержащая ни одного символа. Такую строку можно создать одним из трёх приведённых ниже способов:
EmptyString$ = ""
EmptyString$ = Chr$(0)
EmptyString$ = String$(1,0)
При создании имени переменной следует придерживаться следующих правил:
1. Имя должно начинаться с буквы. В именах переменных можно использовать кириллицу, кроме буквы ‘ч’.
2. Состоять только из букв, чисел, знака подчёркивания ( _ ); знаки пунктуации и пробелы не допускаются.
3. Имя не может быть длиннее 40 знаков.
4. Имя не может быть зарезервированным словом. (Зарезервированное слово – это слово, которое имеет определённый смысл в WordBasic. В их число входят имена операторов, функций и операторы типа AND, OR, MOD и др.)
Обратите внимание, что идентификаторы в WordBasic не зависят от того, в каком регистре они набраны.
Числовые переменные могут содержать до 14 цифр и соответствуют по типу 8-байтовому числу с плавающей точкой двойной точности. Большие числа могут быть записаны и в так называемой научной нотации. Наибольшее положительное число в WordBasic чуть больше 1.79769E+308.
Массивы. Поддерживаются числовые и строковые одно- и двумерные массивы. Нумерация элементов массива начинается с нуля. Объявление массива с помощью оператора Dim:
Dim Имя_переменной(Номер_последнего_элемента)
Примеры.
Dim Месяц(11) 'массив из 12 элементов
Dim Год(12,31) 'массив из 12 строк и 31 колонки
В следующем предложении объявляется массив из трех элементов:
Sub MAIN
Dim ТриСестры$(2)
ТриСестры$(0) = "Вера "
ТриСестры$(1) = " Надежда "
ТриСестры$(2) = " Любовь"
MsgBox ТриСестры$(0) + ТриСестры$(1) + ТриСестры$(2)
End Sub
Максимальный размер одномерного численного массива 8143 элемента, строкового – 16287. Можно одновременно иметь несколько строковых и численных массивов максимальной размерности.
Размер любого объявленного ранее массива можно изменить с помощью оператора Redim (т.е. переобъявить массив). Синтаксис как и у оператора Dim:
Redim Имя_переменной(Номер_последнего_элемента)
В предыдущем примере можно увеличить размер массива ТриСестры$:
Redim ТриСестры$(6)
если сестер в семье стало семеро. Отметим, что предыдущее содержимое массива в результате этой операции будет потеряно и присваивать значения элементам массива придётся заново. Иногда Redim полезно делать чтобы освободить для других целей память, занимаемую символьным массивом.
Комментарии. Как и в обычном Бейсике, начинаются с ключевого слова REM. Однако, так как оно громоздко для этой цели, их можно начинать и с кавычки (‘).
Операции.
Арифметические:
- – Отрицательное значение
* – Умножение
/ – Деление
Mod – остаток от деления одного целого числа на другое
+ – Сложение
- – Вычитание
Как всегда круглые скобки () изменяют старшинство операций: сначала выполняются операции внутри скобок.
Сравнения: =, <, >, >=, <=, <>
Логические: And, Or, Not
Конкатенация: +
Операторы. Обычно каждый оператор макрокоманды записывается на отдельной строке. Это облегчает отладку и улучшает читабельность ее текста. Если в одной строке записывается несколько операторов WordBasic, они отделяются друг от друга двоеточием. Оператор, не уместившийся на одной строке, можно перенести на следующую, поставив в конце строки обратную косую черту (\). Оператор можно набирать в любом сочетании строчных и прописных букв, т.е. в нижнем или верхнем регистре. При сохранении макрокоманды WordBasic запишет свои ключевые слова правильным образом (из окна ввода макрокоманды выбрать в меню Файл, пункт Сохранить шаблон). WordBasic, как и программа Справки,
распознает их, очевидно, приводя к единому виду.
Действуют стандартные операторы Бейсика.
Оператор перехода:
Goto метка
передает управление оператору, следующему за указанной в goto меткой. Хотя существует идущее от известной статьи Дейкстры предубеждение против этого оператора, в ряде случаев он полезен.
Условный оператор имеет несколько форм записи:
а)
If выражение
Then оператор
If выражение
Then оператор : оператор [...]
Пример.
1. Если отмеченный текст выделен полужирным шрифтом, то отменить полужирный и выделить курсивом:
If Bold() = 1 Then Bold 0 : Italic 1
б)
If выражение
Then
операторы
EndIf
Пример.
If Italic() = 1 Then ' Если отмеченный текст выделен курсивом,
Italic 0 ' удалить выделение
Bold 1 ' выделить полужирным
Underline ' и подчеркнуть его.
End If
в)
If выражение Then
операторы (если True)
Else
операторы (если False)
EndIf
Пример.
If Italic() = 1 Then
Italic 0
Else
Italic 1
End If
г)
If выражение_1 Then
операторы (если True)
ElseIf выражение_2 Then
операторы (если True второе условие)
Else
операторы (если False)
EndIf
Так как слова Else, ElseIf, EndIf являются “скобками” в операторе If, то они могут располагаться при записи этого оператора произвольно.
Так как WinWord по умолчанию присваивает всем численным переменным значение 0, то использование переменных с неприсвоенными им в программе значениями не диагностируется. Так, оператор
If false Then A=1 Else B=2
выполнится правильно, а
If true Then A=1 Else B=2
отработает как предыдущий. Из-за того, что встроенных констант false и true в языке WordBasic нет, они рассматриваются как переменные.
Select Case
<добавить описание>
Циклы.
Обычный цикл. Выполняет последовательность операторов до тех пор пока значение счетчика
не станет больше значения выражения_2. После каждого цикла счетчик
увеличивается на 1.
For счетчик = выражение_1
To выражение_2
операторы
Next
Если значение счетчика больше значения выражение_1, то цикл не выполняется ни разу.
While выражение
операторы ‘выполняются, пока выражение true
Wend
Циклы могут быть вложенными, как и в любом процедурном языке.
Оператор Stop.
прекращает выполнение макрокоманды. Если вывод сообщений не подавлен, то на экране появится окно с предупреждением, что выполнение данного макроса прекращено. Этот оператор полезен также при отладке макрокоманд.
Как видно из этого перечисления, управляющие структуры в языке слабо развиты, так как он не предназначался для разработки программ большого объема.
Программные блоки.
Макрокоманда (программа на WordBasic) может состоять из одного или нескольких программных блоков, один из которых является главным и называется MAIN. Ему WinWord передает управление при запуске программы на исполнение (саму макрокоманду WinWord рассматривает как подпрограмму).
Разбиение программы на блоки не только облегчает отладку и чтение ее текста (который называется исходным текстом), но также позволяет быстрее разрабатывать другие макрокоманды. При этом ранее написанные процедуры (в виде библиотек подпрограмм и функций?) используются в качестве строительных блоков.
Общая структура программы на WordBasic выглядит так:
Sub MAIN
Последовательность операторов WordBasic и/или
имена_подпрограмм
End Sub
Sub имя_подпрограммы_1
Последовательность операторов WordBasic
End Sub
.......
Sub имя_подпрограммы_N
Последовательность операторов WordBasic
End Sub
В языке определены два вида подпрограмм: подпрограммы и функции. Структурно они оформляются так:
Sub имя (аргументы)
Последовательность операторов WordBasic
End Sub
Function имя_функции (аргументы)
Последовательность операторов WordBasic
имя_функции
= возвращаемое_значение
End Function
Подпрограмма вызывается указанием ее имени и макроса, в котором данная подпрограмма определена. Использование ключевого слова Call при этом необязательно, хотя и допускается, чтобы отличить процедуры в макрокомандах от операторов WordBasic. Так, если процедура Beep(Count) определена в макросе LibMacros, то ее вызов с аргументом 8 выглядит так:
LibMacros.Beep(8)
Контроль вывода полей на экран
Осуществляется с помощью операторов ViewFieldCodes, ToggleFieldDisplay и функции ViewFieldCodes().
Синтаксис:
ViewFieldCodes [0|1]
ViewFieldCodes()
Оператор ViewFieldCodes управляет выводом не экран всех полей в активном документе. Вывод кодов полей задаётся в диалоговом окне Коды полей (пункт Параметры, меню Сервис). Вы можете управлять выводом на экран с помощью оператора ToggleFieldDisplay.
Аргумент:
0 – выводить результат вычисления поля;
1 – выводить коды полей.
Оператор ToggleFieldDisplay меняет режим отображения полей на экране на противоположный, дополняя таким образом оператор ViewFieldCodes.
Функция ViewFieldCodes() возвращает следующие значения:
0 – если значение поля выводится на экран;
-1 – если выводится код поля.
Макрокоманды для макрокоманд
Команда ToolsMacro .Run имеет аргумент, который предназначен для следования иерархии контекста.
Если макро запускается из командной строки (например напечатав "WIN WINWORD /mMyMacro" из подсказки MS-DOS), Word ищет этот макрос сначала в шаблоне документа, затем в NORMAL.DOT и наконец среди встроенных команд. Эта иерархия сохраняется даже если макро имеет тоже самое имя, что и имя встроенной команды (такой как FilePrint).
Если вы запускаете макрокоманду с именем, совпадающим с именем встроенной макрокоманды, Word запустит встроенную.
Если команда ToolsMacro .Run запущена без задания аргумента .Show, то макрокоманда выполняется в контексте заданном при последнем выборе пункта Макрокоманда (Macro) в меню Сервис (Tools).
Если вы запустили макро на выполнение используя команду ToolsMacro .Run с аргументом .Show = 0, эта макрокоманда будет искаться в соответствии с принятой в Word иерархией поиска. В следующем примере Word ищет макрокоманду сначала в шаблоне документа, затем в NORMAL.DOT, и наконец среди встроенных макрокоманд.
ToolsMacro .Name = "mymacro", .Show = 0, .Run
Навигация по полям
Следующие операторы и функции позволяют перемещать точку вставки соответственно на следующее или предыдущее поле: NextField, NextField(), PrevField и PrevField()Оператор NextField выбирает следующее поле в документе, независимо от того, показывает поле свой код или результаты. NextField пропускает следующие форматированные как скрытый текст поля: XE (элемент индекса), TA, TC (элемент оглавления) и RD. Функция NextField() выполняет все те же действия, что и оператор, но кроме того возвращает следующие значения:
0 – больше нет полей;
1 – если IP перешла на следующее поле.
Если коды полей выводятся на экран, то для перехода к следующему полю с ними можно использовать оператор EditFind (включая XE, TA, TC и RD). Задайте "^d" (это код символа для поля) в качестве текста для аргумента .Find, как показано в примере:
ViewFieldCodes 1
EditFind .Find = "^d", .Direction = 0, .Format = 0
Чтобы найти только поля XE, задайте в качестве текста для поиска "^d XE".
Понятно, что PrevField и PrevField() делают тоже самое, только по отношению к предыдущему полю.
Об операции вставки
Оператор Insert вставляет текст в то место документа, где находится IP. Если IP внутри выделенного текста, то этот текст будет замещен вставляемым текстом, если в Сервис·Опции·Редактирование установлен флаг "Режим забивки символов при вводе". Вставляемый текст не форматирован – на него распространяется оформление от текста,
находящегося слева. Если вставляемый текст нужно оформить каким-либо другим способом, то перед вставкой следует применить соответствующее форматирование:
Sub MAIN
Bold 1 ' выделить полужирным
Insert "Внимание!"
Bold 0 ' убрать полужирный
Insert "Сравните результат."
End Sub
Еще один пример, хорошо иллюстрирующий несколько необычную логику работы WordBasic при выделении части текста:
ParaDown 1 ' перейти в конец абзаца;
' ! IP может находиться в середине абзаца
ParaUp 1,1 ' в начало абзаца c выделением его
If Selection$() = Chr$(13) Then
MsgBox "Пустая строка."
End If
Этот фрагмент можно использовать в макрокоманде подсчитывающей число абзацев в документе (пустую строку абзацем не считаем):
Sub MAIN
StartOfDocument
Count = 0
While ParaDown()
ParaUp 1, 1
If Selection$() <> Chr$(13) Then Count = Count + 1
ParaDown 1, 0
Wend
MsgBox "Абзацев: " + Str$(Count-1)
End Sub
Три специальных формы оператора Insert:
InsertSectionBreak
InsertPageBreak
InsertColumnBreak
InsertSectionBreak
Синтаксис:
InsertSectionBreak
Пример.
Sub MAIN
FileNewDefault
ViewPage
For count = 1 To 50
Insert "This is a test."
InsertPara
Next count
StartOfDocument
LineDown 15
InsertSectionBreak
LineDown 15
InsertSectionBreak
LineUp 5
WindowArrangeAll
FilePageSetup .TopMargin = "1" + Chr$(34), .BottomMargin = "1" +
Chr$(34), .LeftMargin = "2.75" + Chr$(34), .RightMargin = "2.75" +
Chr$(34)
End Sub
InsertPageBreak
Синтаксис:
InsertPageBreak
Пример.
Sub MAIN
FileNewDefault
For count = 1 To 5
Insert "This is a test of page breaks."
InsertPageBreak
Next count
Insert " This text should be on page 6"
End Sub
Оператор InsertColumnBreak
Синтаксис:
InsertColumnBreak
Пример.
Sub MAIN
FileNewDefault
ViewPage
FormatColumns .Columns = "2"
For count = 1 To 50
Insert "This is a test."
InsertPara
Next count
StartOfDocument
LineDown 25
InsertColumnBreak
End Sub
Следующие операторы не имеют аргументов:
InsertSound
InsertWordArt
InsertChart
InsertDrawing
InsertEquation
InsertExcelTable
InsertField "quote" + Chr$(34) + Name$ + Chr$(34)
InsertDatabase
Синтаксис:
InsertDatabase [.Format = number] [, .Style = number]
[, .LinkToSource = number] [, .Connection = text]
[, .SQLStatement = text] [, .SQLStatement1 = text]
[, .PasswordDoc = text] [, .PasswordDot = text] [, .DataSource =text] [, .From = text] [, .To = text] [, .IncludeFields = number]
Операции над ячейками
Ниже перечислены операторы и функции, выполняющие различные действия над ячейками таблицы. Некоторые из них имеют множество операндов, описание которых я здесь для экономии места опустил, так как оно имеется в Справке.TableInsertColumn – вставить новую колонку;
TableInsertRow – вставить новую строку;
TableInsertTable – создать таблицу;
TableRowHeight – изменить высоту строк таблицы;
TableMergeCells – объединить выделенные ячейки в одну. Удобен для оформления заголовков таблицы.
TableSort – сортировка ячеек таблицы.
Table DeleteColumn – удаляет колонку, содержащую точку вставки.
TableDeleteRow – удаляет строку, содержащую точку вставки.
TableDeleteCells – удаляет выделенные ячейки. Если IP находится вне таблицы, возникает ошибка. У этого оператора может быть аргумент, который существенно расширяет его возможности:
TableDeleteCells.ShiftCells = число
0 или опущено – после удаления ячейки, остальные сдвигаются влево;
1 – сдвигать вверх;
2 – удалить целиком строку;
3 – удалить целиком столбец.
Примеры:
1. Оставить в таблице 10 последних строк.
TableSelectTable
StartOfRow
While SelInfo(15) > 10 Then
TableDeleteRow
Wend
2. Добавить строку в конец таблицы.
TableSelectTable
CharRight
TableInsertRow
3. Выделить четыре строки таблицы.
For i = 1 To 4
TableSelectRow
LineDown
Next i
Следующие два примера представляют собой часть макрокоманд для удаления строки или столбца без их предварительного утомительного выделения.
4. Удаление столбца.
If SelInfo(12) <> -1 Then Stop
TableDeleteColumn
5. Удаление строки.
If SelInfo(12)<> -1 Then Stop
TableDeleteRow
Перевод текста в таблицу
Оператор FieldSeparator и функция FieldSeparator$()
Оператор FieldSeparator$ устанавливает символ-разделитель, заданный аргументом Разделитель$, для того, чтобы можно было распределить текст по ячейкам таблицы при выполнения оператора TextToTable. Так если у вас данные разделены в тексте знаком(!), то перед конвертированием в таблицу следует выполнить макрос с оператором FieldSeparator$
"!".
Функция FieldSeparator$() возвращает текущее значение символа-разделителя.
Синтаксис:
FieldSeparator$ Разделитель$
FieldSeparator$()
Пример.
Сначала проверяется текущее значение разделителя полей. Если разделителем служит знак %, то преобразовать текст в таблицу, иначе сохранить текущее значение, изменить его на %, конвертировать, после чего восстановить сохранённое значение.
Sub MAIN
If FieldSeparator$() = "!" Then
TextToTable
Else
fs$ = FieldSeparator$()
FieldSeparator$ "!"
TextToTable
FieldSeparator$ fs$
End If
End Sub
Операции над закладками
Оператор EditBookmark позволяет вам создать (удалить или перейти на) собственную закладку для места, где находится IP. Особенно часто нужны временные закладки, действующие только во время работы макрокоманды:EditBookmark .Name = "tmp", .Add
Задание. Разберите пример использования этого оператора, приведённый в Справке к WinWord 7.0.
Оператор EditBookmark полностью соответствует опциям диалогового окна "Закладка" (Правка·Закладки...). Поэтому, созданные им закладки появятся в этом окне и будут доступны через меню WinWord. Формат оператора:
EditBookmark .Name=текст,[SortBy=число][,.Add][,.Delete][,.GoTo]
Аргумент
|
Аргумент |
Назначение |
|
SortBy |
Задаёт порядок сортировки закладок при их выводе в списках: по алфавиту (0), по местоположению (1) |
|
Add |
Добавить закладку (значение по умолчанию, если другие аргументы не заданы) |
|
Delete |
Удалить закладку |
|
GoTo |
Переместить точку вставки по местоположению закладки |
Операторы SetStartOfBookmark и SetEndOfBookmark помечают соответственно начало и конец выделенного элемента текста. Например:
myMark$ = "StartPoint"
SetStartOfBookmark "\Sel", myMark$
myMark1$ = "EndPoint"
SetEndOfBookmark "\Sel", myMark1$
.....
EditGoTo .Destination = myMark$
Предлагаемая в Справке
форма записи:
SetEndOfBookmark "\Sel", "EndPoint"
по непонятной для меня причине не работает.
Число закладок в документе возвращает функция Countbookmarks(), их имена – функция BookmarkName$(номер). Аргументом этой функции является номер
закладки в списке закладок документа (принимает значения от 1 до n, где n – общее число закладок в документе). Если аргумент функции не задан, возникает ошибка. Закладки следуют в этом списке в том порядке, в каком они встречаются в документе. Чтобы получить этот список, можно воспользоваться макрокомандой, приведённой в Справке. Обратите внимание, что массив в этом примере создаётся динамически.
Sub MAIN
всегоЗакладок = CountBookmarks()
размерМассива = всегоЗакладок - 1
Dim Закладки$(размерМассива)
For n = 0 To размерМассива
Закладки$(n) = BookmarkName$(n + 1)
MsgBox Закладки$(n)
Next n
End Sub
Функция GetBookmark$ (имя) считывает неформатированный текст, помеченный указанной закладкой. Если имя не является именем закладки в активном документе, то возвращается пустая строка.
Примеры:
1. Использование закладки /Cell и функции GetBookmark$ позволяет считать в переменную содержимое ячейки таблицы.
A$ = GetBookmark$("\Cell")
2. Считать в переменную second$ текст второй закладки документа.
second$ = GetBookmark$(BookmarkName$(2))
3. Считать в переменную текст абзаца, содержащего точку вставки.
текстАбзаца$ = GetBookmark$("\Para")
4. Текущую страницу (абзац, строку) документа можно выбрать с помощью команды EditGoTo с аргументом "\Page" (соответственно "\Para", "\Line"). При этом выделяется текущая страница (абзац, строка) целиком.
Sub MAIN
EditGoTo "\Page"
End Sub
Другая функция, CmpBookmarks(Закладка_1, Закладка_2), сравнивает две закладки и возвращает число соответствующее относительному положению и размерам закладок. Она используется для того чтобы организовать выполнение макрокоманды внутри определенного участка текста.
Интересны значения,
возвращаемые этой функцией сравнения:
0 – Закладка_1 и Закладка_2 эквивалентны;
1 – Закладка_1 полностью ниже Закладки_2;
2 – Закладка_1 полностью выше Закладки_2;
3 – Закладка_1 ниже и внутри Закладки_2;
4 – Закладка_1 внутри и выше Закладки_2;
5 – Закладка_1 включает в себя Закладку_2;
6 – Закладка_2 включает в себя Закладку_1;
7 – Закладка_1 и Закладка_2 начинаются в одной точке, но Закладка_1 длиннее;
8 – Закладка_1 и Закладка_2 начинаются в одной точке, но Закладка_2 длиннее;
9 – Закладка_1 и Закладка_2 заканчиваются в одной точке, но Закладка_1 длиннее;
10 – Закладка_1 и Закладка_2 заканчиваются в одной точке, но Закладка_2 длиннее;
11 – Закладка_1 расположена ниже и примыкает к Закладке_2
12 – Закладка_1 расположена выше и примыкает к Закладке_2
13 – одна из двух закладок не существует.
!!!Оператор InsertBookmark
– в Word 6.0 не существует.
Функция EmptyBookmark(Имя$) позволяет проверить, "пустая" закладка или нет. Пустая закладка определяет только местоположение для точки вставки в документе, но не помечает какой-либо текст. Функция возвращает -1, если закладка пустая, 0, если не пустая или не существует.
Существование закладки можно проверить с помощью функции ExistingBookmark(Имя$). Аналогично, она возвращает -1, если закладка существует, 0, если нет.
Оператор CopyFile
CopyFile позволяет переписать указанный файл в другой каталог. Синтаксис и работа этого оператора аналогичны команде COPY в MS-DOS.Синтаксис:
CopyFile ИмяФайла$, Каталог$
Если в аргументе ИмяФайла$ не указан дисковод или имя файла, то он копируется из текущего каталога. В параметре Каталог$ следует указать полный путь до данного каталога. Если в каталоге, куда копируется файл, уже существует файл с таким же именем, то появится запрос, хотите ли вы его заменить.
Следующая макрокоманда скопирует файл WINBAS3.DOC из каталога C:\EDWARD в каталог A:\SAVE:
Sub MAIN
CopyFile "C:\edward\winbas3.doc", "A:\save"
End Sub
GetAttr()
Программирование диалогов (Занятие №5)
Начнём как обычно с примера из повседневной жизни. Мне потребовалось “втащить” в Word файл из базы данных, в которой записи состояли из двух полей: текстового и числового. Так как записи между собой ничем не разделены и имеют разную длину, то разделить их могла помочь только макрокоманда. Вручную это заняло бы неделю. Вот эта макрокоманда, по примеру которой вы можете решать свои задачи подобного типа.
В ней по всему тексту ищется начало строки, начинающейся с прописной латинской буквы "A". Затем проверяется, предшествует ли найденной букве цифра и, если "да", между ними вставляется символ "возврат каретки". Затем всё повторяется для следующей буквы алфавита и т. д.
Sub MAIN
For i = 0 To 25
StartOfDocument
While Not AtEndOfDocument()
EditFind .Find = Chr$(65 + i), .MatchCase = 1, .WholeWord = 0
If EditFindFound() = - 1 Then
CharLeft 2, 0 ' выделить предшествующий знак
CharRight 1, 1
b$ = Selection$()
CharRight 1, 0
If (B$ >= "0") And (B$ <= "9") Then Insert Chr$(10)
CharRight 3, 0 ' продолжить поиск
Else
Goto eloop
EndIf
Wend
eloop:
Print i
Next i
End Sub
В отличие от профессионального программирования, на языке WordBasic приходится писать от случая к случаю, когда в этом возникает реальная потребность.
Поэтому детали языка, содержащего в последней версии более 600 операторов, забываются и под рукой желательно иметь какой-либо справочник, в частности, WordBasic Reference. К сожалению, этот встроенная справочная система в Word 7 для Windows 95 (как в Word 6.0) не переведена на русский язык при локализации, тем не менее, я рекомендую обязательно указывать её при инсталляции этого пакета.
Второй процесс, доставляющий немало мучений -- отладка макрокоманды. Для отладки следует загрузить в качестве тестового примера фрагмент или копию документа, к которому вы хотите применить разрабатываемый макрос. Как правило работа макрокоманды очень наглядна из-за перемещения курсора, выделения, удаления и вставок текста и других действий. Поэтому макрокоманду удобно отлаживать в пошаговом режиме предварительно выбрав в меню Окно
пункт Расположить все. Тогда в двух окнах на экране одновременно видно и исполняемую строку макрокоманды и результат её действия над текстом документа.
Следующая макрокоманда позволяет выделить полезную информацию из строки, где ей предшествует нечто, обозначенное в строке поиска как признак1, а после неё следует признак2, например так:
Всё что угодно
признак1нужные данные признак2 всё что угодно
Обратите внимание на работу операторов StartOfLine и EndOfLine с признаками выделения текста.
Sub MAIN
StartOfDocument
While Not AtEndOfDocument()
StartOfLine
EditFind .Find = "признак1", .Direction = 0, \
.WholeWord = 0, .MatchCase = 1
If EditFindFound() Then
EditCut
StartOfLine 1
EditCut
End If
EditFind .Find = "признак2", .Direction = 0, \
.WholeWord = 0, .MatchCase = 1
If EditFindFound() Then
EditCut
EndOfLine 1
EditCut
End If
LineDown
Wend
End Sub
На третьем занятии были кратко рассмотрены операторы Print и MsgBox, используемые для взаимодействия с пользователем из макрокоманды.
Оператор Print может применяться для вывода в файл, на принтер или, по умолчанию, в строку статуса на экране.
Синтаксис оператора Print при выводе в строку статуса:
Print ИмяПеременной1[$],ИмяПеременной2[$], ...
Например:
Sub Main
Print "Лена"
A$="Наташа"
Print A$
End Sub
Результат работы первого оператора Print можно увидеть только при пошаговом выполнении этой макрокоманды, потому что он остаётся в ней до выполнения следующего оператора Print. Чтобы избежать этого, между ними следует вставить операторы задержки времени, например ничего не делающий цикл.
Sub MAIN
Print "Лена"
For i = 0 To 4096 : Next
A$ = "Наташа"
Print A$
End Sub
Операнды оператора
Print могут разделяться точкой с запятой, запятой или соединяться с помощью операции конкатенации (сцепления). Если операнды отделены друг от друга запятыми, то при печати между ними вставляется символ табуляции. Следующая макрокоманда показывает как используется конкатенация:
Sub Main
ИмяДевочки$ = "Оля"
ИмяМальчика$ = "Саша"
Print ИмяДевочки$ + " и " + ИмяМальчика$ + " пошли на танцы."
End Sub

В реальной жизни конкатенация используется для печати более прозаических сообщений. Вот пример макрокоманды, выводящей строку на LPT1.
Sub MAIN
x = SelInfo(27)
If x = - 1 Then MsgBox "Текущее окно – окно макросов!"
Open "lpt1.dos" For Output As #1
Print #1, "Вывод строки на печать"
End Sub
Первые две строчки позволяют избежать получения сообщения об ошибке “Command is unavailable” при выполнении макрокоманды, если активное окно – это окно редактирования макрокоманд. Эта проблема возникает из-за того, что некоторые макрокоманды не могут выполняться, если активным окном является окно макрокоманд.
Наиболее удобно то, что в операторе Print можно перемешивать в списке операндов строковые переменные с числовыми и числами. Часто для отладки выводятся сообщения типа:
Print "Преременная Name = "; Name; "Index =
"; Index
При этом строка статуса примет следующий вид:

Наконец, как и в обычном Бейсике операндами Print могут быть арифметические выражения, функции, выражения с функциями и т. п.
Теперь рассмотрим более интересный оператор MsgBox, позволяющий получать фиксированные ответы пользователя. Оператор и функция MsgBox, выводит только символьные строки. Синтаксис оператора MsgBox:
MsgBox сообщение$ [,заголовок$] [,тип]
где, сообщение$ -- это выводимый текст, необязательный заголовок$, , -- заголовок окна, в котором выводится сообщение. Если она опущена, то заголовок окна - "Microsoft Word". Например:
MsgBox "Удалить абзац?", ,3

<рис.>
Третий операнд делает оператор MsgBox более гибким и полезным.
Этот операнд формируется как сумма двух слагаемых: кода числа кнопок и кода выводимой в окне пиктограммы.
Код числа и значений выводимых в окне клавиш
0 - OK (по умолчанию)
1 - ОК, Отмена,
2 - Прервать, Повторить, Пропустить
3 - Да, Нет, Отмена
4 - Да, Нет
5 - Повторить, Отмена
Код выводимой в окне пиктограммы
0 - не выводится ничего (по умолчанию)
16 - знак "Stop"
32 - знак вопроса (?)
48 - восклицательный знак (!)
64 - пиктограмма "Информация" (i)

Код кнопки, принятой по умолчанию
0 - первая кнопка (по умолчанию)
256 - вторая кнопка
512 - третья кнопка
Если в качестве третьего операнда задать числа -1, -2 или -8, то вывод информации, как и в операторе Print будет осуществляться в строку статуса, но выведенный текст не исчезнет сразу, а сохранится до выполнения некоторого условия:
-1 - сообщение сохраняется до вывода следующего сообщения (и необязательно в строку статуса);
-2 - до нажатия клавиши на клавиатуре или кнопки мыши;
-8 - как и -2, но на полную строку статуса.
Функция MsgBox() отличается от оператора MsgBox тем, что возвращает значение нажатой кнопки:
-1 - нажата левая кнопка (первая);
0 - средняя (вторая);
1 - третья.
Ввод ответов в макрокоманду, когда нажатия кнопок в MsgBox недостаточно, можно осуществить и с помощью оператора InputBox$, который имеет следующий синтаксис:
Inputbox$ (подсказка$, [заголовок$],[по_умолчанию$])
где
подсказка$ - текст, выводимый в окне запроса;
заголовок$ - заголовок окна запроса;
по_умолчанию$ - значение по умолчанию, которое макрокоманда предлагает пользователю.
WordBasic позволяет создавать очень сложные диалоговые окна. Делается это либо “вручную” – с помощью соответствующих операторов, имеющих, как правило, множество параметров, либо с помощью редактора диалогов.
последнее предпочтительнее и нагляднее.
Оператор DrawSetInsertToTextbox
Перемещает точку вставки в область текста в заданном текстовом окне или пояснении в рисованном объекте. Попытка вставить текст в другие места рисованного объекта приводит к сообщениям об ошибке.Синтаксис:
DrawSetInsertToTextbox [номер_объекта]
Аргумент указывает, что за объект выбран.
0 – объект выделен
>0 – объект, якорь которого находится в диапазоне установленном с помощью оператора DrawSetRange.
Пример.
DrawSetRange "\Page"
If DrawGetType(2)= 3 Then
DrawSetInsertToTextbox 2
Insert "Текст, заполняющий текстовый блок"
End If
Оператор DrawSetInsertToAnchor
Перемещает точку вставки в начало абзаца, к которому “привязан” заданный рисованный объект.
Синтаксис:
DrawSetInsertToAnchor [номер_объекта]
номер_объекта – трактуется как и у предыдущего оператора.
Оператор InsertDrawing
Если у вас на машине установлен пакет Microsoft Draw, этот оператор запускает его на выполнение, тот загружается и выводит пустое окно для рисования. После окончания работы с Microsoft то, что вы в нём создали, вставляется в ваш активный документ. Как указано в Справке оператор InsertDrawing аналогичен оператору InsertObject .Class = "MSDraw".
Оператор DrawSnapToGrid
Устанавливает сетку для рисованного объекта.
Синтаксис:
DrawSnapToGrid .SnapToGrid = число [, .XGrid = число1 или текст] [, .YGrid = число или текст] [, .XOrigin = число или текст] [, .YOrigin = число или текст]
Пример.
Sub MAIN
DrawSnapToGrid .SnapToGrid = 2, .XGrid = "2 in", .YGrid = "2 in",\ .XOrigin = "2 in", .YOrigin = "1 in"
End Sub
Оператор EditFindLang
Когда следует за оператором EditFind или EditReplace, в которых аргумент .Format=1, задаёт язык, которым отформатирован текст, который вы хотите найти (оператор Language (меню Сервис) перечисляет имена языков в их английском написании).EditReplaceLang .Language = "Deutsch"
EditFindPara .LeftIndent = "1 in"
EditReplacePara .LeftIndent = "2 in"
EditReplace .Find = "", .Replace = "", .Format = 1, \
.ReplaceAll, .Wrap = 1
Приведенная ниже макрокоманда заменяет символ табуляции в начале строки принятым в WinWord стандартным отступом.
Sub MAIN
StartOfDocument
EditFind .Find = "^t"
While EditFindFound()
DeleteWord
LineDown
StartOfLine
EditFind
Wend
End Sub
Полезная макрокоманда: убрать по всему документу выделение текста полужирным шрифтом. Аналогично делается макрос, убирающий выделение курсивом или любое другое.
Sub MAIN
StartOfDocument
While AtEndOfDocument() <> - 1
WordRight
SelectCurWord
If Bold() <> 0 Then Bold 0
ShrinkSelection
Wend
End Sub
Оператор FileCloseAll
Закрывает все открытые файлы.
Синтаксис:
FileCloseAll [Save]
Пример.
Откроем два файла и закроем их.
Sub MAIN
FileNewDefault
Insert "Тестовая строка для первого файла."
FileNewDefault
Insert "
Тестовая строка для второго файла."
FileCloseAll 0
End Sub
Оператор FileSave сохраняет активный документ или шаблон. Если документ без имени, FileSave выводит на экран диалоговое окно Сохранить как.
Пример:
Sub MAIN
FileNewDefault
Insert "Тест №1 оператора FileSave"
FileSave
MsgBox "Окно <Сохранить как> не должно появиться.", - 1
Insert Chr$(13) + "Тест № 2 оператора FileSave . "
FileSave
End Sub
FileSaveAll [соханять][,в_формате]
первый аргумент задает второй (в_формате)
Функции IsDocumentDirty() возвращает -1, если документ изменялся после последнего его сохранения. Обычно используется в сочетании с оператором FileSave:
If IsDocumentDirty() = -1 Then FileSave
Для шаблонов существует аналогичная функция IsTemplateDirty().
Документы, шаблоны и др.
AddAddIn, AddAddIn()
AddInState, AddInState()
ClearAddIns
Converter$()
ConverterLookup()
CopyFile
CountAddIns()
CountDocumentVars()
CountFiles()
CountFoundFiles()
DeleteAddIn
DisableInput
DocClose
DocumentStatistics
FileConfirmConversions, FileConfirmConversions()
FileFind
FileList
Функция FileName$() возвращает имя файла документа и путь. Следующая макрокоманда поместит полное имя файла туда, где находится точка вставки (IP).
Sub MAIN
fn$=FileName$()
Insert fn$
End Sub
Следует учесть, что если IP находится внутри верхнего или нижнего колонтитула, то вставка имени файла не производится, так как Word рассматривает колонтитулы как отдельные от окна документа окна и функция FileName$() не знает, какое имя вернуть.
FileNameFromWindow$()
FileNameInfo$()
FileNew
FileNewDefault
Оператор FontSubstitution
Синтаксис:
FontSubstitution .UnavailableFont = текст1, .SubstituteFont = текст2
устанавливает опцию отображения шрифта для активного документа. Аргументы оператора FontSubstitution соответствуют диалогового окна Font Substitution (Compatibility tab, диалоговое окно Параметры, меню Сервис).
Аргументы:
UnavailableFont – имя шрифта, отсутствующего на вашем компьютере, который вы хотите заменить другим шрифтом для вывода на экран и на печать;
SubstituteFont – имя шрифта, имеющегося на вашем компьютере, которым заменяется отсутствующий шрифт.
Оператор InsertField
Вставляет заданное поле в точку вставки (IP).Синтаксис:
InsertField .Field = текст
Аргумент
.Field тип поля и инструкция по вставке. Чтобы получить информацию о каждом конкретном поле, включая синтаксис и примеры выберите это поле в диалоговом окне Поле
меню Вставка, а затем нажмите клавишу F1. Аргумент Field может быть длинной до 255 знаков. Не включайте в текст
фигурные скобки. Для вставки в текст
кавычек используйте Chr$(34).
Оператор InsertFieldChars вставляет в IP символы поля, т.е. фигурные скобки ({}), а затем позиционирует IP между символами поля.
Оператор LockDocument и функция LockDocument()
Sub MAIN
If SelInfo(27) = - 1 Then FileNew
ViewMasterDocument
Insert "This is a Master document"
InsertPara
FileSaveAs .Name = "C:\MACROMST.DOC", .AddToMru = 1
CreateSubdocument
LineDown 2
LineUp 1
Insert "Это поддокумент 1."
FileSaveAs .Name = "C:\MSSUB1.DOC", .AddToMru = 1
LineDown 2
CreateSubdocument
LineDown 1
Insert "Это поддокумент 2."
FileSaveAs .Name = "C:\MSSUB2.DOC", .AddToMru = 1
LineUp 3
MsgBox "Word will now lock sub document1. Note the padlock on the left."
LockDocument
If LockDocument() = - 1 Then
MsgBox "The File is now locked. Нажмите OK, чтобы возобновит demo."
MsgBox "Теперь Word разблокирует поддокумент 1."
MsgBox "Note the padlock is no longer there."
LockDocument
FileClose 1
Kill "C:\MACROMST.DOC"
Kill "C:\SUB1.DOC"
Kill "C:\SUB2.DOC"
End Sub
Оператор OutlineShowFormat
Выводит символ в режиме просмотра структуры или, если форматирование символа уже показано на экране, прячет его. Если активный документ не в режиме просмотра структуры документа или не главный документ, возникает ошибка.Синтаксис:
OutlineShowFormat
Пример.
Переключает форматирование символов в и из Разметка страницы (меню Вид):
Sub MAIN
On Error Goto notolview
OutlineShowFormat
Goto exit
notolview:
MsgBox "Чтобы переключиться на просмотр структуры документа используйте команду OutlineShowFormat"
exit:
End Sub
Оператор SymbolFont
Форматирует выделенный текст шрифтомSymbol или помещает в точку вставки заданную его аргументом строку текста, отформатированную этим шрифтом. Если нет выделенной области и не задан аргумент, то никаких действий не производится. Честно говоря, я не знаю зачем в язык введён этот оператор, так как практического применения ему пока не нашёл.
Синтаксис:
SymbolFont [Вставляемый_в_документ_текст]
Пример.
Чтобы посмотреть, как работает эта макрокоманда выделите строку текста и выполните макрокоманду, затем переместите куда-нибудь точку вставки и снова запустите макрос.
Sub MAIN
SymbolFont "Тестовая строка."
End Sub
С этим шрифтом связан более осмысленный оператор, который называется InsertSymbol. Он позволяет вставить в текст по месту IP отдельный специальный символ из набора декоративных шрифтов (например, стрелку специального вида и т.п.):
Синтаксис:
InsertSymbol .Font = "имя_шрифта", .Tab = число, CharNum = "код_символа"
где:
имя_шрифта – название гарнитуры (см. пример), содержащей вставляемый символ. Названия шрифтов можно посмотреть в диалоговом окне Символ, если выбрать в меню Вставка пункт Символ;
число – задаёт вид табуляции для некоторого специального случая (см. Справку);
код_символа – номер символа в таблице символов данного шрифта, считая слева направо, плюс 31 (из-за того что в этой таблице не показаны непечатаемые символы). Обратите внимание, что число символов в строке таблицы равно 28, а не 32, как принято у программистов при построении таких таблиц. Почему так через голову сделано, догадаться невозможно. Логика ребят из Microsoft иногда совершенно убойная.
Пример.
InsertSymbol .Font = "Symbol", .CharNum = "96"
Скрытый текст
Оператор Hidden и функция Hidden() позволяют работать со скрытым текстом.
Синтаксис:
Hidden [Argument]
|
Аргумент |
Пояснение |
|
1 |
Включить форматирование “скрытый текст” |
|
0 |
Удалить форматирование “скрытый текст” |
|
Опущен |
Переключает форматирование на противоположное |
Пример.
Сделать скрытым выделенный фрагмент текста:
Sub MAIN
Insert "Тестовая строка"
StartOfLine 1
Hidden 1
End Sub
Оператор ToolsAddRecordDefault
Добавляет пустую запись к концу источника данных. Если это таблица, то добавляет строку внизу таблицы.
Оператор
ShadingPattern Тип
ShadingPattern()
Пример.
Вставить в документ таблицу и добавить тень к первой строке.
Sub MAIN
StartOfDocument
TableInsertTable .NumRows = 5, .NumColumns = 3
StartOfDocument
TableSelectRow
MsgBox "Shading is off and ShadingPattern() returns a" +\
Str$(ShadingPattern())
ShadingPattern 17
MsgBox "Shading is on and ShadingPattern() returns a" +\
Str$(ShadingPattern())
StartOfDocument
End Sub
Оператор ToolsBulletListDefault
Синтаксис:
ToolsBulletListDefault
Пример.
Отформатировать выделенный текст в виде списка, поставив перед каждым его элементом символ по умолчанию (жирную точку):
Sub MAIN
ToolsBulletListDefault
End Sub
Оператор ToolsProtectDocument
Этот оператор служит для установления режима защиты документа от модификации, когда тот открыт. В зависимости от значения параметра .Type, пользователь может сделать изменения лимитированными, например, разрешить добавление аннотаций или отметок изменений. Если документ уже защищён, возникает ошибка.Синтаксис:
ToolsProtectDocument [.DocumentPassword = текст] [, .NoReset = число_1] [, .Type = число_2]
Аргументы:
.DocumentPassword – пароль требуется для того, чтобы с документа можно было снять защиту (пункт Снять защиту в меню Сервис).
.NoReset – если 1, Word не сбрасывает поля форм в их значения по умолчанию, если форма защищена от изменений с помощью оператора ToolsProtectDocument
(действует только, если атрибут .Type=2).
.Type – тип защиты:
0 (по умолчанию)-- пользователи могут выделять и редактировать текст, но все изменения отмечаются маркерами изменений;
1 – пользователи могут добавлять только;
2 – пользователи могут выделять и модифицировать текст в полях форм.
Чтобы задать какие секции из многосекционной формы должны быть защищены, а какие нет, воспользуйтесь оператором ToolsProtectSection.
Пример:
Эта макрокоманда защищает документ от редактирования. Оно станет возможно после того как защита будет снята.
Sub MAIN
Insert "Этот документ защищён и не может быть изменён."
InsertPara
Insert "Выберите Снять защиту из меню Сервис."
ToolsProtectDocument .Type = 2
End Sub
Функция DocumentProtection().
Возвращает значение, задающее режим защиты активного документа. Чтобы изменить его, используйте ToolsProtectDocument. В
Word 6.0, DocumentProtection() недоступна и генерирует ошибку.
Возвращаемые значения.
0 (нуль) – Документ не защищен.
1 – Пользователь может выбирать и модифицировать текст в поле формы.
2 – Пользователь может только добавить аннотации.
3 – Пользователь может выбирать и редактировать текст, но все изменения трассируются с маркерами изменений.
Задает, что текст, который вы хотите найти или заменить, выделен.
Оператор EditFindHighlight
Когда этот оператор следует за EditFind или EditReplace, в которых параметр .Format установлен в 1, то задает, что текст, который вы хотите найти выделен яркостью. Word ищет любой выделенный текст, даже если в одном документе для выделения были использованы различные цвета. В Word 6.0, EditFindHighlight недоступна и генерирует ошибку.
Пример.
Находятся все вхождения в документ выделенного текста, убирается выделение, а сам текст делается полужирным.
EditFindClearFormatting
EditReplaceClearFormatting
EditFindHighlight
EditReplaceFont .Bold = 1
EditReplaceNotHighlight
EditReplace .Find = "текст", .Replace = "текст1", .Format = 1, .ReplaceAll
EditFindNotHighlight. Задает, что текст, который вы хотите найти или заменить, не выделен. Когда этот оператор следует за EditFind или EditReplace, в которых параметр .Format установлен в 1, то задает, что текст, который вы хотите найти не выделен яркостью. В Word 6.0, EditFindNotHighlight недоступна и генерирует ошибку.
EditReplaceNotHighlight. Когда этот оператор следует за EditReplace, в которой параметр .Format установлен в 1, то задает, что текст, который вы хотите найти не выделен яркостью.
Работа с отступами
При вставках текста часто бывает полезно добавить или убрать отступ у абзаца или строки. Это делается с помощью следующих простых операторов:
indent – делает отступ или добавляет отступ до следующей позиции табуляции;
unindent
– убирает отступ или уменьшает его до предыдущей позиции табуляции;
HangingIndent – создаёт висячий отступ либо увеличивает существующий висячий отступ выделенного абзаца до следующей позиции табуляции первого абзаца в выделенном блоке текста.
UnHang – уменьшает висячий отступ выделенного абзаца или уменьшает его до предыдущей позиции табуляции первого абзаца в выделенном блоке текста.
Для своего текстового справочника по фирмам я использую следующую макрокоманду:
Sub MAIN
Indent
Insert "lch=" + Date$()
EndOfLine 1
l$ = Selection$()
EditCut
If l$ > 0 Then UnIndent
End Sub
Она вставляет в текст строку с датой последнего внесения изменения в запись (last change, lch), затем убирается предыдущая запись и уменьшается отступ. Конечно, этот макрос можно написать короче и более “жестко”: сразу удалить строку и вставить новую дату, но мне мешает программистский менталитет (появляется возможность ошибочно удалить не ту строку и явно нужно проверять та ли строка удаляется).
Цветовое оформление текста
Оператор CharColor устанавливает цвет символов выделенного фрагмента текста соответственно заданному аргументу. Функция CharColor() возвращает код цвета выделенного текста.
Синтаксис:
CharColor <цвет>
где цвет
– числовой код для одного из следующих цветов, поддерживаемых в Word 2.0 и 6.0 для Windows:
|
Код цвета |
Название цвета |
|
0 |
Auto (цвет, заданный установкой на Control Panel) |
|
1 |
Black |
|
2 |
Blue |
|
3 |
Cyan |
|
4 |
Green |
|
5 |
Magenta |
|
6 |
Red |
|
7 |
Yellow |
|
8 |
White |
|
9 |
Dark Blue |
|
10 |
Dark Cyan |
|
11 |
Dark Green |
|
12 |
Dark Magenta |
|
13 |
Dark Red |
|
14 |
Dark Yellow |
|
15 |
Dark Gray |
|
16 |
Light Gray |
Функция CharColor() возвращает или те же самые номера цветов, которые установлены оператором CharColor, или значение -1, если весь выделенный фрагмент текста не одного цвета. Ниже дан пример использования этой функции:
Sub MAIN
n = CharColor()
If n = - 1 Then Print "В выделенном фрагменте используется более чем один цвет "
End Sub
Следующая макрокоманда вставляет слово "Color", отформатированное для каждого из 16 возможных цветов
Sub MAIN
For count = 1 To 16
CharColor count
Insert "Color"
WordLeft 1, 1
CharRight
InsertPara
Next
End Sub
В Word 7.0 появился оператор HighlightColor цвет, позволяющий устанавливать цвет
для выделенного текста и функция HighlightColor(), возвращающая номер используемого цвета, либо признак (-1 – текст выделен разными цветами, 0 – нет выделения цветом).
Номера цветов, как и у оператора CharColor. В Word 6. 0 использование этих операторов будет генерировать ошибку.
Обработка ошибок
Когда макрокоманда пытается выполнить что-то недопустимое в Word или когда выполнение заданного действия по тем или иным причинам невозможно (например открытие несуществующего файла), он сообщает вам об этом выводя на экран сообщение специального вида. Эти сообщения отличаются от сообщений об ошибках при написании макрокоманды.

После вывода такого сообщение выполнение макрокоманды прекращается и продолжить его с этого места уже нельзя, что очевидно не всегда хорошо.
Однако в WordBasic есть встроенные средства для обработки ошибочных ситуаций. Например вы попытались создать закладку с недопустимым именем. Вместо того, чтобы перезапускать макрокоманду, иногда легче предусмотреть в ней данную ситуацию. Это становится важным, если вы разрабатываете макрокоманды не для себя и если она выполняется часто. конечно нужно избегать крайностей. Старая шутка гласит, что программист забивает всю память компьютера сообщениями об ошибках.
Каждая ошибка в WordBasic имеет свой номер, который можно получить в макрокоманде с помощью функции
Автокоррекция
Эта возможность позволяет при редактировании быстро производить замены.
Оператор GetAutoCorrect$(имя_входа$) возвращает замещающий текст, по имени этого элемента. Если имя_входа$ не существует, возвращается пустая строка. Операнд имя_входа$ не зависит от регистра.
If GetAutoCorrect$("м2") <> "м²" Then
ToolsAutoCorrect .Replace = " м2", .With = "м²", .Add
End If
ToolsAutoCorrectDays, ToolsAutoCorrectDays()
ToolsAutoCorrectInitialCaps, ToolsAutoCorrectInitialCaps()
ToolsAutoCorrectReplaceText, ToolsAutoCorrectReplaceText()
ToolsAutoCorrectSentenceCaps, ToolsAutoCorrectSentenceCaps()
ToolsAutoCorrectSmartQuotes, ToolsAutoCorrectSmartQuotes()
Автотекст
Функция CountAutoTextEntries(). Как обычно функция, имя которой начинается с Count, возвращает число записей в таблице Автотекста.Соответствующая ей функция AutoTextName$(номер) возвращает имя записи, номер которой задан в качестве аргумента.
Оператор AutoText. Если есть выделенный текст, выводит на экран диалоговое окно Автотекст и предлагает использовать первые 32 символа в качестве уникального имени записи в таблице Автотекста. Если выделенного текста нет, пытается сравнить текст до и после точки вставки с записями в таблице и, если находит совпадение, производит замену. Word просматривает записи сначала в активном шаблоне, затем в Normal и в последнюю очередь в каждом загруженном глобальном шаблоне (их список и порядок следования можно посмотреть в диалоговом окне Шаблоны и настройки меню Файл
пункт Шаблоны). Если совпадение не найдено, генерируется сообщение об ошибке.
EditAutoText
GetAutoText$()
InsertAutoText
Organizer
SetAutoText
Оператор ToolsRemoveRecordDefault
Этот оператор удаляет запись БД, на которой в момент его исполнения находилась точка вставки. В частности удаляет строку таблицы, если БД находится в таблице.Пример.
Создать набор полей, а затем удалить запись в которой находится IP.
Sub MAIN
TableInsertTable .NumRows = 2, .NumColumns = 3
StartOfTable
Insert "Ф.И.О." : NextCell : Insert "Адрес" : NextCell
Insert "Телефон" : NextCell : Insert "Виктор Бегтин": NextCell
Insert "Москва" : NextCell : Insert "123-4567"
ToolsRemoveRecordDefault
End Sub
Оператор ViewBorderToolbar
Пример макрокоманды, активно использующей закладки
Sub MAIN
If Len(Selection$()) = 1 Then
EditGoTo .Destination = "\Para"
EndIf
ToolsBulletsNumbers .Type = 0, .Replace = 1, .Remove
InsertBookmark .Name = "bulletselection"
CharLeft 1
n = CmpBookmarks("\Sel", "bulletselection")
While n = 8 Or n = 6
CharRight 1, 1
If Asc(Selection$()) = 9 Then
EditClear
Else
CharLeft 1
EndIf
Insert "X"
CharLeft
ToolsBulletListDefault EditClear
EndOfLine
n = CmpBookmarks("\Sel", "\EndOfDoc")
If n <> 0 Then
ParaDown
StartOfLine
n = CmpBookmarks("\Sel", "bulletselection")
EndIf
Wend
EditGoTo .Destination = "bulletselection"
InsertBookmark .Name = "bulletselection", .Delete
End Sub
Оператор ViewOutline
Оператор ShowHeadingВ режиме просмотра структуры документа показывает все заголовки до заданного уровня включительно. Прячет подчинённые заголовки и текст.
Синтаксис:
ShowHeading Число
Число – целое число от 1 до 9. Это не параметр так как пишется слитно, а на самом деле 9 разных операторов, каждый для своего уровня заголовков. Сделано так очевидно для сокращения времени выполнения оператора (для его анализа требуется меньше действий). Недостаток лишь в том, что вместо числа
здесь нельзя задать переменную.
Пример. См. Справку.
Оператор ShowAllHeadings
В режиме просмотра документа показывает текст и заголовки. Перед ним по невнятной причине рекомендуют ставить оператор ShowHeading9.
Пример.
Перейти в режим просмотра структуры документа и установить режим вывода на экран всего текста:
Sub MAIN
ViewOutline
ShowHeading9
ShowAllHeadings
End Sub
Оператор ViewToggleMasterDocument
Синтаксис:
ViewToggleMasterDocument
Пример.
Макрокоманда переключает новый документ между режимами “Структура документа” и “Главный документ”.
Sub MAIN
FileNewDefault
ViewOutline
MsgBox "Выберите OK, чтобы перейти в режим Главного документа."
ViewToggleMasterDocument
MsgBox "OK, чтобы вернуться в режим Структура документа."
ViewToggleMasterDocument
End Sub
Оператор WindowNewWindow
Синтаксис:WindowNewWindow
Пример.
Эта макрокоманда создаст новый документ, базирующийся на шаблоне NORMAL, открывает копию другого окна, а затем упорядочивает их на экране:
Sub MAIN
FileNew .Template = “Normal”
Insert “Это образец текста.”
WindowNewWindow
WindowArrangeAll
End Sub
Документ в окне можно максимизировать или минимизировать и, что иногда более важно, задать размеры (в пунктах) самого окна.
Оператор DocMaximize позволяет увеличить активное окно с документом до максимального размера в окне WinWord. Функция DocMaximize() возвращает значение -1, если окно максимизировано, и 0, если нет. Аналогично работают оператор DocMinimize и функция DocMinimize(), только в отношении минимизации окна документа.
Оператор DocRestore не имеет операндов. Он восстанавливает размеры окна документа, если оно был максимизировано или минимизировано. Например:
If DocMinimize() <> 0 Then DocRestore
Окно документа можно из макрокоманды разделить на два отдельных окна, чтобы увидеть на экране две его разных части, либо произвести перетаскивание кусков текста из одной части в другую. Это действие эквивалентно выбору пункта Разбить в меню Окно.
Оператор DocMove высота, ширина позволяет переместить активное в позицию, заданную его аргументами. Значения указываются в пунктах (1 пункт = 1/72 дюйма, мм). Начало координат (0,0) в верхнем левом углу экрана. Например,
If DocMaximize() = 0 Then DocMove 15, 35
перемести окно на 15 пунктов вправо и на 35 пунктов вниз, соответственно DocMove 0,0 перемещает его к левому краю экрана. Подробно это будет показано на примере.
Оператор DocWindowHeight высота устанавливает высоту окна, а функция DocWindowHeight() возвращает высоту активного окна. Аналогично оператор DocWindowWidth ширина и функция DocWindowWidth() работают с его шириной. Существует оператор, позволяющий сразу установить размеры окна:
DocSize ширина, высота
Несколько других операторов позволяют перемещать активное окно документа или его пиктограмму в пределах рабочей области.
Оператор DocWindowPosLeft позиция
даёт возможность переместить его на расстояние позиция
от левого края рабочей области. Если активное окно максимизировано, то выдаётся сообщение об ошибке, так как операция не может быть выполнена. Функция DocWindowPosLeft() возвращает величину этого расстояния.
Оператор DocWindowPosTop позиция и функция DocWindowPosTop() аналогичны DocWindowPosLeft, только отсчёт идёт от верхнего края рабочей области.
Пример, заимствованный из Справки:
Sub MAIN
по_горизонтали = DocWindowPosLeft()
по_вертикали = DocWindowPosTop()
MsgBox "От левого края:" + Str$(по_горизонтали) + Chr$(13) + \
"Пунктов от верхнего края:" + Str$(по_вертикали), "Позиция окна документа"
r = DocWindowHeight()
Print r
End Sub
Несколько операторов WordBasic служат для работы с панелями окна, при разбиении окна документа на две части (аналог Окно*Разбить, Окно*Удалить разбиение).
Разбиение окна выполняется с помощью оператора DocSplit. В качестве его аргумента задаётся процент от высоты окна, где следует произвести разбиение. Так аргумент равный 50 делит окно документа пополам. Хотя аргумент и может принимать значения от 0 (отсутствие разбиения) до 100, следует избегать значений, близких к концам этого интервала. Уже при 90%, например следующая макрокоманда начнёт выдавать сообщение об ошибке.
DocSplit 91
OtherPane
ClosePane
Оператор OtherPane переносит точку вставки (IP) из одной панели в другую, ClosePane – закрывает панель (удаляет разбиение).
Две вспомогательные функции помогают определить имеется ли разбиение документа и как поделено его окно. Функция WindowPane() возвращает 0, при отсутствии разбиения, 1 – если IP находится в верхней панели, и 3, если IP – в нижней. Функция DocSplit() возвращает 0, если окно документа не разделено, а иначе процентное отношение в котором разделение поделило окно документа.
Оператор
Activate имеет следующий формат:
Activate ЗаголовокОкна, [НомерПанели]
Он переносит открытый документ Word, шаблон или макро в верх хипа. Проще говоря, при работе с несколькими документами, окно с указанным в Activate именем становится активным. Например, вы хотите открыть ещё один документ, но продолжить при этом работу с предыдущим. Для этого сохраним его имя в переменной первоеокно$, загрузим нужный файл, а затем снова сделаем первое окно активным:
первоеокно$ = WindowName$()
FileOpen "CHAP2.DOC"
Activate первоеокно$
Этот результат, конечно же, можно получить и другим способом. Подумайте как.
Необязательный аргумент НомерПанели активизирует верхнюю панель окна (если оно разделено на несколько частей) при значениях 1 или 2, либо нижнюю панель при значениях 3 или 4. В остальных случаях возникает ошибка 512. Значение аргумента ЗаголовокОкна должно совпадать с одним из имён в списке пункта Окно, главного меню. Следует учесть, что при смене каталога имена в этом списке изменяются, так как к ним добавляется путь.
Операторы блокирования и обновления полей
Оператор LockFields блокирует поле от последующего обновления, предохраняя таким образом от изменений поля, связанные, например, с датой и временем чего-либо.
Оператор UnlockFields отменяет действие оператора LockFields.
Оператор UnlinkFields заменяет поля, попавшие в выделенный блок текста, их наиболее недавними значениями, а само поле преобразуется в обычный текст, а потому не может быть в дальнейшем автоматически обновлено. Некоторые поля (в частности, задающие элементы оглавления и индекса) не могут быть отсоединены. Так как после операции отсоединения поля не могут быть восстановлены, то применение этого оператора достаточно очевидно: при передаче готового материала убрать весь инструментарий.
Пример. Отсоединить все поля в активном документе, предварительно обновив их значения.
EditSelectAll
UpdateFields
UnlinkFields
Оператор
UpdateFields – Обновляет выбранные поля. Полезна следующая макрокоманда:
Sub MAIN
EditSelectAll
UpdateFields
End Sub
Оператор UpdateSource сохраняет в исходном документе изменения, сделанные в результате работы поля INCLUDETEXT. Исходный документ должен быть отформатирован как документ Word.
Операторы Bold, Italic, Underline и Strikethrough
Italic [On] курсив
Bold [On] полужирный
Underline [On] подчеркивание текста
Strikethrough [On] перечёркивание текста
Перечисленные операторы доступны также и в виде соответствующих функций.
Bold Bold()
Underline Underline()
Strikethrough Strikethrough()
Italic Italic()
Пример.
Проверить, отформатирована ли выделенная область полужирным шрифтом, и если нет. то она форматировать её. Поместив вместо оператора bold, любую из приведенных выше пар оператор – функция, вы получите макрокоманду, демонстрирующую их работу.
Sub MAIN
A = Bold()
If A < 1 Then
MsgBox "Выделить полужирным."
Bold
Else
MsgBox "Текст отформатирован полужирным."
End If
End Sub
WordUnderline [On] – подчёркивание слов (пробелы между ними не подчёркиваются).
DoubleUnderline [On] – двойное подчеркивание текста.
DottedUnderline [On] – подчеркивание текста пунктирной линией.
Этим операторам соответствуют функции Italic(), Bold(), Underline(), WordUnderline(), DoubleUnderline() и DottedUnderline().
Гораздо более интересны операторы и функции, позволяющие менять сам шрифт и его атрибуты (размер, цвет, кернинг и т. д.):
Оператор Font$ имя$
[, размер] – применяет заданный шрифт указанного размера к выделенному тексту.
FontSizeSelect – если панель Форматирование присутствует на экране, то указатель перемещается в окошко с размерами шрифтов. Если этой панели на экране нет, то появляется диалоговое окно Шрифт, в котором маркер устанавливается на окно размера шрифта.
Функция FontSize()
– возвращает размер шрифта выделенного текста.
Пример.
Эта макрокоманда возвращает размер шрифта для выделенного участка и позволяет пользователю изменить этот размер.
Sub MAIN
fs = FontSize()
MsgBox “Шрифт ” + Str$(fs) + “пунктов”
FontSizeSelect
End Sub
Функция Font$() – возвращает имя шрифта выделенного текста. Если этот текст оформлен несколькими шрифтами, то возвращается пустая строка.
Font$(номер-шрифта) – возвращает имя шрифта, номер которого в списке шрифтов, доступных для выбранного, принтера равен номеру-шрифта. Число таких шрифтов можно получить с помощью функции CountFonts(). Следующий макрос возвращает полный список шрифтов.
Sub MAIN
For i=1 To CountFonts()
Insert Font$(i)
InsertPara
End SUB
GrowFont – увеличивает размер шрифта выделенного текста до следующего размера, поддерживаемого выбранным принтером. Если в выделенном тексте используются шрифты разного размера, то каждый из них увеличивается до следующего доступного размера. Если выделенного текста нет, то новый размер шрифта будет применяться к добавляемому тексту. ShrinkFont – симметричный к GrowFont оператор, аналогичным образом уменьшающий размер шрифта.
Операторы GrowFontOnePoint и ShrinkFontOnePoint позволяют соответственно увеличивать и уменьшать размер шрифта выделенного текста на один пункт. Однако в отличие от GrowFont и ShrinkFont они делают это независимо от того, поддерживается ли новый размер шрифта выбранным устройством печати или нет.
Операторы для работы со списками
DemoteList
FormatBullet
FormatBulletDefault, FormatBulletDefault()
FormatBulletsAndNumbering
FormatDefineStyleNumbers
FormatMultilevel
FormatNumber
FormatNumberDefault, FormatNumberDefault()
PromoteList
RemoveBulletsNumbers
SkipNumbering, SkipNumbering()
ToolsBulletListDefault
ToolsBulletsNumbers
ToolsNumberListDefault
Операторы FileClose
Оператор FileClose [Save] закрывает активный документ и связанное с ним окно.Синтаксис
FileClose [Save]
Пример.
Откроем новый файл, вставим в него текст и спросим пользователя, сохранить ли изменения.
Sub MAIN
FileNewDefault
Insert "Это тест для оператора FileClose"
FileClose 0
End Sub
Операторы и функции настройки
В эту группу входят операторы для работы с меню, панелями инструментов и функции, возвращающие значение настроек.Оператор ListCommands
Эта команда, не имеющая атрибутов, создаёт новый документ и строит таблицу, в которой перечисляются все встроенные команды Word 6.0/7.0. Эта таблица будет также содержать все быстрые клавиши и назначения меню, присвоенные этим командам.
Функция CountToolbars
Возвращает число инструментальных панелей, перечисленных в диалоговом окне Toolbars (меню View). Обратите внимание, что не во всех обстоятельствах перечислены все инструментальные панели. Например, инструментальная панель редактирования макрокоманд появляется в диалоговом окне Toolbars только когда окно редактирования макрокоманд открыто.
Синтаксис:
CountToolbars([Контекст])
где аргумент Контекст задаёт, о каких инструментальных панелях идёт речь:
0 – активные панели инструментов, базирующиеся на шаблоне Normal;
1 или опущен – панели инструментов, доступные в текущий момент в зависимости от настроек (если есть) или других глобальных шаблонов.
Функция CountToolbarButtons
Синтаксис: CountToolbarButtons(Toolbar$ [,Контекст])
Возвращает число кнопок на указанной инструментальной панели. При этом пробелы и окна со списками считаются за кнопки.
Аргументы:
Имя_панели$ имя панели, в том виде как оно появляется в диалоговом окне Toolbars (меню View);
Контекст значения, как и у функции CountToolbars.
Функция ToolbarName$
Синтаксис:
ToolbarName$(Toolbar [, Context])
Пример.
Получим список имён инструментальных панелей с числом кнопок на каждой из них. Так как число кнопок известно, синтаксис может быть изменён, чтобы узнать число кнопок на конкретной панели.
Sub MAIN
For i = 1 To CountToolbars(0)
имя$ = ToolbarName$(i)
кнопок = CountToolbarButtons(имя$)
Insert имя$ + "," + Str$(кнопок) + Chr$(13)
Next i
End Sub
Выполнение этой макрокоманды на моей машине дало следующий результат:
Standard, 29
Formatting, 22
Borders, 11
Database, 14
Drawing, 30
Forms, 11
Macro, 17
Microsoft, 8
Word for Windows 2.0, 29
Tip Wizard, 3
Translate, 9
Оператор MenuMode
Активирует линейку меню. MenuMode соответствует нажатию клавиши ALT или F10 на клавиатуре.
Синтаксис:
MenuMode
Пример.
Функция CountMenus
Синтаксис:
CountMenus(Type [, Context])
Аргументы:
Type – тип меню для подсчёта:
0 – меню на линейке меню, когда документ открыт;
1 – меню на линейке меню, когда нет открытых документов;
2 – краткие меню.
Context – задаёт, какие меню подсчитываются:
0 – меню, которые доступны, когда документ базируется на шаблоне Normal.dot;
1 или опущено – меню, которые доступны в текущий момент (их число зависит от установок при настройке, если они были сделаны, от активного глобального шаблона и от шаблона Normal.dot.
Пример:
Определить число меню, доступных пользователю, когда активен документ, базирующийся на шаблоне NORMAL.DOT.
Sub MAIN
NumMenus = CountMenus(0, 0)
MsgBox "Документ имеет " + Str$(NumMenus) + " доступных меню."
End Sub
Оператор OutlineShowFormat
Выводит на экран символы отформатированные в режиме структуры документа или, если их форматирование уже показано, скрывает их. Если активный документ не в режиме просмотра структуры или главного документа, происходит ошибка.
Операторы изменения уровня
OutlineMoveDown перемещает выбранные абзацы выше следующего видимого абзаца. Тело текста перемещается вместе с заголовком только если тело текста выбрано или свёрнуто.OutlineMoveUp
OutlinePromote
OutlineShowFirstLine, OutlineShowFirstLine()
OutlineShowFormat
RemoveSubdocument
ShowAllHeadings
ShowHeadingNumber
SplitSubdocument
ViewMasterDocument, ViewMasterDocument()
ViewOutline, ViewOutline()
ViewToggleMasterDocument
Операторы OutlineCollapse и OutlineExpand
Оператор OutlineExpand расширяет диапазон показываемых уровней заголовков на один. Противоположный ему оператор OutlineCollapse сужает на один уровень этот диапазон. Активный документ должен находиться в режиме просмотра структуры документа или быть главным документом.
Пример.
Перейти при просмотре документа на один уровень вверх по структуре заголовков:
Sub MAIN
ViewOutline
EditSelectAll
OutlineCollapse
End Sub
Операторы перемещения объектов в стеке
В WordBasic есть возможность изменять положение рисованного объекта в стеке объектов, перемещая его либо в обоих направлениях по стеку, а также переводить рисунок с уровня “перед текстом” на уровень “за текстом” и обратно. Для этой цели служат две группы операторов, совершенно симметричные и отличающихся только словами Bring (перемещение вперёд) и Send (в обратном направлении).
Первая группа. Оператор DrawBringForward перемещает выбранный рисованный объект на одну позицию выше в стеке объектов, а DrawBringToFront перемещает объект в вершину стека. Эти операторы не перемещают объект с уровня позади текста на уровень перед текстом – это делает оператор DrawBringInFrontOfText.
Вторая группа. Оператор DrawSendBackward – перемещает объект на одну позицию ниже в стеке объектов, а DrawSendToBack – соответственно, перемещает его в низ стека. DrawSendBehindText переводит объект с уровня перед текстом на уровень за текстом.
Все эти операторы генерируют ошибку, если выбран не рисованный объект.
Операторы вставки
WinWord позволяет вставлять в документ рисунки, подготовленные в других пакетах (хотя при этом, возможно, у вас могут возникнуть проблемы).
Операторы перемещения рисунка
Рисунок перемещается по экрану в четырёх направлениях: вправо, влево, вверх и вниз. Для перемещения по диагонали используется составное движение. В WordBasic есть две сходные по действию группы операторов, которые помогают переместить объект.Первая группа. Оператор DrawNudgeDownPixel – перемещает выбранный рисованный объект или объекты на одну точку вниз. Аналогично работают операторы DrawNudgeUpPixel, DrawNudgeRightPixel и DrawNudgeLeftPixel, только перемещают объект они соответственно вверх, вправо и влево.
Вторая группа. Это операторы DrawNudgeDown, DrawNudgeUp, DrawNudgeRight и DrawNudgeLeft, перемещающие выбранный объект на 10 точек вниз или, если в диалоговом окне Snap To Grid Moves (меню Drawing) выбрано Snap To Grid, перемещает выбранные объекты вниз на измерение, указанное в окне Vertical Spacing. Аналогично работают операторы только перемещают объект они соответственно вверх, вправо и влево.
Пример.
Нарисуем круг и переместим его в середину страницы. Для переноса рисунка послужит подпрограмма moveXY.
Sub MAIN
DrawEllipse
moveXY 115, 120
End Sub
Sub moveXY(X, Y)
i = Int(X / 10)
i2 = X - i
j = Int(Y / 10)
j2 = Y - j
For kx = 1 To i
DrawNudgeRight
Next kx
For mx = 1 To i2
DrawNudgeRightPixel
Next mx
For ky = 1 To j
DrawNudgeDown
Next ky
For my = 1 To j2
DrawNudgeDownPixel
Next my
End Sub
Операторы рисования
Каждый из перечисленных ниже операторов делает следующие:
переводит режим просмотра из обычного в просмотр расположения страницы; помещает соответствующий объект рисования по умолчанию в верхний левый угол текущей страницы до начала текста. Объекты обычно ориентированы с левого верхнего к правому нижнему углу. Слова “объект по умолчанию” означают, что такой объект имеет фиксированные размеры и форму, но так как это объект рисования, то с ним можно производить всевозможные преобразования: перемещать, растягивать, поворачивать и т.д. Важно то, что рисунок наносится поверх текста.
Оператор DrawLine
– помещает прямую линию перед текстом в начале текущей страницы. Для макрокоманды этот оператор почти бесполезен, важнее было бы иметь возможность рисовать линию между заданными точками.
Оператор DrawArc – помещает дугу.
Оператор DrawEllipse
–
эллипс (правда он по умолчанию круг).
Пример. Нарисуем калейдоскоп из кругов произвольного размера, цвета и разбросанных случайным образом по заданной области.
Sub MAIN
For i = 1 To 100
c = Int(Rnd() * 16)
f = Int(Rnd() * 16)
x = Int(Rnd() * 300)
y = Int(Rnd() * 200)
DrawEllipse
h1 = Int(Rnd() * 75)
FormatDrawingObject .FillColor = f, .LineColor = c, /
.HorizontalPos = x, .VerticalPos = y, .Height = h1, /
.Width = h1
Next i
End Sub
DrawRectangle – добавляет прямоугольник (по умолчанию квадрат).
DrawRoundRectangle – добавляет прямоугольник со скруглёнными углами.
DrawTextBox – добавляет ограниченную текстовую область к уровню рисунка. Это квадрат со стороной один дюйм.
DrawCallout – добавляет выноску (пояснение). Выноска содержит текст в прямоугольной области и стрелку, указывающую на поясняемую часть рисунка. С ней связан целый ряд операторов, которые рассмотрены чуть далее.
Более сложно рисуется произвольная ломанная линия, которая может быть замкнутой. Делается это с помощью двух операторов (DrawFreeformPolygon и DrawSetPolyPoints) и двумерного массива с координатами вершин.
Первая размерность массива должна быть не меньше числа вершин, иначе линия будет построена лишь частично и будет выдано сообщение об ошибке. Начало координат расположено в верхнем левом углу, первая координата задает расстояние по вертикали, а вторая по горизонтали. Оператор DrawFreeformPolygon просто помещает объект типа отрезок прямой в начало текущей страницы, а DrawSetPolyPoints применяет его к массиву с координатами. Лучше это видно на примере. Построим прямоугольник.
Sub MAIN
DrawFreeformPolygon
Dim вершины$(5, 2)
вершины$(1, 1) = "5 cm"
вершины$(1, 2) = "8 cm"
вершины$(2, 1) = "5 cm”
вершины$(2, 2) = "3 cm"
вершины$(3, 1) = "7 cm"
вершины$(3, 2) = "3 cm"
вершины$(4, 1) = "7 cm"
вершины$(4, 2) = "8 cm"
вершины$(5, 1) = "5 cm"
вершины$(5, 2) = "8 cm"
DrawSetPolyPoints 5, вершины$()
End Sub
При записи координат можно указать в каких единицах считать координаты (cm, pt). Сложный объект можно строить, например, пересчитывая координаты в массиве вершины$. Однако при большом количестве вершин это не самое простое занятие, поэтому для рисования произвольной ломанной линии существует несколько вспомогательных операторов и функций.
Функция DrawCountPolyPoints, как следует из её названия, возвращает число точек в произвольном полигоне.
Синтаксис:
DrawCountPolyPoints [(объект)]
Аргумент – либо номер объекта, принимающий значение от 1 до DrawCount(), либо, если аргумент опущен, текущий рисованный объект. Иначе возникает ошибка. Кстати, объект номер 1 тот, который отмечен якорем оператором с помощью оператора DrawSetRange (см. ниже).
Оператор DrawGetPolyPoints позволяет присвоить элементам двумерного массива координаты вершин ломанной линии.
Синтаксис:
DrawGetPolyPoints массив[$]() [, объект]
Заполняет двумерный массив координатами точек указанного рисованного объекта, который должен быть ломанной линией. Этот массив можно использовать в качестве аргумента оператора DrawSetPolyPoints для рисования другого объекта такого же типа.
Для определения размера массива следует применять функцию DrawCountPolyPoints(). Массив
может быть как числовым, так и символьным.
Следующие операторы работают только с объектами, нарисованными из меню Рисование. Если объект встроенный произойдёт ошибка.
DrawFlipHorizontal
– переворачивает выбранный рисованный объект слева направо.
DrawFlipVertical –
переворачивает выбранный рисованный объект сверху вниз.
Вот интересный пример с этими операторами, который я нашёл в Microsoft TechNet
#6/1996 г.:
Sub MAIN
If SelInfo(27) = - 1 Then FileNewDefault
DrawArc
FormatDrawingObject .HorizontalPos = 225, /
.VerticalPos = 110
For Cnt = 1 To 1000
DrawFlipHorizontal
DrawFlipVertical
Next Cnt
End Sub
DrawRotateLeft –
переворачивает выбранный рисованный объект на 90 градусов против часовой стрелки.
DrawRotateRight – переворачивает выбранный рисованный объект на 90 градусов по часовой стрелке.
Задание. Используя операторы поворота, добейтесь, чтобы в предыдущем примере дуга вращалась вокруг обеих диагоналей квадрата.
Массив параметров
В WordBasic, в отличие от других Бейсиков, существует множество операторов с громадным количеством параметров. Конечно можно каждый раз задавать аргументы оператора, но есть более интересный путь: для облегчения работы с параметрами в язык введены так называемые “массивы параметров”. Такой массив (по синтаксису его правильнее было бы называть структурой) объявляется оператором Dim c указанием какому оператору (а на самом деле диалоговому окну) он соответствует.
Синтаксис:
Dim dlg as имя_оператора
Например.
Dim dlg As FormatDrawingObject
Оператор FormatDrawingObject позволяет установить цвет и тип линии, цвет заливки, тень и множество других вещей. Заполнить массив параметров текущими значениями можно с помощью оператора:
GetCurValues dlg
Их можно извлекать оттуда и анализировать отдельно, что тоже одно из преимуществ этого метода.
К элементам массива можно обращаться как к элементам структуры с помощью составного имени: имя_массива.имя_аргумента
Например.
dlg.LineType = 1
dlg.LineColor = 5
Для изменения параметров следует выполнить оператор с массивом параметров в качестве аргумента:
FormatDrawingObject dlg
Операторы вставки
Операторы InsertDateField, InsertDateTime, InsertFormField, InsertMergeField, InsertPageField, InsertTimeField выполняют действия описанные в таблице для полей, названия которых входят в качестве второго слова в имя оператора.
Переменные документа и их использование в программе
name$ = GetDocumentVarName$(i)
GetDocumentVar$(имя_переменной)
SetDocumentVar name$, ""
Функция CountDocumentVars() возвращает число переменных документа созданных с помощью оператора SetDocumentVar или функции SetDocumentVar().
Прибамбасы
Ряд операторов позволяют выделять текст по признакам его оформления. Это особенно важно для больших документов, которые создавались на разных машинах и/или писались разными людьми.SelectCurAlignment расширит выделение вперёд от точки вставки до параграфа с отличающимся типом выравнивания (по левому или правому краю, по центру или по ширине).
SelectCurSpacing расширит выделение вперёд от точки вставки до абзаца с отличающимся интерлиньяжем.
SelectCurIndent расширит выделение вперёд от точки вставки до параграфа с отличающимся левым или правым отступом.
SelectCurTabs расширит выделение вперёд от текущей точки до параграфа с отличающимися установками точек табуляции.
SelectCurColor расширит выделение вперёд от текущей точки до начала текста, выделенного другим цветом.
SelectCurFont расширит выделение вперёд от текущей точки до начала текста имеющего другой шрифт или иной размер шрифта.
Весьма полезные примеры использования перечисленных операторов выделения по оформлению приведены в Справке.
Заканчивая рассмотрение операторов и функций выделения текста, стоит упомянуть о мощном операторе SetSelRange Pos1, Pos2, выделяющем символы между позицией Pos1 и позицией Pos2. Его хорошо дополняет функция GetText$ Pos1 Pos2, возвращающая текст, заключенный между позициями, заданными ее аргументами.
Теперь, зная операторы перемещения и выделения, попробуем сделать что-нибудь полезное, напишем, например, макрос, помечающий все слова в тексте, начинающиеся с латинских букв, как английские. Это может вам сильно упростить проверку орфографических ошибок в смешанном тексте (например, в программной документации или в статье для журнала, так как текст после обработки этим макросом проверяется и по русскому, и по английскому словарю (для этого они, конечно же, должны быть установлены).
Sub MAIN
StartOfDocument
While AtEndOfDocument() <> -1
WordRight
SelectCurWord
a$ = Left$(Selection$(), 1)
If Asc(a$)< 123 Then Language "English (US)"
ShrinkSelection
Wend
End Sub
Пояснение. Оператор Language
устанавливает признак языка для выделенного участка текста.
Задание.
1. Модифицируйте эту макрокоманду, чтобы она работала только на выделенном вами участке текста.
2. Если подряд идет несколько английских слов, то попробуйте отмечать такой участок целиком, а не отдельные слова.
Если сохранить файл после его обработки этой макрокомандой, то он заметно “потолстеет”. Чтобы этого не произошло, после проверки орфографии можно выполнить макрос, возвращающий все к исходному состоянию:
Sub MAIN
EditSelectAll
Language "Русский"
While GetSelStartPos()<>GetSelEndPos()
ShrinkSelection
Wend ‘убрать выделение текста
End SUB
Популярная в языке WordBasic группа операторов Insert позволяет добавить текст или специальные символы начиная с позиции точки вставки. Например,
Insert Date$() – добавить в текст текущую дату;
InsertPara – вставить метку конца абзаца.
Insert Chr$(9) – вставить символ табуляции
Name$ = "Эдуард " ' присвоить значение переменной
Insert Name$ ' и вставить его в текст
В WinWord нет операции по выделению слов в разрядку. Это сделает следующая макрокоманда.
Sub MAIN
‘ Вставляет дефис между непробельными символами.
b$ = Selection$()
c$ = ""
For i = 1 To Len(b$) - 1
c$ = c$ + Left$(b$, 1)
If (Left$(b$, 1) <> " ") And (Mid$(b$, 2, 1) <> " ") \
Then c$ = c$ + "-"
b$ = Mid$(b$, 2)
Next i
c$ = c$ + b$
EditCut 'вырезать выделенный участок
Insert c$ 'и вставить новый текст
End SUB
Все свои базы данных (БД) я начинал вести в редакторе Word 4.0 под DOS (на “ноутбуке” без жесткого диска трудно было придумать что-либо лучшее), затем перевел их под WinWord. Если нет необходимости формировать отчеты и делать сложные выборки, то средств этого редактора вполне достаточно для работы и поиска записей в такой БД. Так как моя БД растет со средней скоростью 1 Кбайт в день, момент, когда этот текстовый файл станет слишком большим, настанет весьма нескоро.Это не агитация за отказ от использования СУБД: просто в каждом конкретном случае следует выбирать наиболее соответствующее поставленной задаче средство. Так вот, в одной из баз дата обновления каждой записи весьма существенна. Простая макрокоманда
Sub MAIN
Insert “ lch=” + Date$()
End SUB
позволяет при модификации записи записывать и текущую дату.
Симметричную оператору Insert операцию удаления слова, находящегося после точки вставки, делает оператор:
DeleteWord
Оператор DeleteBackWord соответственно удаляет слово, предшествующее точке вставки. Пробел, знак табуляции и знаки пунктуации считаются за целое слово. Обратите внимание, что оба эти оператора без операндов.
использования полей
Мне позвонил читатель “КомпьютерПресс” и рассказал о своей проблеме. Он, как наверное и многие, ведёт на компьютере турнирные таблицы различных соревнований, в частности, по футболу и баскетболу. Многие читатели возможно ведут такие турнирные таблицы по шахматам, водному поло или по волейболу. Проблема на самом деле общая: как с помощью макрокоманд облегчить себе работу с такими таблицами.Давайте рассмотрим эту задачу для таблицы шахматного турнира, как самой простой по форме. Вообще говоря, подобная задача совсем просто решается в электронной таблице. Но ведь и обычной элементы таблицы в WinWord нумеруются точно также, как ячейки электронной таблицы, т.е. строки цифрами, а столбцы – латинскими буквами. Так номера ячеек верхней строки таблицы (слева направо) будут: А1, А2, А3, …, Аn.
Соответственно, в многочисленных встроенных функциях и макрокомандах ссылки на конкретные элементы таблицы разделяются запятыми, а двоеточием разделяются ссылки на первый и последний элементы некоторого диапазона ячеек. Например, если таблица имеет размер 4 на 4, то функция sum(c1:c4) позволит найти просуммировать содержимое ячеек третьего столбца.
Выберите в меню Вставка пункт Поле, а затем в диалоговом окне Поле строку Выражения и формулы. После этого нажмите клавишу F1, чтобы вызвать Справку. В неё посмотрите разделы Операторы, Формулы и Ссылки. Обратите внимание, что для функций ссылки на элементы таблицы выглядят немного иначе, чем для ЭТ. В отличие от Excel, эти ссылки всегда задают абсолютные адреса. Кроме того, для обновления значений в таблице нужно либо вызвать макрокоманду, либо, если формулы записаны в полях, нажать клавишу F9.
Подготовка таблицы. Можно предложить три способа подготовки таблиц такого вида.
1. Конечно Вы можете один раз создав такую таблицу, элементарно просто запомнить её под каким-либо именем в таблице Автотекста (меню Редактирование), и затем вставлять таблицу в документ используя это имя.
2. Сложнее написать макрокоманду, которая вставит в документ таблицу подобного вида и настроит её длину на число команд, участников турнира.
3. Наконец, высший пилотаж, если вы создадите отдельный шаблон (т.е. определите специальный вид документа) с макрокомандами и другими заготовками для ведения турнирных таблиц.
Начать можно с простой таблицы для шахматного турнира:
|
Место |
Ф.И.О. |
1-й круг |
2-й круг |
3-й круг |
N-й круг |
Сумма очков |
|
1. |
Петров |
|
0,5 |
1 |
1 |
2,5 |
|
2. |
Карасёв |
0,5 |
|
0,5 |
1 |
2 |
|
3. |
Ефремов |
0 |
0,5 |
|
0,5 |
1 |
|
4. |
Орлов |
0 |
0 |
0,5 |
|
0,5 |
В столбце сумма очков вставляется(меню Вставка, пункт Поле) поле с формулой. Для этого в диалоговом окне Поле нужно выбрать верхнюю строку, озаглавленную в левой колонке (все). А затем в окне Код поля ввести sum(c2:d2).
Пронумеровать строки можно вставив поле AutoNum в первую ячейку каждой строки таблицы. Для этого, в частности, можно использовать следующую макрокоманду:
Sub Main
TableSelectTable
StartOfRow
LineDown 2 ‘обойти заголовок
While SelInfo(12) = - 1
StartOfLine
InsertField .Field = "autonum"
LineDown 1
Wend
End Sub
После каждой корректировки таблицы достаточно обновить столбец с суммой очков, отсортировать строки по этому столбцу и обновить (нажав F9) столбец с местами в турнире.
Проверка правописания
В Word 7.0 дляWindows 95 появились операторы поддерживающие проверку грамматики и ряд других операций. Теперь очень удобно отслеживать так называемые "глазные ошибки" при вводе текста, вот только ОРФО не слишком хорошо различает слова набранные кириллицей от слов в латинице и поэтому в двуязычных текстах красной чертой подчеркнуты правильно набранные слова из-за того что у такого слова стоит не тот признак языка, который нужен. На самом деле это не так безобидно как кажется. При переходе с Word 6.0 на 7.0 мои файлы (в каждом из них смешанный текст на двух языках) “потолстели” на 60-70 Кбайт. Причина заключалась в том, что Word хранит информацию об ошибках правописания. Кроме того, когда таких “ошибок” слишком много, Word отключает автоматическую проверку орфографии, что естественно не радует. Следующая макрокоманда выделяет весь текст документа и устанавливает для него язык “Русский”, затем она последовательно просматривает цепочки слов и помечает слова, набранные латиницей, как “English(US)”. Вы можете модифицировать эти строки, как вам нужно, в частности для одного из текстов, где встречалось много английских названий функций, я поставил “Без проверки”. В этом варианте макрокоманда недостаточно аккуратно обрабатывает достижение конца документа, так как её всегда можно прервать по клавише Esc, но в документе остаётся три закладки, которые удаляются из меню Правка*Закладка*Удалить.
Sub MAIN
' SP – закладка в начале цепочки
' EP – закладка на текущей точке просмотра
' EP1 – закладка в конце распознанной цепочки
StartOfDocument ' выделить документ
EndOfDocument 1
Language "Русский"
StartOfDocument 0 ' поиск цепочек на латинице
SetEndOfBookmark "\Sel", "EP1"
While AtEndOfDocument() <> - 1
WordRight 1, 1 ' следующее слово
SetStartOfBookmark "\Sel", "SP"
Loop:
k = Len(Selection$())
SetEndOfBookmark "\Sel", "EP"
ExtendSelection
EditGoTo "EP"
Cancel
nodefis:
a$ = Right$(RTrim$(Selection$()), 1)
If (a$ = "–") Or Asc(a$) <= 64 Then
SetEndOfBookmark "\Sel", "EP"
Goto nextloop
End If
If Asc(a$) < 123 Then
SetEndOfBookmark "\Sel", "EP1"
WordRight 1, 1
Goto Loop ' продлить цепочку
Else ' смена типа цепочки
If Not(CmpBookmarks("SP", "EP1") = 2) Then
EditGoTo "EP"
Goto nextloop
End If
ExtendSelection
EditGoTo "EP1"
Cancel
If SelType() = 2 Then
Language Language$(7)
EditGoTo "EP"
End If
End If
nextloop:
Wend
End Sub
После обработки документов этой макрокомандой они снова “похудели”, а автоматическая проверка орфографии заработала. Расставлять же вручную признаки языка по тексту в 310 Кбайт – занятие похожее на мазохизм. Так что, пишите макросы!
Ряд новых функций связан с проверкой правописания. следует отметить, что в Word 6.0 эти функции недоступны и генерируют ошибку.
Прежде всего пишущему макрокоманду, обрабатывающую грамматические ошибки потребуется функция DocumentHasMisspellings(), которая возвращает информацию о статусе автоматической проверки правописания в окне активного документа. Она возвращает следующие значения:
|
Значение |
Пояснение |
|
-1 |
Или автоматическая проверка правописания выключена (если документ не пуст), или проверка осуществляется в настоящее время. |
|
0 |
Или документ был полностью проверен и не содержит орфографических ошибок, или документ пуст. |
|
1 |
Документ был полностью проверен и содержит, по крайней, мере одну орфографическую ошибку. |
Оператор NextMisspelling находит следующее ошибочное слово.
SpellChecked, SpellChecked()указывают, проверено ли правописание выделенного текста или нет.
ToolsSpellingRecheckDocument производит проверку правописания по всему документу.
ToolsOptionsSpelling задаёт параметры для автоматической проверки текста.
PutFieldData и GetFieldData$()
Данные можно записать в поле с помощью оператора PutFieldData и прочитать их из него с помощью функции GetFieldData$().
Синтаксис:
PutFieldData FieldData$
Когда точка вставки находится внутри поля, сохраняет содержимое переменной FieldData$ в этом поле. Данные, хранящиеся в поле являются внутренними для текстового процессора и не видны, даже когда показываются коды полей. Функция GetFieldData$() возвращает значение поля, при этом IP обязательно должен находится внутри поля.
Работа с БД
Работа с базой данных (БД) в WinWord – это работа с таблицей. При этом, каждая строка таблицы является записью БД, а каждый столбец соответствует некоторому полю записи. Названия полей записываются в первой строке таблицы. Напомню, что работе с таблицами было посвящено отдельное занятие (см. "КомпьютерПресс" №.1996 г., с. ). Здесь мы рассмотрим только операторы, которые работают с таблицей на уровне записей и связи с СУБД.
Работа с Буфером обмена
Оператор EditCopy копирует выделенный текст в Буфер обмена.
Оператор EditCut удаляет выделенный текст из документа и помещает его в Буфер обмена. Если выделения нет, возникает ошибка.
Оператор EditPaste вставляет содержимое Буфера обмена в точку вставки. Вот интересный пример использования этих двух операторов: часто требуется в слове поменять местами две буквы.
Классический случай, когда вместо слова "мясо", набрано "мсяо". Вот макрос, который исправляет такие ошибки:
Sub MAIN ' IP перед буквой "c"
CharLeft 1, 1 ' выделили ее
EditCut ' "c" в Буфер обмена
CharRight 1,0 ' убрали выделение, IP за буквой "я"
EditPaste ' достали "c" из Буфера
End Sub
Конечно, можно задать исправление часто встречающихся ошибок такого рода в пункте Автокоррекция меню Сервис, однако у вас нет гарантии, что WinWord правильно “поймет”, когда нужно применить ту или иную замену. Кроме того, так как проверка осуществляется при вводе текста, большое количество правил в списке Автокоррекции
существенно замедляет работу программы. (кстати, я с удивлением обнаружил в списке Автокоррекции Word for Windows 95 более сотни элементов замены).
Очень полезные операторы
EditClear [число_символов]
Он убирает выделенный текст и/или заданное число символов. Если число_символов >0, то удаляются символы справа от точки вставки (IP), если <0, то слева от IP. Если имеется выделенный текст, то удаляется он плюс заданное аргументом число символов. Вернуться к первоначальному состоянию можно с помощью оператора EditUndo. Действие EditUndo, как показано ниже, отменяет оператор EditRedo.
Sub MAIN
If SelInfo(27) = - 1 Then FileNewDefault
Insert "Пример работы команд EditUndo и EditRedo"
MsgBox "Выберите OK для отмены вставки."
EditUndo
MsgBox "Выберите OK для восстановления текста."
EditRedo
End Sub
Оператор RepeatFind повторяет повторить поиск, заданный последней операцией EditGoTo или EditFind.
Оператор EditRepeat позволяет повторить, если это возможно, последнюю операцию редактирования.
Синтаксис:
EditRepeat
Примеры.
Эта макрокоманда повторит операцию вставки табуляции в начало строк существующего документа 5 раз.
Sub MAIN
StartOfLine
Insert Chr$(09) 'вставить табуляцию в начало строки
For LCount = 1 To 5
LineDown
EditRepeat
Next LCount
End Sub
Более аккуратный пример, с созданием нового файла и вставкой строки текста.
Sub MAIN
NewLine = Chr$(13) + Chr$(10)
If SelInfo(27) = - 1 Then FileNewDefault
Insert "Повторить ещё 8 раз!" + NewLine
For Count = 1 To 8
EditRepeat
Next Count
End Sub
Вот чисто учебный пример использования изученных операторов редактирования. Его следует выделить, скопировать в Буфер обмена, затем в окно редактирования макрокоманд и выполнить по шагам (с помощью кнопки пошагового выполнения макроса).
Sub MAIN
Insert "This is Line one" : InsertPara
Insert "This is Line two" : InsertPara
MsgBox "Click OK to select everything"
EditSelectAll
MsgBox "Click OK to copy the selected text to the clipboard"
EditCopy
MsgBox "Click OK to paste the copied text at the end."
EndOfDocument
EditPaste
MsgBox "Click OK to select everything and cut it from the document."
EditSelectAll : EditCut
MsgBox "Click OK to paste it back in"
EditPaste
MsgBox "Click OK to clear part of the first line."
StartOfDocument : EditClear 10
End Sub
ToggleFull – делает окно документа размером во весь экран и переключает его обратно. Следующая макрокоманда демонстрирует работу оператора ToggleFull, а заодно и использование операторов NextWindow и PrevWindow, позволяющих в данном случае перейти из окна макрокоманды в окно редактируемого документа и вернуться после ее выполнения обратно.
Sub MAIN
If SelInfo(27) = - 1 Then NextWindow
MsgBox "ОК, чтобы перейти к полному экрану."
ToggleFull
MsgBox "OK, чтобы вернуться обратно."
ToggleFull
PrevWindow
End Sub
Для возвращения с уровня просмотра заголовков и сносок на уровень просмотра текста служит оператор ToggleMainTextLayer. Обычно применяется в следующих сочетаниях:
ViewHeader
.... ' действия с колонтитулом
ToggleMainTextLayer ' к основному тексту
TogglePortrait – переключает выделенную секцию между ориентацией landscape (Альбомная) и portrait (Книжная). Чтобы увидеть эффект применения этого оператора воспользуйтесь следующей заготовкой:
ViewPage
ViewZoom .FullPage
TogglePortrait
.... ' задержка на 5-10 секунд
TogglePortrait
ToggleFieldDisplay
ViewFieldCodes 0
Для операций групповой замены в тексте очень полезна группа операторов поиска:
EditFind [[.Find =] СтрокаПоиска$][, .Direction = 0]][, .WholeWord = 0]
[, .MatchCase = 0][, .PatternMatch = 0][, .SoundsLike = 0][, .Format = 1][, .Wrap = 0]
Оператор EditFind находит вхождение заданного текста, форматирования или того и другого. Если вы хотите осуществить поиск внутри небольшой секции документа, установите закладки и используйте оператор EditFind внутри цикла While CmpBookmarks(). В приведённой ниже макрокоманде внутри текущего абзаца ищется точка с запятой
(;).
Sub MAIN
EditBookmark .Name = "startx", .Add
EditGoTo "\para"
EditBookmark .Name = "selectionx", .Add
EditFind .Find = ";"
While CmpBookmarks("\Sel", "selectionx") = 8 Or \
CmpBookmarks("\Sel", "selectionx") = 6 And EditFindFound()
count = count + 1
RepeatFind
Wend
MsgBox Str$(count) + " semicolons were found"
EditGoTo "startx"
EditBookmark .Name = "selectionx", .Delete
EditBookmark .Name = "startx", .Delete
End Sub
EditFindFound() – возвращает результат выполнения предыдущей операции EditFind т. е. возвращает –1, если результат последнего поиска был успешным и 0, если нет. Если СтрокаПоиска$ не задана, то используется строка поиска из последнего выполнявшегося оператора EditFind или EditReplace. В СтрокеПоиска$ можно задавать шаблон для поиска. Символы, которые используются в шаблоне, приведены в таблице.
|
СтрокаПоиска$ |
Что вы с её помощью найдёте |
|
? |
Любой символ. Например EditFind "T?P" позволит найти ТОР, ТУР, ТИР и множество других слов |
|
^? |
Так как знак вопроса используется в шаблоне, чтобы найти сам этот знак, нужно перед ним поставить ^ |
|
^w |
Белое пространство: пробелы, табуляция, неразрывные пробелы |
|
^p |
Конец абзаца |
|
^t |
Табуляция. Chr$(9) |
EditFindChar
Чтобы предыдущие команды группы Edit не повлияли на выполнение текущей команды редактирования, используется оператор EditFindClearFormatting, отменяющий все ранее сделанные установки параметров.
EditReplaceClearFormatting
Часто в больших документах, особенно в книгах, брошюрах и т.д., используется не один, а несколько шрифтов, например, чтобы выделить примечания, эпиграфы, фрагменты программ. Допустим, что на машине, где вы хотите распечатать свой документ, нужного шрифта нет. Следующая полезная макрокоманда позволит вам поменять все символы, отформатированные одним шрифтом на другой. Заменим Courier New Cyr на Times New Roman Cyr. Так как после работы данного макроса вернуться в исходное состояние можно только снова поменяв в нём местами названия шрифтов, если нужно, сохраните документ под другим именем. Этот базовый фрагмент можно легко модифицировать под вашу конкретную задачу.
Sub Main
StartOfDocument
EditFindFont .Font = " Courier New Cyr"
EditReplaceFont .Font = " Times New Roman Cyr"
EditReplace .Find = "", .Replace = "", .Format = 1, \ .ReplaceAll, .Wrap = 1
End Sub
Как почти всегда в WinWord проблема может быть решена многими путями, например простым переназначением шрифтов из меню.
EditReplaceFont .Italic = 1
EditFindStyle .Style = "Heading 6"
EditReplaceStyle .Style = "Heading 3"
Работа с документами
ViewMasterDocumentCreateSubdocument
Следующая группа операторов и функций обеспечивает изменение состояние окон.
FileExit [код] – выйти из WinWord.
Код:
0 (или опущен) – перед сохранением документов запросить пользователя;
1 – сохранить документы перед выходом;
2 – выход без сохранения документов.
DocClose [код] – закрыть активное окно. Значение параметра код, как и у оператора FileExit, только по отношению к документу в закрываемом окне.
Оператор DocWindowPosTop и функция DocWindowPosTop().
Синтаксис:
DocWindowPosTop позиция
DocWindowPosTop()
Оператор DocWindowPosTop позиционирует окно активного документа или его значок (пиктограмму) так, что она расположится на позицию точек от верхнего края рабочей области. Если окно с активным документом максимизировано, Word не сможет выполнить это действие и сгенерирует сообщение об ошибке. Функция DocWindowPosTop() возвращает вертикальную позицию в точках.
Пример: Эта макрокоманда возвращает горизонтальную и вертикальную позицию активного документа:
Sub MAIN
horizpos = DocWindowPosLeft()
vertpos = DocWindowPosTop()
MsgBox "Точек слева:" + Str$(horizpos) + Chr$(13) + \
"Точек сверху:" + Str$(vertpos), "Позиция документа"
End Sub
Работа с языком документа
Две функции и два оператора позволяют задавать или изменять язык редактируемого документа. Отмечу, что важность применения программ проверки орфографии и грамматики возрастает, кроме того документы часто бывают двух- либо многоязычными.Функция CountLanguages() возвращает число поддерживаемых в данной версии WinWord языков. Это легко увидеть вставив в макрокоманду строку:
Print CountLanguages()
Оператор Language имеет три различных формы использования. Первая форма:
Language язык$
позволяет указать конкретный язык для выделенного фрагмента текста. Этим будут пользоваться программы проверки орфографии и грамматики. Например, оператор
Language "Русский"
пометит выделенный участок документа, как текст на русском языке. Это на самом деле эквивалентно выбору в меню Сервис
пункта Язык и Русский в списке поддерживаемых языков. Просто вручную делать это более одного раза утомительно. Хотя в локализованной версии WinWord названия языков в диалоговом окне даны по-русски, в операторе их следует задавать в оригинальном написании.
Каждый язык в этом списке имеет свой порядковый номер, поэтому вторая форма этого оператора (Language индекс) использует в качестве операнда не название языка, а его номер в списке и функцию, для получения названия языка по его номеру. Так приведённому выше оператору соответствует:
Language Language$(23).
Третья форма – разновидность второй – отменяет лингвистическую проверку текста. Она эквивалентна выбору самой первой строки, (без проверки), в списке языков.
Language
"0"
И наконец, рассмотрим функцию Language$(индекс). Если индекс равен 0 или опущен, то Language$() вернёт признак языка первого символа выделенного участка или символа слева от точки вставки (если нет выделения текста). Если индекс не равен нулю (он может меняться от 1 до CountLanguages), то возвращается название языка из списка поддерживаемых национальных языков. Следующая макрокоманда выведет в активный документ этот список. Его элементы (номер и название) можно будет использовать в операторе Language.
Sub MAIN
For i = 1 To CountLanguages()
Insert Str$(i) + Chr$(9) + Language$(i)
InsertPara
Next
End Sub
1 0
2 Dansk
3 Deutsch
4 Deutsch (Schweiz)
5 English (AUS)
6 English (UK)
7 English (US)
8 Espaсol
9 Franзais
10 Canadien Franзais
11 Italiano
12 Nederlands
13 Nederlands (voorkeur)
14 Norsk Bokmеl
15 Norsk Nynorsk
16 Portuguкs (BR)
17 Portuguкs (POR)
18 Suomi
19 Svenska
20 Catalа
21 ЕллзнйкЬ
22 Tьrkзe
23 Русский
24 Иeљtina
25 Magyar
26 Polski
27 Slovenian
28 Словацкий
29 Euskera
30 Bahasa Malaysia
Последний оператор из этой группы ToolsLanguage позволяет установить выбранный язык в качестве языка, используемого по умолчанию, т. е. записать его в шаблон normal.sty:
ToolsLanguage .Language = "Русский", .Default
Если необязательный операнд .Default отсутствует, то в остальном этот оператор похож на оператор Language.
CopyFormat
FontSubstitution
FormatAddrFonts
FormatChangeCase
FormatDefineStyleFont
FormatDefineStyleLang
FormatFont
FormatRetAddrFonts
PasteFormat
ResetChar, ResetChar()
ShrinkFont
Оператор NormalFontSpacing
Восстанавливает кернинг выделенных символов к Normal, если их текущий кернинг был расширен или сжат.
Оператор NormalFontPosition
Восстанавливает выбранные символы к базовой линии, если они были подняты или понижены.
Работа с каталогами
WordBasic поддерживает все стандартные операции навигации по дереву каталогов диска и работы с файлами.
Ниже перечислены основные операции.
Смена каталога по умолчанию:
ChDir path$
делает текущими диск и каталог, заданные аргументом path$.
MkDir name$
создает каталог с именем, заданным аргументом name$.
RmDir name$
удаляет заданный каталог. Удалить текущий каталог нельзя.
Kill имя_файла$
удаляет заданный файл. Чтобы избежать непредвиденного результата, рекомендуется задавать полное имя файла. Обычная последовательность удаления файла:
имя_документа$=FileName$(0)
DocClose 2
Kill имя_документа$
Name прежнее_имя$
As новое_имя$
переименовывает файл.
FileOpen [.Name=имя]
загружает документ для редактирования.
FileClose [режим]
закрывает редактируемый документ.
CountDirectories()
возвращает число подкаталогов в текущем каталоге.
GetDirectory$()
возвращает имя подкаталога по его заданному порядковому номеру.
Типичная задача создать массив имён подкаталогов текущего каталога.
DirNum = CountDirectories()
Dim sdir$(DirNum)
sdir$(0) = "[..]"
For i = 1 To DirNum
sdir$(i) = LCase$(GetDirectory$(i))
Next
Но самая нужная в практической работе функция называется Files$. Она, по существу, выполняет четыре функции:
1. возвращает имя текущего каталога, если в качестве аргумента задана точка:
curcat$=Files$(".");
2. определяет, существует ли указанный вами файл. Например:
if Files$("m20941.msg") <> "" then FileNotExist=-1;
3. позволяет задавать обобщенное имя файла (т. е. использовать в имени файла символы "?" и "*") и возвращает имя файла, которое удовлетворяет заданному шаблону поиска;
4. и наконец, позволяет организовать цикл, чтобы найти все имена файлов, удовлетворяющих данному шаблону.
Вот задача, где без функции Files() трудно обойтись. По электронной почте MCI к нам в виде текстовых файлов приходило много писем со статьями.
К сожалению каждому из них предшествовал заголовок длинной 1,5 Кбайт, где отмечался весь неблизкий путь этого письма из Бостона. Следующая макрокоманда уберет заголовки у всех "писем".
Для этого сначала сделает каталог с письмами текущим:
pth$= "C:\ED\MCI"
If Files$(".") <> pth$ Then ChDir pth$"
Следующий оператор возвращает имя первого файла в текущем каталоге, имеющего расширение .msg:
a$ = Files$("*.msg")
чтобы найти следующее имя, функция Files$() задаётся без аргумента.
если файл существует, то откроем его для последующих операций с его содержимым, если не существует, выведем сообщение и завершим работу.
If Files$(a$) <> "" Then FileOpen a$
Else
MsgBox "Файл в текущем каталоге не найден."
End If
Пример.
Занести в массив имена всех файлов в каталоге. Для этого сначала найдем их число.
tmp$ = Files$("*.*")
count = - 1
While temp$ <> ""
count = count + 1
tmp$ = Files$()
Wend
If count > -1 Then
Dim list$(count)
list$(0) = Files$("*.*")
For i = 1 To count
list$(i) = Files$()
Next i
Else
MsgBox "Текущий каталог пуст."
End If
Пример.
Загрузить два файла и расположить их на экране рядом друг с другом в вертикальных окнах.
Sub MAIN
a$ = "C:\EDWARD\MYBASE"
If Files$(".") <> a$ Then ChDir(a$)
FileOpen .Name = am_a_z.doc
FileOpen .Name = firms1.doc
If DocMaximize() Or DocMinimize() Then DocRestore
If CountWindows() = 2 Then
DocMove 0, 0
DocWindowWidth 240
NextWindow
If DocMinimize() Then DocRestore
DocMove 240, 0
DocWindowWidth 240
End If
End Sub
Несколько в стороне находится функция DefaultDir$() и оператор ChDefaultDir. Они позволяют из макрокоманды переопределить или проверить установку каталогов по умолчанию.
Например:
If DefaultDir$(6) = "" Then
ChDefaultDir "C:\TOOLS", 6
End If
Оператор Connect служит для установления соединения с сетевым диском. Формат:
Connect [.Drive = номер,] .Path = текст1 [, .Password = пароль
где:
.Drive – номер соответствует букве, которую вы хотите присвоить сетевому диску. При этом 0 (по умолчанию) соответствует первой доступной букве для имени дисковода, 1 – следующей и т. д.;
.Path – путь для каталога сетевого диска, например "\\AVTOR\IVANOV";
.Password пароль, если сетевой диск защищён паролём.
Оператор SetAttr устанавливает атрибуты файла для файла, имя которого задано аргументом. Устанавливаемые им атрибуты не удаляют атрибуты, установленные этому файлу ранее.
Синтаксис:
SetAttr ИмяФайла$, атрибут
Где аргумент атрибут принимает одно из следующих значений (или их произвольную сумму):
0 – снять все атрибуты
1 – только для чтения
2 – скрытый
4 – системный
32 – архивный
Пример.
Sub MAIN
SetAttr "C:\WPRESSA.DOC", 0 'снять все атрибуты
SetAttr "C:\WPRESSA.DOC", 33 'добавить атрибуты "только для чтения" и "архивный
(32+1)"
End Sub
Для того, чтобы определить какие атрибуты у файла, используется функция GetAttr(имя_файла). Например,
attr = GetAttr
"C:\WPRESSA.DOC"
if attr mod 2 =1 then MsgBox "Только для чтения"
Оператор Name позволяет переименовать файл.
Его формат: Name СтароеИмя$ As НовоеИмя$.
Работа с окнами
При открытии каждого документа и при редактировании макрокоманды WinWord создает новое окно, в котором и происходит работа с ними. Однако в каждый момент времени только одно из этих окон активно. В меню Окно (Windows) имеется список открытых окон, причем активное окно помечено галочкой. Группа операторов и функций языка WordBasic позволяет узнать номер активного окна, его заголовок, сделать активным другое окно и многое другое. Посмотрим, как это делается.
Число открытых окон возвращает функция CountWindows().
Функция Window() возвращает номер активного окна в списке окон меню Окно. При этом 1 – соответствует первой позиции в списке, 2 – второй и т. д. Если открытых окон нет, то Window() возвращает 0 (ноль). Обратите внимание, что WinWord выводит список заголовков окон в алфавитном порядке, при этом изменение текущего каталога может изменить порядок следования заголовков в этом списке, так как для текущего каталога выводится только имя файла, а для файлов в других каталогах в заголовке окна указывается еще и полный путь.
Получить заголовок открытого окна можно с помощью функции WindowName$(номер), где номер – номер заголовка в списке. Если номер опущен или равен 0,
возвращается заголовок активного окна.
WindowList номер – делает активным окно с заданным номером. Если номер больше числа открытых окон в списке, то диагностируется ошибка. Этот оператор кроме всего весьма полезен при отладке макрокоманд.
Два оператора NextWindow и PrevWindow позволяют циклически перемещаться по списку окон в обоих направлениях. NextWindow – активирует окно, находящееся в списке непосредственно после активного окна. Если имя активного окна стоит в списке последним, то активизируется окно, стоящее в списке первым. Если активное окно единственное в списке, ничего не происходит. Оператор PrevWindow работает точно так же, но в обратном направлении.
Пример.
Оператор PrevWindow часто используется для переключения между окном редактирования макрокоманд и окном документа.
Оба этих окна должны быть предварительно открыты.
Sub MAIN
If DocMaximize() = 0 Then DocMaximize
MsgBox "Нажмите OK, чтобы перейти к предыдущему окну"
PrevWindow
MsgBox "Теперь нажмите OK, чтобы вернуться."
PrevWindow
End Sub
Чтобы отличить окно, в котором происходит редактирование, от окон документов,
используется функция IsMacro([номер]). Она возвращает -1, если это так, и 0, если нет.
Оператор WordNewWindow – открывает новое окно, содержащее документ, находящийся в активном окне. К заголовкам обоих окон WinWord добавляет двоеточие номер (соответствует выбору пункта Новое окно в меню Окно).
Оператор WindowArrangeAll упорядочивает расположение окон на экране таким образом, чтобы они не перекрывались (соответствует выбору пункта Упорядочить все в меню Окно).
Пример: Активизация первого окна, содержащего документ TEST.DOC:
numwin = CountWindows()
If numwin <> 0 Then
i = 1
While i <= numwin And leave <> 1
winname$ = WindowName$(i)
If InStr(winname$, "TEST.DOC") Then leave = 1
If leave <> 1 Then i = i + 1
Wend
End If
If InStr(winname$, "TEST.DOC") Then
WindowList i
Else
MsgBox "В списке нет окна, содержащего TEST.DOC."
End If
Работа с полями средствами WordBasic
CountMergeFields(). Эта функция определяет, сколько соединяемых полей определено в файле данных.
Оператор DoFieldClick
Перемещает IP в точку, местоположение которой задано выбранным полем macrobutton. См. таблицу.
DropDownFormField
EnableFormField
FormFieldOptions
GetMergeField$()
MergeFieldName$()
ToolsManageFields
TextFormField – вставляет текст из в точку вставки, соответствует кнопке Text Form Field на панели Forms.
Работа с полями (Занятие №7)
Поля для меня всегда были одним из самых загадочных объектов в WinWord. Что такое поле? Это заключённое в фигурные скобки ключевое слово, возможно с набором аргументов, которое говорит редактору какую информацию нужно вставить в документ. Например, если в тексте документа будет стоять {data}, то Word при его выводе подставит в это поле текущую дату. В табл. 1 приведены основные типы полей (не указаны поля, появившиеся в версии
7.0). Из таблицы видно, что многим своим достоинствам Word обязан полям. (Обратите внимание, что язык HTML устроен очень похожим способом. Совокупность полей WinWord также можно рассматривать как некоторый вспомогательный язык разметки документа.) Естественно нас интересует, как работать с Word полями средствами WordBasic. Поле может быть вставлено в документ из пункта Поле
меню Вставка.
Таблица 1. Основные поля WinWord.
|
Поле |
Назначение |
|
= выражение |
Вычисляет заданное арифметическое выражение и вставляет результат в поле |
|
ASK |
Запрос ввода текста пользователем |
|
AUTHOR |
Вставляет или заменяет имя автора документа |
|
AUTONUM |
Автонумерация абзацев, элементов таблиц или уровня структуры арабскими цифрами |
|
AUTONUMLGL |
Автонумерация заголовков в юридическом формате |
|
AUTONUMOUT |
Буквенная нумерация заголовков |
|
AUTOTEXT |
Выводит в качестве значения текущее значение элемента автотекста |
|
COMMENTS |
Вставляет новое значение в поле Заметки в диалоговом окне Свойства |
|
CREATEDATE |
Выводит дату создания документа |
|
DATABASE |
Позволяет вставлять данные из внешних БД |
|
DATE |
Вставляет текущую дату и время |
|
EDITTIME |
Выводит в качестве значения суммарное время редактирования документа в минутах |
|
EMBED |
Внедряет объект в документ Word |
|
FILENAME |
Выводит имя файла документа |
|
FILLIN |
Выводит диалоговое окно для ввода произвольных данных |
|
GOTOBUTTON |
Создаёт в документе команду перехода. Двойной щелчок по этому полю вызывает переход к тому месту в документе, которое определяется параметром Назначение |
|
IF |
В зависимости от вычисления условия вставляет в документ один из двух операндов |
|
INCLUDEPICTURE |
Вставляет в документ указанный рисунок |
|
INCLUDETEXT |
Вставляет в документ рисунок или текст |
|
INDEX |
Создаёт индекс, используя поля XE |
|
INFO |
Позволяет вставлять и изменять общую информацию о документе |
|
KEYWORDS |
Включает в текст ключевые слова документа |
|
LASTSAVEBY |
Имя человека, последним выполнившего сохранение файла. Полезно при работе в сети над одним документом |
|
LINK |
Устанавливает с помощью OLE связь с другим приложением |
|
MACROBUTTON |
Помещает в документ текст или графику, при двойном щелчке на которых вызывается заданная макрокоманда |
|
MERGEFIELD, MERGEREC и MERGESEQ |
Эти поля используются для организации печати документов после слияния их текстов |
|
NEXT |
Используется вместе с полем if |
|
NEXTIF |
Используется вместе с полями next и if |
|
NUMCHARS |
Число символов в документе |
|
NUMPAGES |
Число страниц в документе |
|
NUMWORDS |
Число слов в документе |
|
PAGE |
Вставляет номер страницы, на которой расположено это поле |
|
PAGEREF |
Вставляет для перекрёстных ссылок номер страницы, где находится указанная закладка |
|
PRINT |
это поле позволяет вставить в документ управляющие коды принтера, команды на языке PCL или PostScript |
|
PRINTDATE |
Дата последней печати документа |
|
QUOTE |
Вставляет в документ указанный текст |
|
REF |
Вставляет текст, помеченный указанной закладкой |
|
RD |
используется для создания оглавления документа |
|
REVNUM |
Число редакций документа |
|
SAVEDATE |
Дата и время последнего сохранения |
|
SECTION |
Номер текущего раздела документа |
|
SEQ |
Создаёт автоматически увеличивающуюся последовательность чисел, которую можно использовать для нумерации рисунков, таблиц и т.д. |
|
SET |
присваивает значение закладке. Замечательно тем, что через это поле макрокоманды могут передавать друг другу значения переменных |
|
SKIPIF |
используется для условных пропусков записей при печати документа |
|
STYLEREF |
Вставляет текст, ближайшего абзаца, отформатированный указанным стилем |
|
SUBJECT |
Вставляет тему документа из диалогового окна Свойства |
|
SYMBOL |
Вставляет один символ с заданным шрифтом и кодом |
|
TC |
Помечает текст для включения его в документ |
|
TEMPLATE |
Вставляет имя шаблона документа |
|
TIME |
Вставляет текущее время на момент обновления поля |
|
TITLE |
Вставляет или меняет название документа |
|
TOC |
Определяет элемент оглавления |
|
useraddress |
Вставляет почтовый адрес, взятый из диалогового окна “Информация о пользователе” |
|
userinitials |
Вставляет в документ инициалы, взятые из диалогового окна “Информация о пользователе” |
|
username |
Вставляет в документ имя, взятое из диалогового окна “Информация о пользователе” |
|
XE |
Определяет элемент индекса |
Работа с приложениями
AppActivateAppClose
AppCount()
AppGetNames, AppGetNames()
AppHide
AppInfo$()
AppIsRunning()
AppMaximize, AppMaximize()
AppMinimize, AppMinimize()
AppMove
AppRestore, AppRestore()
AppSendMessage
AppShow
AppSize
AppWindowHeight, AppWindowHeight()
AppWindowPosLeft, AppWindowPosLeft()
AppWindowPosTop, AppWindowPosTop()
AppWindowWidth, AppWindowWidth()
ControlRun
DDEExecute
DDEInitiate()
DDEPoke
DDERequest$()
DDETerminate
DDETerminateAll
DialogEditor
ExitWindows
FileExit
GetSystemInfo, GetSystemInfo$()
MicrosoftAccess
MicrosoftExcel
MicrosoftFoxPro
MicrosoftMail
MicrosoftPowerPoint
MicrosoftProject
MicrosoftPublisher
MicrosoftSchedule
MicrosoftSystemInfo
RunPrintManager
SendKeys
Shell
Работа с таблицами (Занятие №4)
Средства навигации по таблице
Начнем с команд навигации по таблице. Итак, напомню:
StartOfRow – перемещение IP или выделения (если используется одноименная функция) в начало строки таблицы;
EndOfRow – в конец строки таблицы;
StartOfColumn – в начало столбца;
EndOfColumn – в конец столбца.
NextCell – переход и выделение содержимого следующей ячейки таблицы (аналогично нажатию клавиши TAB). Если уже выделено более одной ячейки, NextCell переходит к первой из них. Если точка вставки находится в последней ячейке таблицы, то NextCell добавляет в таблицу новую строку.
Оператор (и функция) PrevCell – аналогичен NextCell, только выбор ячейки производится в обратном направлении.
Работа с таблицами
Таблицы – один из важнейших элементов создаваемого документа. Что позволяет WordBasic делать с таблицами? Практически все, но с одной оговоркой: в нем отсутствует прямая адресация ячеек таблицы и навигация по ней занятие не для слабонервных. Отчасти это связано с тем, что строки таблицы в WinWord могут иметь разное число столбцов.
План занятия: Сначала мы познакомимся с операторами и функциями для перемещения по таблице, научимся выделять и читать содержимое ячейки и записывать в нее данные, а по пути напишем несколько полезных макрокоманд.
Работа со структурой документа
Операторы этой группы работают только когда WinWord находится с режиме “Структура документа” и по существу повторяют все возможности, предоставляемые соответствующей панелью инструментов.CreateSubdocument
DemoteToBodyText
InsertSubdocument
MergeSubdocument
OpenSubdocument
OutlineCollapse
OutlineDemote
OutlineExpand
OutlineLevel()
Рамки
Левая рамкаОператор BorderLeft удаляет или устанавливает левые рамки выбранных абзацев, ячеек таблиц или графики. Функция BorderLeft() возвращает 1 или 0, в зависимости от того, как отформатированы ли выбранные абзацы, ячейки таблицы и графика с левой рамкой или нет.
Синтаксис:
BorderLeft [On]
BorderLeft()
Аналогично устроены следующие операторы и функции:
|
Снять рамку |
BorderNone, BorderNone() |
|
Рамка справа |
BorderRight, BorderRight() |
|
Рамка сверху |
BorderTop, BorderTop() |
|
Рамка внизу |
BorderBottom, BorderBottom() |
|
Рамка внутри |
End IfBorderInside, BorderInside() |
|
Рамка вне |
BorderOutside, BorderOutside() |
Пример.
В этом примере для нижней рамки используется один из двух стилей, в зависимости от того, находится ли выделение внутри таблицы. Если выделенный фрагмент вне таблицы, то применяется двойная линия, иначе тонкая линия.
If SelInfo(12) = - 1 Then
BorderLineStyle 8
BorderBottom 1
Else
BorderLineStyle 4
BorderBottom 1
FormatBordersAndShading
FormatDefineStyleBorders
FormatDefineStyleFrame
FormatFrame
InsertFrame
RemoveFrames
Оператор ShadingPattern влияет на формат затенения выделенного абзаца, ячеек таблицы или фрейма.
Синтаксис: ShadingPattern тип
тип – число от 0 до 25. Рисунки различных вариантов затенения можно найти в меню Рамки или в Справке. Функция ShadingPattern() возвращает 0, если нет выделенного блока, -1, если не во всём блоке используется одно и тоже затенения, и номер типа затенения, если оно было сделано.
Рисование в WordBasic (Занятие №6)
Большой раздел языка посвящен рисованию. Конечно можно вставлять в документ рисунки из других пакетов, но простые вещи удобнее делать в самом редакторе. Кроме того, многим людям гораздо проще построить рисунок с помощью программы, чем нарисовать его. Опять же, можно сделать библиотеку повторяющиеся фрагментов рисунков, диаграмм и т.д. Важное преимущество построенного программно рисунка – его параметризация. Меняя параметры, можно легко модифицировать рисунок, вместо его полной перерисовки. Нужно отметить, что рисование не самая сильная черта WordBasic, однако можно получить очень интересные фигуры, комбинируя работу макрокоманды и использование панели Рисование.Операторы этого раздела реализуют все возможности, представленные на панели Рисование. Напомню о некоторых особенностях рисования в Word.
1. Рисунок делается на странице документа в режиме просмотра “Разметка страницы” (Outline). При переходе в режим “Обычный” (Normal) в Word 7.0, к сожалению, перестаёт быть виден, а флажок опции Drawings я к своему удивлению там(Tools * Options * View * Show) не обнаружил.
2. Нарисованные объекты можно свободно перемещать мышкой по всему документу.
3. У каждого документа есть три слоя: слой текста, слой под текстом и слой над текстом. По умолчанию при создании рисунка он помещается в слой над текстом. Существуют разные способы перемещения объектов из одного слоя в другой.
Общий совет. Перед тем как писать макрокоманды, рисующие что-либо, опробуйте все возможности рисования с помощью панели инструментов. Тогда вам будет намного понятнее как реализовать эти действия программно.
Чем лучше вы знаете Word,
Чем лучше вы знаете Word, тем легче вам будет освоить WordBasic. Большинство команд WordBasic эквивалентны командам или действиям в Word (особенно в английской версии), а большинство макрокоманд выполняют последовательность действий Word. Можно сказать, что работа с WordBasic слегка похожа на работу в Word, только без пользовательского интерфейса; вместо команд и диалоговых окон вы используете команды языка WordBasic. Операторы и функции, которые будут использоваться вами для написания макрокоманд, гораздо легче понять, если вы знакомы с теми возможностями Word, которые они представляют. Кроме того, хорошее знание Word поможет вам найти наилучший способ выполнения той или иной задачи при написании макрокоманды, чтобы не писать длинную макрокоманду там, где можно обойтись одной командой Word.Изучайте только то, что вам нужно для решения текущей задачи. Из-за большого количества операторов WordBasic необозрим, особенно если у вас небольшой опыт программирования на чем-либо. Способ, которому интуитивно следовая я при первом знакомстве с языком, заключался в изучении и использовании только части средств языка, необходимой для программирования конкретной задачи. С накопление опыта границы рассматриваемой области можно расширить.
Специфика WordBasic (Занятие 3)
С точки зрения программиста, язык WordBasic можно рассматривать как средство работы с тем местом в редактируемом документе, где в момент вызова макрокоманды находился курсор. Это место называется точкой вставки (далее IP – insertion point).
Точку вставки можно перемещать множеством способов. Вот перечень операторов перемещения IP:
CharRight – на символ вправо
CharLeft – на символ влево
WordRight — на слово вправо
WordLeft – на слово влево
SentRight – на предложение вправо
SentLeft – на предложение влево
LineUp — на строку вверх
LineDown — на строку вниз
StartOfLine – на начало строки
EndOfLine — в конец строки
PageUp — на страницу вверх
PageDown — на страницу вниз
StartOfRow – в начало строки таблицы
EndOfRow – в конец строки таблицы
StartOfColumn – в начало столбца
EndOfColumn – в конец столбца
StartOfWindow – в начало окна
EndOfWindow – в конец окна
StartOfDocument – в начало документа
EndOfDocument – в конец документа
Каждый из перечисленных операторов (кроме четырех последних) может быть записан в виде функции с двумя операндами. Например:
CharRight(Счетчик, [Признак_выделения])
Квадратные скобки указывают на то, что заключенный в них операнд, может быть опущен. Если Признак_выделения
опущен, считается, что IP перемещается вправо на заданное счетчиком число символов. (В других функциях перемещения IP Счетчик
задает соответственно слова, параграфы, страницы и т. д.) Эти функции возвращают 0, если перемещение IP выполнено успешно, и -1, если его выполнить невозможно (например, IP находится в самом конце документа.)
Для проверки условия достижения IP границ документа используются функции AtEndOfDocument() и AtStartOfDocument(). Эти функции возвращают -1, если IP находится, соответственно, в конце или начале документа, и 0, если нет.
Напишем макрокоманду, подсчитывающую число предложений в тексте.
Sub MAIN
StartOfDocument
pcount = 0 ‘ счетчик числа предложений
While Not AtEndOfDocument()
SentRight 1, 1 ‘выделить одно предложение
a$ = LTrim$(Selection$()) ‘без пробелов слева
If Len(a$) < 3 Then Goto Skip
‘ не считать пустую строку предложением
If Right$(Selection$(), 1) <> Chr$(13) \
Then pcount = pcount + 1
Skip: ‘снять выделение, IP вправо.
ShrinkSelection
ShrinkSelection
SentRight
Wend
MsgBox "В тексте " + Str$(pcount) + " предложений"
End SUB
В Справке
по WordBasic в примере к оператору SentRight дана значительно более короткая, чем у меня макрокоманда. Но она, к сожалению, считает за отдельное предложение и инициалы перед фамилией, и символы перед элементами перечисления. Поэтому в приведенной выше макрокоманде введено ограничение: предложение не может быть короче двух символов, включая точку. Оператор ShrinkSelection описан чуть ниже, здесь же он убирает выделение с текущего предложения.
Перемещение IP к следующему или предыдущему редактируемому элементу возможно также с помощью специализированных операторов Goto соответственно: GotoNext_элемент
и GotoPrevious_элемент. Так, группа GotoNext состоит из следующих операторов:
GotoNextPage – переход к следующей странице
GotoNextFootnote – переход к ссылке
GotoNextEndnote – переход к следующей концевой ссылке
GotoNextSection – переход к следующему разделу
GotoNextSubdocument – переход к следующему поддокументу
GotoNextAnnotation – переход к следующей аннотации
Следующая макрокоманда позволяет перейти к различным частям активного документа. Если элемент, выбранный для перехода не существует, точка вставки не будет перемещена.
Sub MAIN
Begin Dialog UserDialog 225, 146, "Goto"
OKButton 36, 118, 88, 21
CancelButton 129, 119, 88, 21
OptionGroup .HelpChoice
OptionButton 12, 6, 180, 16, "Следующая аннотация", .OptionButton1
OptionButton 12, 23, 180, 16, "Следующая концевая ссылка", .OptionButton2
OptionButton 12, 40, 180, 16, "Следующая ссылка", .OptionButton3
OptionButton 12, 57, 180, 16, "Следующая страница", .OptionButton4
OptionButton 12, 74, 127, 16, "Следующая секция", .OptionButton5
OptionButton 12, 91, 172, 16, "Следующий поддокумент", .OptionButton6
End Dialog
Dim dlg As UserDialog
GetCurValues dlg
n = Dialog(dlg)
If n = 0 Then Goto bye
Select Case dlg.HelpChoice
Case 0
GoToNextAnnotation ' Сюда можно вставить любую
Case 1 ' из приведенных выше команд
GoToNextEndnote
Case 2
GoToNextFootnote
Case 3
GoToNextPage
Case 4
GoToNextSection
Case 5
GoToNextSubdocument
End Select
bye:
End Sub
Операторы группы GotoPrevious симметричны операторам GotoNext, только перемещают IP по направлению к началу текста. В приведенной выше макрокоманде все операторы вида GoToNext могут быть заменены на соответствующие операторы GoToPrevious.
Отдельное место среди операторов Goto занимает GoBack, перемещающий IP через четыре места, где происходило последнее по времени редактирование (соответствует нажатию клавиш
Ряд операторов связан с перемещением, аналогичным перемещению движка на линейке прокрутки. Это операторы VScroll, HScroll, VPage, HPage, VLine, HLine и соответствующие им функции VScroll(), HScroll(), VPage(), HPage(), VLine() и HLine().
Оператор VScroll осуществляет вертикальную прокрутку активного документа на указанный в качестве аргумента процент длины документа. Одновременно перемещается указатель на линейке вертикальной прокрутки. Функция VScroll() возвращает процент от длины документа, где находится IP. Так оператор VScroll 50 переместит точку вставки в середину документа. Аналогично работают оператор HScroll и функция HScroll(), но для горизонтальной прокрутки.
Оператор HLine имеет в качестве необязательного аргумента счетчик, показывающий на сколько шагов прокрутить по горизонтали активный документ. Положительное значение аргумента означает прокрутку вправо, отрицательное – влево. Если аргумент опущен, то один шаг вправо.Шаг прокрутки соответствует щелчку мыши по стрелке на линейке прокрутки. Аналогично работает VLine.
Оператор HPage, работает как HLine, но шаг прокрутки равен щелчку мыши на линейке прокрутки.
В WordBasic существуют и чуть более сложные формы перемещения, такие как перемещение по таблице.
Примеры:
Эта макрокоманда проверяет, находится ли IP в конце окна и выделяет от конца окна в его начало, либо наоборот:
Sub MAIN
If EndOfWindow() Then
StartOfWindow 1
Else
MsgBox "IP уже в конце окна "
StartOfWindow
EndOfWindow 1
End If
End Sub
Средства навигации по таблице
Как и на первом занятии начнем с команд навигации по таблице. Итак, напомню:StartOfRow – перемещение IP или выделения (если используется одноименная функция) в начало строки таблицы;
EndOfRow – в конец строки таблицы;
StartOfColumn – в начало столбца;
EndOfColumn – в конец столбца.
NextCell – переход и выделение содержимого следующей ячейки таблицы (аналогично нажатию клавиши TAB). Если уже выделено более одной ячейки, NextCell переходит к первой из них. Если точка вставки находится в последней ячейке таблицы, то NextCell добавляет в таблицу новую строку.
Оператор (и функция) PrevCell – аналогичен NextCell, только выбор ячейки производится в обратном направлении.
Управление элементами интерфейса WinWord
Управление линейкой (оставлено для совместимости с предыдущими версиями WordBasic): ViewRibbon, ViewRibbon().
Синтаксис:
ViewRibbon [вкл_выкл]
вкл_выкл - 0 - не показывать
1 - показывать
опущено - изменяет значение переключателя на противоположное (инвертирует его).
Функция ViewRibbon() возвращает – 1, если линейка видна, 0, если нет.
Пример: макрокоманда инвертирует переключатель определяет видна Линейка форматирования
или нет.
Sub MAIN
If SelInfo(27) = - 1 Then FileNewDefault
ViewRibbon
n = ViewRibbon()
If n = 0 Then
MsgBox "Линейка форматирования спрятана."
Else
MsgBox "Линейка форматирования видна."
End If
End Sub
Управление Линейкой: ViewRuler, ViewRuler()
Синтаксис:
ViewRuler [On]
ViewRuler()
Пример:
Sub MAIN
If SelInfo(27) = - 1 Then FileNewDefault
ViewRuler 1
n = ViewRuler()
If n = 0 Then
MsgBox "The Ruler is hidden."
Else
MsgBox "The Ruler is visible."
End If
End Sub
Оператор ViewMenus()
Синтаксис:
ViewMenus()
Пример:
Sub Main
n = ViewMenus()
If n = 1 Then
MsgBox "The full menu bar is not displayed."
Else
MsgBox "The full menu bar is displayed."
End If
End Sub
Управление показом линейки статуса: ViewStatusBar, ViewStatusBar()
Синтаксис:
ViewStatusBar [On]
ViewStatusBar()
Пример:
Sub MAIN
ViewStatusBar 0
n = ViewStatusBar()
If n = 0 Then
MsgBox "Строка статуса не видна."
Else
MsgBox " Строка статуса не видна."
End If
End Sub
Для того чтобы вставить в текст текущую дату, проще всего воспользоваться функцией Date$(), возвращающей ее в символьном виде. В русифицированной версии дата возвращается в формате ДД.ММ.ГГ.
Вся работа с календарными датами построена на понятии последовательного номера дня. Этот номер вычисляется функцией Now(), которая возвращает последовательный номер (SN), соответствующий текущей системной дате (правая чисть) и времени (цифры после десятичной точки).
Другие функции преобразуют этот последовательный номер в нужное им возвращаемое значение.
Функция Year(SerialNumber) возвращает целочисленное значение от 1899 до 4095, соответствующее компоненте “год” в SerialNumber. Пример:
yr = Year(Now())
insert Right$(Str$(yr),2)
mns = Manth (Now())
dy = Day (Now())
Для преобразования календарных дат введенных пользователем (т.е. из символьного вида в число), служит функция DateValue().
Вспомогательные операторы
Оператор ViewDrawingToolbar выводит на экран Панель рисования, если она была невидима, либо прячет её, если она там уже присутствует, аналогично работает оператор ViewBorderToolbar, только с панелью рамок (Borders).
Оператор с забавным названием ToggleScribbleMode привлекает только тем, что он сделан для поддержки ПК с рукописным вводом.
Встроенные функции языка WordBasic
Abs(n) – возвращает абсолютное значение числа. В отличие от некоторых других числовых функций в WordBasic, она не требует предварительного преобразования числа с помощью функции Int(), а работает с любым числом. Если нужно знак числа можно определить с помощью функции Sgn(). Пример:
m = Abs(1.51 + 2.49) + Abs(-1.5)
Int (n) – отбрасывает дробную часть числа и возвращает его целую часть. Никаких других действий, типа округления, с числом не производится.
Пример.
tmp=int (-4, 99998)
rem после выполнения tmp=-4.
В Word 7.0 с помощью макрокоманды из следующих двух строк, я попытался найти диапазон представления целых чисел:
b = Int(9999999 * 9999999)
MsgBox Str$(b)
При данных значениях сомножителей выдаётся целочисленный результат, а при добавлении ещё одного знака – результат печатается в экспоненциальной форме (в научной нотации). Дело в том, что в более ранних версиях WinWord существуют ограничения на величину целых чисел (от -32768 до +32768), так как там используется обычная, 16-разрядная целочисленная арифметика. и может возникнуть обычное переполнение (ошибка номер 6).
Rnd() – возвращает псевдослучайное число в интервале от 0 до 1.
Sgn(n) – функция знака числа. 1, если число >0, -1, если <0 и 0, если =0.
Asc(a$) – возвращает код первого символа строковой переменной.
Пример.
НомерСимвола=Asc(строка$), НомерСимвола принимает значения от 0 до 255.
Chr$(x) – функция, обратная к Asc. Возвращает символ, код которого x.
CleanString$(Str$) – заменяет все непечатаемые символы и специальные символы WinWord в строке Str$ на пробелы. Символ 13 (конец абзаца) не заменяется.
InStr(Index, Source, Search) – возвращает позицию, начиная с которой строка Search входит в строку Source (1 – с первого символа, 2 – со второго и т.д., 0 – вхождение не найдено).
LCase$(Str$) – возвращает строку, в которой все прописные буквы строки Str$ заменены строчным буквами. В русской версии WinWord с кириллицей работает правильно.
Len(n) – возвращает число символов в строке.
Left$(Count, Str$) – возвращает Count самых левых символов строки Str$.
LTrim$(Str$) – возвращает строку Str$ с удаленными лидирующими пробелами, т.е. без пробелов в начале строки.
Пример: header$ = LTrim$(" WordBasic")
Mid$(Str$, Start, [Count]) – возвращает подстроку строки Str$, начинающуюся с позиции Start и длинной Count символов. Если аргумент Count опущен, то берется оставшаяся часть строки.
Right$(Count, Str$) – возвращает Count самых правых символов строки Str$.
RTrim$( Str$) – возвращает строку Str$ с удаленными хвостовыми пробелами
Пример: header$ = RTrim$("WordBasic ")
Str$(n) – возвращает строковое представление числа n.
UCase$(Str$) – возвращает строку, в которой все строчные буквы строки Str$ заменены прописными буквами. С кириллицей работает правильно.
String$(Count, Str$) – возвращает первый символ строки Str$, повторенный Count раз. Вместо Str$ может задаваться ASCII-код символа.
Val(Str$) – возвращает числовое значение, содержащееся в строке Str$.
Здесь уместно рассказать также и об операторе и функции ToolsCalculate.
Оператор ToolsCalculate вычисляет выделенный текст как математическое выражение, а затем выводит результат в строку статуса и в Буфер обмена.
Функция ToolsCalculate([Выражение$]), если не задано Выражение$ действует аналогично оператору, за исключением того, что она возвращает результат, а не выводит его в строке статуса и не помещает в Буфер обмена. Выражение может включать имена закладок и простые ссылки на ячейки.
Примеры.
1. Возведение в степень:
Deg= ToolsCalculate("5 ^ 3")
2. В частности, чтобы извлечь квадратный корень, можно записать это как возведение в степень 0.5:
x = ToolsCalculate("81^0.5")
3. Вычисление со ссылками на элементы электронной таблицы:
Summa= ToolsCalculate("a5 + b3")
Встроенные закладки
В языке WordBasic существует очень интересная группа переменных – так называемые встроенные закладки (Predefined Bookmarks). Они обеспечивают командам перемещения гораздо большие возможности, чем мы до сих пор видели, а также возможность работать с отдельными участками документа. Встроенные закладки не отображаются в окне "Перейти" (Правка·Перейти...).
Имя закладки строка длиной 20 символов, начинающаяся с буквы и состоящая из букв, цифр и символов подчёркивания.
Вот список встроенных закладок, значения которых постоянно отслеживаются редактором. Имя закладки начинается с обратной косой черты и в командах используется как строковый литерал (т.е. заключается в кавычки).
\Sel – текущий выделенный текст или точка вставки;
\PrevSel1 – выделение текста, где происходило последнее по времени редактирование. Переход к этой закладке эквивалентен однократному выполнению команды GoBack;
\PrevSel2 – выделение текста, где происходило предпоследнее по времени редактирование. Переход к этой закладке эквивалентен двукратному выполнению команды GoBack;
\StartOfSel – начало текущего выделенного текста;
\EndOfSel – конец текущего выделенного текста;
\Line – текущая строка или первая строка текущего выделенного текста;
\Char – текущий символ, т. е. символ за IP, если нет выделенного текста, если он есть, то это первый его символ;
\Para – текущий абзац, т.е. абзац, в котором находится IP.
\Section – текущая секция, включая разрыв в конце секции. Она содержит IP или выделенный текст. Если в выделенном тексте содержится более одной секции, то выбирается первая из них.
\Doc – все содержимое активного документа за исключением метки последнего абзаца.
\Page – текущая страница, включая разрыв в конце страницы, если он есть. Если выделенный текст содержит более одной страницы, закладка "\Page" относится к первой странице выделения.
\StartOfDoc – начало документа.
\EndOfDoc – конец документа.
\Cell – текущая ячейка таблицы, т.е. ячейка, содержащая IP. Если в текущей выделенной части таблицы содержится более одной ячейки, эта закладка относится к первой из них, если только не выделена вся таблица.
\Table – текущая таблица, т.е. таблица, содержащая IP или выделенный участок. Если в выделенном участке более одной таблицы, то эта закладка относится к первой из них, даже если она выделена не полностью.
\HeadingLevel – заголовок, содержащий IP или выделенный текст, плюс любые соподчиненные заголовки и текст. Если текущий выделенный участок документа содержит только текст, эта закладка будет относиться к предшествующему заголовку и всему, что ему соподчиняется.
Введение (Занятие №1)
WordBasic – это встроенный язык для программирования макрокоманд в текстовом процессоре Word for Windows 6.0 (далее WinWord или просто Word). Несмотря на обилие возможностей этого текстового процессора, при выполнении конкретного вида работ у вас (у ваших знакомых, клиентов и т.п.) часто возникает необходимость в создании новых команд, сокращающих количество выполняемых при редактировании действий. WordBasic можно использовать для модификации любых имеющихся в Word команд и для создания новых. Написанную вами макрокоманду можно ввести в интерфейс Word как дополнительный пункт меню, значок (пиктограмму) панели инструментов или вызывать нажатием сочетания клавиш – таким образом она будет выглядеть как “родная” команда этого редактора.В отличие от обычных Бейсиков, в WordBasic очень много новых операторов, связанных со спецификой текстообработки, поэтому на первый взгляд он кажется громоздким и необозримым. К тому же русская версия этого пакета поставляется без описания языка, а имеющийся Help не переведен с английского.
В популярном интегрированном пакете Microsoft Excel реализован язык Visual Basic. В СУБД Access
используется сходный с WordBasic язык Access Basic. Все эти языки – диалекты Object Basic
[1]. Однако, хотя базовые наборы операторов и функций языка во всех пакетах совпадают, в каждом из них имеется много различных дополнительных средств, связанных соответственно со спецификой обработки электронных таблиц, данных и текстов.
Цель этой книги – дать подход к быстрому освоению языка WordBasic. Предполагается, что читатель имеет опыт общения с каким-либо процедурным языком программирования. Изложение ведется на базе WordBasic русифицированной версии Word 6.0 для Windows.
Выбор и перемещение объектов
Оператор DrawSetRange
С помощью этого оператора устанавливаются границы для работы с группой объектов. Это нужно для других операторов и функций, о которых речь пойдет чуть ниже. Напомню, что закладки (bookmarks), в том числе предопределённые, рассматривались нами ранее.
Синтаксис:
DrawSetRange закладка$
Функция DrawSetRange
Ведёт себя так же как и оператор и возвращает -1, если диапазон установлен, и 0, если не установлен (например закладка не существует).
Синтаксис:
DrawSetRange (закладка$)
Убрать установленный диапазон можно с помощью оператора DrawClearRange.
Функция DrawCount возвращает число рисованных объектов, якоря которых находятся в диапазоне, установленном с помощью оператора DrawSetRange.
Пример.
DrawSetRange " \Section"
Print “Число объектов =”, DrawCount()
DrawClearRange
Более точную информацию о рисованных объектах можно получить с помощью функции DrawGetType, возвращающей число, соответствующее типу рисованного объекта, который задан аргументом номер.
Синтаксис:
DrawGetType(номер)
Аргумент находится в диапазоне от 1 до DrawCount() и означает количество объектов внутри границ, заданных оператором DrawSetRange. Если номер опущен, возвращается тип рисованного объекта:
0 аргумент не задан и рисованный объект не выбран;
1 аргумент не задан и выбрано более одного объекта;
2 линия;
3 текстовый блок;
4 прямоугольник;
5 эллипс;
6 дуга;
7 изображение произвольной формы;
8 рисованный вызываемый объект.
Оператор DrawSelect
Оператор DrawSelect выбирает заданный рисованный объект и отменяет выбор любого другого рисованного объекта. Для выбора объекта без отмены выбора других объектов, используется оператор DrawExtendSelect. Функция DrawSelect() действует также как оператор и возвращает -1, если заданный объект был выбран.
Синтаксис:
DrawSelect Объект
DrawSelect(Объект)
Аргументы:
Объект – задаёт рисованный объект, якорь которого находится в диапазоне, заданном оператором DrawSetRange, где
1 – первый объект в этом диапазоне, 2 – второй, и т. д. Если число вне диапазона, возникает ошибка.
Операторы DrawSelectNext и DrawSelectPrevious
DrawSelectNext выбирает из стека объектов следующий рисованный объект, ближайший к его вершине, а DrawSelectPrevious действует в обратном направлении.. Обратите внимание, что для использования этих операторов не требуется обязательное применение оператора DrawSetRange.
Оператор DrawExtendSelect
Выбирает рисованный объект, заданный аргументом счётчик, якорь которого находится внутри диапазона установленного оператором DrawSetRange. счётчик – позиция объекта относительно уровня текста: 1 – соответствует объекту, ближайшему к уровню текста;, 2 – для следующего объекта, и т. д. Если уже выбрано два или более рисованных объектов, то объект заданный аргументом счётчик, он добавляется к группе выбранных объектов.
Синтаксис:
DrawExtendSelect счётчик
Оператор DrawUnselect
Отменяет выбор выделенного объекта и перемещает точку вставки к началу абзаца, содержащего соответствующий якорь. Если выбрано более одного объекта, DrawUnselect перемещает IP к первому абзацу, содержащему якорь по крайней мере для одного из выбранных объектов.
Операторы DrawGroup и DrawUngroup
Оператор DrawGroup (см. пример в Справке) группирует выбранные рисованные объекты таким образом, что с ними можно затем манипулировать как с единым объектом, а DrawUngroup удаляет связь между объектами, установленную предшествующим DrawGroup, таким образом можно будет независимо переместить и изменить размеры каждого объекта.
Оператор DrawDisassemblePicture
Преобразует выбранную графику в группу рисованных объектов. Если выбранная графика не может быть преобразована, Word вставляет её в текстовый блок.
Оператор DrawAlign
Выравнивает выделенные рисованные объекты.Аргументы соответствуют опциям диалогового окна Align (Align Drawing Objects button, Drawing toolbar).
Синтаксис:
DrawAlign [.Horizontal = число1] [, .Vertical = число2] [, .RelativeTo = число3]
Аргументы:
.Horizontal – выравнивание по горизонтали: 0 – не выравнивать, сохраняется существующее положение; 1 – влево; 2 – по центру; 3 – вправо;
.Vertical – выравнивание по вертикали: 0 – не выравнивать, сохраняется существующее положение; 1 – по верху; 2 – по центру; 3 – по низу;
.RelativeTo – указывает, как должны быть выровнены объекты: 0 – относительно друг друга; 1 – относительно страницы.
Выделение ячеек таблицы
Операторов в этой группе не так много, но все они часто используются при разработке макрокоманд для действий с таблицами.
TableSelectTable – выделить всю таблицу.
TableSelectColumn – выделить текущую колонку
CharRight 1, 1 – расширить выделение на соседнюю колонку
TableSelectRow – выбрать строку таблицы, содержащую IP или все выделенные строки.
Функция SelType()
используется для проверки, пуста ли ячейка:
If SelType() = 1 Then MsgBox "Ячейка пуста!"
Очень полезно использование функции SelInfo(Тип_С), которая возвращает 36 видов информации о выделенной части документа. Напомню, что активный конец такого участка тот, который перемещается при нажатии клавиш
12 – возвращает -1, если выделен участок таблицы;
13 – номер строки таблицы, где находится начало выделенного участка таблицы;
14 – номер строки таблицы, где находится конец выделенного участка таблицы;
15 – число строк в таблице;
16 – номер колонки, где находится начало выделенного участка таблицы;
17 – номер колонки, где находится конец выделенного участка таблицы;
18 – наибольший номер колонки в строках, содержащих выделенный участок таблицы.
31 – возвращает -1, если IP находится у метки конца строки.
Примеры:
1. Переход к первой ячейке таблицы
TableSelectTable
StartOfRow
2. Переместить IP к метке конца первой строки таблицы. Когда IP находится в этой позиции, с помощью оператора TableInsertColumn можно добавить столбец к концу таблицы. <проверить>
TableSelectTable
StartOfColumn
3. Переместить IP к первому символу после таблицы.
TableSelectTable
CharRight
4.
Использование функции NextCell() для определения того, что IP находится в конце таблицы.
If NextCell() = 0 Then TableSelectTable
5. Проверка того, что IP находится внутри таблицы.
While SelInfo(12) = -1
'
Операторы,
выполняющие действия
'
над ячейками таблицы
Wend
Выделение текста
Как известно, все действия в WinWord осуществляются над выделенным текстом, поэтому в роли точки вставки во многих операторах может рассматриваться активный конец выделенного участка (selection). Выделение текста можно выполнить непосредственно в макрокоманде:SelectCurWord – выделить текущее слово;
SelectCurSentence – выделить текущее предложение, содержащее точку вставки или выделение. При этом выделяются и хвостовые пробелы. Если выделенный текст больше одного предложения, то генерируется ошибка.
Размер выделенного участка можно расширить или уменьшить с помощью операторов ShrinkSelection и ExtendSelection. Эти операции выполняются ими в обе стороны последовательно: IP, слово, предложение, абзац, страница, весь документ. (Поэтому, в частности, в приведенной выше макрокоманде для снятия выделения с предложения оператор ShrinkSelection применяется дважды.)
Оператор ExtendSelection включает режим выделения текста, если тот не был включен. После этого любое перемещение IP будет определять выделяемую область, пока режим выделения не будет выключен с помощью оператора Cancel. Проверить состояние режима выделения можно с помощью функции ExtendMode(), которая возвращает значение -1, если режим выделения включен. Давайте выделим документ целиком.
Sub MAIN
StartOfDocument ‘IP в начало документа
ExtendSelection ‘включили режим выделения
EndOfDocument ‘IP в конец документа
Cancel ‘закончили выделение
End SUB
Этот пример демонстрирует несколько необычную логику выполнения ряда действий в языке WordBasic. Похожим образом выполняются копирование и перемещение текста. Но о них чуть позже. Так как операция выделения всего документа используется достаточно часто, то для этой цели существует специальный оператор, EditSelectAll, заменяющий приведенную выше последовательность операторов.
В какую сторону (справа налево или слева направо) с помощью мыши или клавиш ни выделялся бы текст, IP всегда находится на правом конце выделенного блока.
Я не нашел способа ( кроме снятия выделения) перемещения IP к его левому краю, поэтому, чтобы последовательность просмотра текста была естественной, выделенный участок в предлагаемых примерах макрокоманд заносится в строковую переменную.
В WordBasic реализован и другой подход к выделению текста. Функция GetSelStartPos() возвращает позицию первого символа выделенного участка относительно начала документа (позиция 0). При этом считаются все символы, включая непечатаемые и скрытые. Аналогично работает и функция GetSelEndPos(), возвращающая позицию последнего символа выделенного участка.
Если GetSelStartPos()=GetSelEndPos(), то выделение текста отсутствует. Это используется в следующей полезной макрокоманде.
В статьях по компьютерной тематике нам часто приходится переходить с одного алфавита на другой. Иногда это забываешь сделать, и текст на кириллице набивается латиницей и наоборот. В некоторых отечественных редакторах (в частности, в “Микромире”, W&D) существует операция преобразования такого неверно введенного текста к нужному виду. В WinWord подобной встроенной операции нет, но она может быть реализована в виде макрокоманды, вот один из ее вариантов:
Sub MAIN
‘ Заменить латинский шрифт на кириллицу
Lltab$ = "f,dultt;pbqrkvyjghcnea[wxio]sm'.z"
Ultab$ = "F
Lrtab$ = "абвгдеежзийклмнопрстуфхцчшщъыьэюя"
b$ = Selection$()
If GetSelStartPos() = GetSelEndPos() \
Then MsgBox "No selection" : Stop
c$ = ""
For i = 1 To Len(b$)
tmpc$ = Left$(b$, 1)
ind = InStr(1, Ultab$, tmpc$) ‘прописная?
If ind > 0 \
Then c$ = c$ + UCase$(Mid$(Lrtab$, ind, 1)) : Goto lp
ind = InStr(Lltab$, tmpc$) ‘строчная ?
If ind > 0 Then c$ = c$ + Mid$(Lrtab$, ind, 1)
If ind = 0 Then c$ = c$ + tmpc$
lp:
If Len(b$) > 1 Then b$ = Mid$(b$, 2)
Next i
EditCut'вырезать выделенный участок
Insert c$'и вставить новый текст
End SUB
Читателям предлагаю написать в качестве упражнения макрокоманду, исправляющую английский текст, набранный в кириллице.Затем попробуйте объединить эти макросы в один.
Взаимодействие с пользователем
Рассмотрим несколько операторов, которые нам потребуются ниже в примерах макрокоманд.Для ввода строки в переменную макрокоманды используется функция InputBox$(“Сообщение”). Текст сообщения подсказывает, какие данные нужно ввести. InputBox$ возвращает введенную строку, которая может быть длинной до 255 символов.
Пример:
word$ = InputBox$("Счетчик =")
count = Val(word$)
Для вывода сообщений служит оператор MsgBox "сообщение". Следующий оператор выводит значение счетчика, введенного в предыдущем примере:
MsgBox Str$(count)
Обратите внимание, что числовые значения перед выводом предварительно должны быть преобразованы в строковые.
Можно воспользоваться также оператором Print, который работает, как и в обычном Бейсике, за одним исключением: вывод осуществляется в самую нижнюю строку экрана (если вывод не в файл).
Оператор Beep [ТипСигнала] служит для вывода звукового сигнала. ТипСигнала – число от 0 до 15
Sub MAIN
for i=0 to 15
beep i
for j=0 to 100: next j
next i
End Sub
WordBasic: операторы редактирования (Занятие №5)
Один из моих учителей программирования говорил: “Ничего не делай руками, если для этого можно написать программу”. Работая с текстами иногда думаешь, что несколько однотипных исправлений проще сделать вручную, чем написать для этого макрокоманду, но жизнь неоднократно доказывала мне обратное. Команды редактирования WordBasic позволят вам автоматизировать самые трудоемкие операции.Оператор EditGoTo
Этот оператор служит для перехода на редактируемый элемент текста:
EditGoTo [[.Destination = ]"аргумент"]
перемещает точку вставки в заданный элемент текста. В качестве операнда можно задать один из следующих буквенных аргументов:
|
Страница |
p |
|
Секция |
s |
|
Закладка |
(пусто) |
|
Аннотация |
a |
|
Ссылка |
f |
|
Концевая ссылка |
l |
|
Поле |
d |
|
Таблица |
t |
|
Рисунок |
g |
|
Формула |
q |
|
Объект |
o |
Число, стоящее за буквой, означает число повторений. Так p5 – переход на пятую страницу документа. Если число отделено от аргумента знаками + или -, то отсчет производится от текущей точки вставки. Например "l-" ссылается на предыдущую строку, а "l+" – на следующую.
Примеры.
EditGoTo "+" ' переход на следующую страницу
EditGoto "p+"
EditGoTo "P+"
EditGoTo "-" ' переход на предыдущую страницу документа
EditGoTo "p-"
EditGoto "+4" ' переход на четыре страницы вперед
EditGoTo "-3" ' на три страницы назад
Задание. Что делают следующие команды:
EditGoto "L4"
EditGoto "L+"
EditGoto "L+3"
EditGoto "L-"
Возможны более сложные сочетания команд. Например, EditGoto "4L7" переместит точку вставки к началу седьмой строки на четвёртой странице.
EditGoto "50%" переместит IP в середину документа, а EditGoto "%100" – в конец документа.
Оператор EditGoto можно использовать для перемещения к следующей таблице в вашем документе. Для задания перехода к таблице используется аргумент "t". Следующий оператор переместит точку вставки к первой ячейке следующей таблицы.
EditGoTo "t+"
Аналогично поступаем и при работе с рисунками, формулами и другими объектами.
WordBasic в Word 7.0 для Windows 95 (Занятие №8)
В Word 7.0 в язык WordBasic было добавлено довольно много новых операторов и функций. Эти дополнения коснулись следующих разделов:- автокоррекция;
- адресная книга;
- форматирования символов;
- свойства документов;
- поиск и замена;
- электронная почта;
- Справка;
- защита;
- инструменты.
В рамках одного занятия мы не сможем рассмотреть все эти расширения языка, рассмотрим только наиболее существенные.
Это занятие мне хотелось бы
Это занятие мне хотелось бы начать с реального примера полезности написания макрокоманд. Как известно сейчас при всеобщем увлечении Интернетом большое количество текстовых файлов приходит в HTML-формате. К сожалению в WinWord отсутствует фильтр для чтения таких файлов. Проблема в том, что этот язык гипертекстовой разметки вставляет в текст очень много своих специальных значков, которые затем интерпретируются программами просмотра (браузерами). Следующая макрокоманда очищает загруженный в Word HTML-документ от знаков разметки, оставляя только те из них, которые несут полезную информацию. Я прогонял её на текстах пресс-релизов корпорации Intel, получая вполне читабельный текст, который можно было обрабатывать дальше.Sub MAIN
Dim H$(35)
H$(0) = ""
H$(1) = "
H$(2) = "
H$(3) = ""
H$(4) = ""
H$(5) = " "
H$(6) = ""
H$(7) = "
"
H$(8) = "
"H$(9) = ""
H$(10) = ""
H$(11) = "
H$(12) = ""
H$(13) = ""
H$(14) = " "
H$(15) = "
"
H$(16) = "
"H$(17) = ""
H$(18) = ""
H$(19) = "
"
H$(20) = "
"
H$(21) = "
"H$(22) = ""
H$(23) = ""
H$(24) = "
H$(25) = "
"
H$(26) = ""
H$(27) = ""
H$(28) = ""
H$(29) = "
"
H$(30) = "
"H$(31)= ""
H$(32)="
For i = 0 To 32
StartOfDocument
EditReplace .Find = H$(i), .Replace = "", .ReplaceAll
Next i
End Sub
Сама по себе макрокоманда выглядит скучновато (на самом деле она вдвое длиннее). Но по существу в ней всего три оператора: В цикле осуществляется замена в документе всех элементов, занесённых в символьный массив H$, на пустую строку. Для этого после каждого прохода точка вставки возвращается в начало документа. Все предшествующие циклу присваивания лишь подготавливают данный массив. На этом примере видно, что в языке не хватает средств инициализации массивов.
В версии WinWord 8.0 язык WordBasic заменён на Visual Basic, но на мой взгляд это создает и немало проблем, так как предшествующие версии имеются уже у многих миллионов пользователей и нет явных причин массово переходить на новый язык.
Теперь двинемся дальше.
Бизнес в интернете: Сайты - Софт - Языки - Дизайн
- Киберсантинг
- Киберсантинг как бизнес
- Виды Киберсантинга
- Создание игр
- Дизайн как бизнес
- Dreamweaver
- PHP
- Homesite
- Frontpage
- Studio MX
- Сайтостроительство
- Citrix MetaFrame
- Стили сайта
- ActiveX на сайте
- HTML как основа сайта
- Adobe GoLive
- Что такое WEB
- Мобильные WAP сайты
- 3D графика на сайтах
- 3DS MAX графические решения
- Графика в 3D Studio MAX и на сайте