Табличные манипуляции
Табличные манипуляции
Третья статья в рубрике "Программирование" также посвящена текстовому процессору Word и рассказывает о таблицах. Не секрет, что при подготовке бланков документов часто появляется необходимость в размещении информации в табличном виде. Word 97 и Word 2000 предоставляет мощный табличный редактор, включающий в себя средства для настройки макета таблицы, средства для автоформатирования, средства для рисования таблиц и даже средства, более присущие электронным таблицам и базам данных для сортировки и вычисления по формулам. Казалось бы, все возможности учтены. Однако изредка возникают непредвиденные ситуации, когда стандартных функций Word не хватает. Как обычно, в этом случае выручает Visual Basic for Application.
Таблицы в документе Word
Если посмотреть на текстовый документ с точки зрения программы на Visual Basic for Application, можно заметить одну закономерность — Word автоматически нумерует все объекты, например, слова, предложения, абзацы, таблицы, рисунки. Такой подход в значительной мере упрощает доступ к различным частям документа. Каждая таблица в документе тоже пронумерована, и для доступа к ее содержимому используется объект Tables. Например, представленной далее конструкцией можно выделить пятую таблицу документа.
ActiveDocument.Tables(5).Select
Рис. 1. Форма, позволяющая создать таблицу из четырех столбцов и определить заголовки таблицы
Помимо объекта Tables для манипуляции составными частями таблицы, также существуют объекты Rows, Columns и Cells. Нетрудно догадаться, что объект Rows представляет собой строки таблицы, объект Columns — столбцы, а объект Cells — отдельные ячейки. Заметим, что эти объекты взаимосвязаны между собой. Так, с помощью объекта Columns можно получить ссылку на ячейку с определенным номером, а сославшись на какую-то ячейку с помощью объекта Cells, узнать, в каком столбце и в какой строке она находится. Иерархия объектов, предназначенная для управления таблицами, представлена на схеме:
Tables
Cells
Column
Row
Columns
Cells
Column
Row
Rows
Cells
Column
Row
Схема. Иерархия объектов для управления таблицами
Объект Tables никогда не существует сам по себе. Он, как и объект Cells по отношению к Rows или Columns, входит в состав иерархии объектов более высокого уровня.
Так, например, если вы воспользуетесь объектом ActiveDocument, то можете последовательно просмотреть все таблицы документа, указывая их индекс, а если вы предварительно выделите несколько страниц документа, то конструкцией Selection.Tables(1). Rows.Count сможете узнать количество строк в первой таблице, находящейся внутри выделенной области документа (заметим, что первая таблица внутри выделенного фрагмента текста не всегда означает, что она совпадает с первой таблицей в документе, иными словами, конструкции Selection.Tables(1). Rows.Count и ActiveDocument.Tables(1).Rows.Count могут ссылаться на две разные таблицы).
Создание таблицы
Наиболее простой метод создания новой таблицы предполагает использование соответствующей команды меню или панели инструментов. Однако с помощью Visual Basic for Application можно не только автоматизировать этот процесс, но и придать таблице какой-то особый вид.
Например, воспользовавшись представленной на рисунке формой и несложной программой, можно создать таблицу, состоящую из четырех столбцов, автоматически оформить ее и настроить заголовок таблицы.
Рис. 2. Создание формы в редакторе программ на Visual Basic for Application
Для автоматического создания новой таблицы применяется метод Add, в котором указывается местоположение таблицы, а также количество строк и столбцов. В предложенном макросе подразумевается, что таблица создается в том месте, где находится курсор, но вы можете изменить макрос, указав новое положение (например, всегда создавать таблицу в начале документа).
Private Sub bCancel_Click()
' нажатие на кнопку Отмена закрывает форму
Me.Hide
End Sub
Private Sub bCreate_Click()
' нажатие на кнопку Создать добавляет в текущем документе новую таблицу
Dim Tbl As Table
Set Tbl = ActiveDocument.Tables.Add(Selection.Range, SpinButton1.Value, 4)
Tbl.Cell(1, 1).Range.InsertAfter tColumn1.Text
Tbl.Cell(1, 2).Range.InsertAfter tColumn2.Text
Tbl.Cell(1, 3).Range.InsertAfter tColumn3.Text
Tbl.Cell(1, 4).Range.InsertAfter tColumn4.Text
Me.Hide
End Sub
Private Sub SpinButton1_Change()
' отображает значение счетчика в поле
tRows.Value = SpinButton1.Value
End Sub
Private Sub UserForm_Activate()
' начальные установки формы
tRows.Value = 1
SpinButton1.Value = tRows.Value
End Sub
Возможно, некоторую сложность вызовет создание представленной на рисунке формы. Однако редактирование формы ничуть не сложнее, чем создание рисунка с помощью Автофигур в текстовом документе. Все элементы управления вынесены на отдельную панель.
Для формы потребуется четыре типа элемента: надпись, поле, счетчик и кнопка. Выделив элемент в панели, поместите его в форму, а затем подберите его положение.
Для изменения надписи достаточно щелкнуть левой кнопкой мыши внутри элемента (надписи и кнопки) и, после того как появится курсор, стереть ненужные символы и ввести новый текст.
Для ввода текста программы нужно нажать клавишу F7 и в появившемся окне редактора программ с помощью раскрывающихся списков выбрать соответствующий объект и событие.
Для предложенной формы нужно настроить события OnClick для кнопок и событие OnChange для счетчика. Кроме того, вам следует для поля ввода, расположенного рядом со счетчиком, присвоить свойству Locked значение True. Таким образом, изменить значение этого поля и указать, из скольких строк состоит будущая таблица, вы можете только с помощью счетчика.
Рис. 3. Пример таблицы, отформатированной с помощью макроса
С уже существующими в текстовом документе таблицами средствами Visual Basic for Application можно выполнить такие же функции, что и с помощью команд меню, панелей инструментов. Например, настроить обрамление таблицы, изменить фоновый цвет и так далее.
Вместе с этим можно совершать и нестандартные преобразования.
В следующих примерах вы можете познакомиться с несколькими примерами подобных макросов: макросом для оформления таблицы, макросом для проведения вычислений в таблице и макросом для достаточно сложного преобразования таблицы, при котором таблица поворачивается на 90 градусов и строки становятся столбцами, а столбцы — строками.
Оформление таблицы в Word
Макросы, которые приводятся ниже, выполняют одну единственную задачу: они позволяют оформить текущую таблицу чередующими разноцветными строчками или столбцами, типичными для прайс-листов. Причем, первый макрос форматирует таблицу по строкам, а второй — по столбцам. Алгоритм работы макросов прост. Сперва в нем определяется количество строк или столбцов, а затем в цикле для четных строк или столбцов (то есть номеров, от делении на 2 которых получает нулевой остаток) изменяется фоновый цвет ячеек. Для этого в представленных процедурах используются свойство BackGroundPatternColorIndex и стандартное значение wdGray25, представляющее собой 25% серого цвета.
Если у вас цветной принтер, то вы можете подобрать другой цвет.
Sub TblDesignByRows()
Dim RCnt As Integer
RCnt = Selection.Tables(1).Rows.Count
For i = 1 To RCnt
If i Mod 2 = 0 Then
Selection.Tables(1).Rows(i).Shading.BackgroundPatternColorIndex = wdGray25
End If
Next
End Sub
Sub TblDesignByCols()
Dim CCnt As Integer
CCnt = Selection.Tables(1).Columns.Count
For i = 1 To CCnt
If i Mod 2 = 0 Then
Selection.Tables(1).Columns(i).Shading.BackgroundPatternColorIndex = wdGray25
End If
Next
End Sub
Вычисления без формул
Другой макрос демонстрирует, как суммировать числа в строке или столбце таблицы. В большинстве случае для этого применяется команда Таблица — Формула, в которой задается выражение =SUM(LEFT) или =SUM(ABOVE), но, поскольку, в отличие от Excel, пересчет значений в таблицах Word не происходит автоматически, в подобных формулах особой надобности нет.
Два макроса, представленных ниже, прекрасно заменяют их. Первый макрос служит для суммирования чисел по столбцам, а второй — по строкам. Причем макрос даже имеет одно преимущество — те значения, которые не являются числовыми, автоматически приравниваются к нулю.
В то время как функция SUM требует, чтобы числа располагались в столбце или строке непрерывно, результат, рассчитываемый макросом, автоматически добавляется в последнюю строку или последний столбец таблицы, а вам нужно лишь установить курсор в нужную позицию таблицы — нужный столбец или нужную строку — и запустить соответствующий макрос.
Sub CalcSumByColumn()
Dim RCnt As Integer
RCnt = Selection.Tables(1).Rows.Count
On Error Resume Next
Sum = 0
For i = 1 To RCnt — 1
V = Val(Selection.Columns(1).Cells(i).Range.Text)
Sum = Sum + V
Next
Selection.Columns(1).Cells(RCnt).Range.InsertBefore Format(Sum)
End Sub
Sub CalcSumByRow()
Dim СCnt As Integer
CCnt = Selection.Tables(1).Columns.Count
On Error Resume Next
Sum = 0
For i = 1 To CCnt — 1
V = Val(Selection.Rows(1).Cells(i).Range.Text)
Sum = Sum + V
Next
Selection.Rows(1).Cells(CCnt).Range.InsertBefore Format(Sum)
End Sub
Таблицы-перевертышы
Наиболее сложным макросом для манипуляции таблицами является макрос TblRotate, который позволяет перевернуть таблицу и преобразовать строки таблицы в столбцы, а столбцы — в строки, то есть, по сути, развернуть таблицу на 90 градусов.
Поскольку Word не предоставляет средств, аналогичных тем, что существуют в Excel для транспонирования таблицы, макрос в какой-то степени восполняет этот недостаток.
Алгоритм работы макроса очень простой: в массиве сохраняется содержимое ячеек, таблица удаляется и создается заново при помощи метода Add (см. пример выше), наконец, строки из массива сохраняются в соответствующих ячейках вновь созданной таблицы. Заметим, что предложенный макрос имеет один существенный недостаток — если таблица уже имеет оформление, то оно теряется при преобразовании, поэтому макрос лучше использовать до того, как вы оформили таблицу с помощью доступных в Word средств.
Sub TblRotate()
Dim RCnt As Integer, CCnt As Integer
CCnt = Selection.Tables(1).Columns.Count
RCnt = Selection.Tables(1).Rows.Count
Dim TblBuf()
ReDim TblBuf(RCnt, CCnt)
For i = 1 To RCnt
For j = 1 To CCnt
LL = Len(Selection.Tables(1).
Cell(i, j).Range.Text)
TblBuf(i, j) = Mid(Selection.Tables(1).Cell(i, j).Range.Text, 1, LL — 2)
Next
Next
Selection.Tables(1).Delete
Set Tbl = Selection.Tables.Add(Selection.Range, CCnt, RCnt)
For i = 1 To CCnt
For j = 1 To RCnt
Selection.Tables(1).Cell(i, j).Range.Text = TblBuf(j, i)
Next
Next
End Sub
Использование макросов
Как обычно, возможны два способа применения этих макросов: определить соответствующие кнопки меню или соответствующие команды панели инструментов. Проще всего это сделать, если добавить макросы в основной файл шаблона Normal.dot или создать новый документ, определить в нем макросы, а затем сохранить его в виде нового шаблона.
Сергей Лосев
Компьютерная газета. Статья была опубликована в номере 43 за 1999 год в рубрике программирование :: разное