Доступ к данным документов Word
Доступ к данным документов Word и Excel
При написании макросов, обрабатывающих данные, одной из важнейшей проблем является проблема получения доступа к данным. Это необходимо для переписи их в переменные, использующиеся макросом при обработке информации, и для записи в документ информации, полученной в результате работы макроса. Решение указанной проблемы далеко неочевидно для неподготовленного программиста
При получении доступа к данным документа Word возможны следующие случаи:
· необходимо перейти на строку с конкретным номером и на символ с заданным номером,
· необходимо переместиться на заданное число строк и на заданное число символов от позиции курсора,
· необходимо выделить конкретное число строк или символов, начиная от позиции курсора,
· необходимо выполнить какие-либо операции с выделенными символами или с некоторыми из них.
Эту задачу позволяет решить объект Characters Collection Object, встроенный в объект Range, который в свою очередь встроен в объект Selection, являющийся компонентом первичного объекта Application. Методы доступа к данным перечислены в табл. 7.1, а методы, позволяющие выполнять операцию с данными, приведены в табл. 7.2.
В табл. 7.1 в первой колонке жирным шрифтом выделен неизменяемый текст операторов. В описании языка Visual Basic for Microsoft Word вместо численных параметров стоят имена соответствующих констант:
· параметр What=wdGoToLine – переход на строку,
· параметр Which=wdGoToAbsolute – абсолютный номер строки,
· параметр Unit=wdLine, если имеется в виду строка,
· параметр Unit=wdCharacter, если имеется в виду символ,
· параметр Extend=wdExtend для включения режима выделения символов,
· параметр Extend опускается для простого перемещения курсора.
Заданные численные значения констант определены экспериментально. Изменяемые программистом значения параметров напечатаны обычным шрифтом. В примерах значения изменяемых параметров выделены жирным шрифтом для того, чтобы их можно было легко связать с комментарием.
Переход на заданную строку выполняется методом Selection.GoTo, переход относительно курсора и выделение символов – методами MoveLeft, MoveRight, MoveUp, MoveDown. Для выделения символов указывается параметр Extend=wdExtend.
Выполнение различных действий по редактированию текста возможно в двух вариантах – печать символов в режиме вставки, печать в режиме замены выделенных символов и операции над выделенными символами. Печать символов выполняется методами: Selection.TypeParagrph, Selection.TypeText и Application.Keyboard. Следует иметь в виду, что выделенные символы рассматриваются как некоторый массив символов, к которому применимы ранее рассмотренные методы чтения данных из массива и записи данных из массива.
Таблица 7.1 Методы объекта Selection, обеспечивающие доступ к данным | Пример | Переход на пятую строку Selection.GoTo What:=3, Which:=1, Count:= 5 | Сдвиг курсора вверх на 10 строк Selection.MoveUp Unit:=5, Count:= 10 | Сдвиг курсора ввниз на 15 строк Selection.MoveDown Unit:=5, Count:= 15 | Сдвиг курсора влево на 20 символов Selection.MoveLeft Unit:=1, Count:= 20 | Сдвиг курсора вправо на 30 символов Selection.MoveRight Unit:=1, Count:= 30 | Выделение 40 символов слева от курсора Selection.MoveLeft Unit:=1, Count:=40, Extend:=1 | Выделение 50 символов слева от курсора Selection.MoveRight Unit:=1, Count:=50, Extend:=1 | Выделение 10 строк вверх от курсора Selection.MoveUp Unit:=5, Count:=10, Extend:=1 | Выделение 15 строк вниз от курсора Selection.MoveDown Unit:=5, Count:=15, Extend:=1 |
Действие | Перемещение на заданную строку | Движение от позиции курсора вверх | Движение от позиции курсора вниз | Движение от позиции курсора влево | Движение от позиции курсора вправо | Выделение заданного числа символов слева от курсора | Выделение справа от курсора заданного числа символов | Выделение вверх от курсора заданного числа строк | Выделение вниз от курсора заданного числа строк | |
Метод | Selection.GoTo What:=3, Which:=1, Count:=<номер строки> | Selection.MoveUp Unit:=5, Count:=<сдвиг> | Selection.MoveDown Unit:=5, Count:=<сдвиг> | Selection.MoveLeft Unit:=1, Count:= <сдвиг> | Selection.MoveRight Unit:=1, Count:= <сдвиг> | Selection.MoveLeft Unit:=1, Count:=<число символов>, Extend:=1 | Selection.MoveRight Unit:=1, Count:=<число символов>, Extend:=1 | Selection.MoveUp Unit:=5, Count:=<число символов>, Extend:=1 | Selection.MoveDown Unit:=5, Count:=<число символов>, Extend:=1 |
Таблица 7.2 Методы, обеспечивающие выполнение операций над данными | Пример | Selection.TypeParagraph | Печать слова "рыба" в справа от курсора Selection.TypeText Text:="Рыба" | Пример не предусмотрен | Включение атрибута жирность и установка размера шрифта выделенных символов With Selection.Characters(номер) .Bold = True .Font.Size = 16 End With | Вывод сообщения о числе выделенных символов MsgBox Selection.Characters.Count & " символов выделено" | Замена первого из выделенных символов символом "D" Selection.Characters(1) = "D" |
Действие | Вставка абзаца после курсора | Печать заданного текста | Выбор клавиатуры для ввода текста | Изменение атрибутов шрифта одного из выделенных символов | Подсчет количества выделенных символов | Замена одного из выделенных символов | |
Метод | Selection.TypeParagraph | Selection.TypeText Text:="Текст" | Application.Keyboard (1049) | With Selection.Characters(номер) .имя атрибута = <значение> End With | Selection.Characters.Count | Selection.Characters(номер) = "символ" |
7.2.2. Доступ к данным, помещенным в клетки
электронной таблицы
Доступ к отдельно взятой клетке начинается с выделения клетки командой Range("адрес_клетки").Select. Например, Range("A1").Select.
Следующим шагом при записи данных является применение оператора присваивания значения записываемых данных свойству FormulaR1C1 объекта ActiveCell. Например, по команде ActiveCell.FormulaR1C1 = "123" в активную (выбранную, текущую) клетку записывается число "123".
Если необходимо переписать данные из ячейки в переменную, то следует активизировать клетку командой Range(…), а потом применить оператор присваивания вида имя_переменной = ActiveCell.Value. Например, команда a1 = ActiveCell.Value записывает в переменную а1 данные из текущей клетки.
В случае необходимости обработать блок клеток общий подход сохраняется, но меняются средства достижения цели. На первом шаге командой Range(…) активизируется базовая клетка, относительно которой будут искаться клетки-источники данных и клетки-приемники данных. На втором шаге командой ActiveCell.Offset(rowOffset:=…, columnOffset:=…).Activate активизируется нужная клетка. Параметры rowOffset и columnOffset допускают определение по значениям переменных. Это позволяет строить процессы чтения и записи данных в виде цикла. Далее применяются описанные выше команды ActiveCell.FormulaR1C1 и ActiveCell.Value. На рис. 7.4 показаны фрагменты процедуры, читающие данные из клеток c3, d3, e3, f3, g3 и записывающие их в клетки c5, d5, e5, f5, g5.
Dim i As Integer
Dim b(1 To 10) As Integer
Worksheets("Лист2").Activate 'переход на второй лист
For i = 1 To 5 'чтение данных из клеток в массив
Range("b2").Select
ActiveCell.Offset(rowOffset:=1, columnOffset:=i).Activate
b(i) = ActiveCell.Value
Next i
For i=1 to 5 'запись данных из массива в клетки
Range("b2").Select
ActiveCell.Offset(rowOffset:=3, columnOffset:=i).Activate
ActiveCell.FormulaR1C1 = b(i)
Next i
Рис. 7.4. Чтение данных из блока клеток в массив
и запись данных из массива в блок клеток