Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Информатика

.pdf
Скачиваний:
27
Добавлен:
03.05.2015
Размер:
4 Мб
Скачать
☆

81

 

 

Count = count – 1 : Display

 

'***вывод

End Sub

 

 

Private Sub Display()

'***вывод информации в ячейку А2

Dim cell As Circ, txt As String, i As long

 

 

If cur Is Nothing Then Set cell = first Else Set cell = cur.Nxt

txt = Format(cell.Num)

 

 

For i = 1 To count – 1 : Set cell = cell.Nxt

'переход к следующему в очереди

txt = txt & ", " & Format(cell.Num)

 

Next

 

 

Cells(2, 1) = txt

End Sub .

Щелчок по надписи "Initia" создает простейший круг из двух человек. По надписи "Add" - добавляет в круг еще одного человека со следующим номером. Номера участников "считалки" (подпрограммий Display) выводятся в ячейку А2 (cells(2, 1)) рабочего листа. Размер круга ограничивается форматом Long целых чисел. В диалоговом окне процедуры Initia вводится модуль пересчета k. Щелчок по надписи "Delete" удаляет из круга k-го участника, считая от последнего удаления (или от первого, если удалений еще не было). Схему ссылок в этом примере можно представить наглядно в следующем виде (рис. 19):

Num(1)

 

Num(i)

Num(i+1)

 

Num(n)

∙ Pre

∙∙∙

∙ Pre

∙ Pre

∙∙∙

∙ Pre

Nxt ∙

 

Nxt ∙

Nxt ∙

 

Nxt ∙

Рис. 19

Этот пример досаточно простой для того, чтобы использовать конструирование собственного класса. Частично его можно реализовать в Mcd. Например, если круг участников "считалки" (массив Q) создан, то удалить из него k-го участника можно функцией

Del(Q, k) : = n ← last(Q)

m ← mod(k – 1, n + 1)

for i 0 .. n – 1

k ← mod(m + i + 1, n + 1)

Ri ← Qk

R

Так, например, удалив из круга участников (1, 2, ..., 10) седьмого, функция возвратит значения (8, 9, 10, 1, 2, 3, 4, 5, 6).

Замечательно, что ссылок может быть сколько угодно, поэтому такие конструкции удобны для организации работы с очередями, деревьями, базами данных. Например, при построении дерева ссылок (что может использоваться для организации базы данных, упорядочения

82

вводимой информации в скрытой форме и др.) каждый элемент (ячейка, или узел дерева) должен иметь один “вход” (ссылку) и несколько

выход 1

"выходов" (тоже ссылки): узел . Кроме того, каждый

вход

выход 2

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

Option Explicit

 

Public Bul As Boolean

'*** признак посещения узла

Public Ind As Integer

'*** отношение с предыдущим узлом

Public Num As Long

'*** номер узла по порядку (счетчик)

Public Value As Single

'*** значение (информационное поле)

Public Pre As BTree

'*** cсылка на предыдущий узел

Public Le As Btree

'*** ссылка на первый (левый) выход

Public Ri As BTree

'*** ссылка на второй (правый) выход.

Далее определим метод класса, устанавливающий для элемента класса значение и порядковый номер, очищая остальные поля:

Public Sub Init(a As Single, i As Long)

Num = i : Value = a : Bul = True : Ind = 0

Set Pre = Nothing : Set Le = Nothing

Set Ri = Nothing

End Sub .

Ссылки Pre, Le, Ri являются в определении класса формальными. Они становятся реальными при формировании объекта с помощью оператора New BTree в общем разделе определений (раздел Dim ). Для того, чтобы передвигаться по дереву от корня (первого узла) к какойнибудь вершине, выбирая левую или правую ветвь, можно рабочему объекту (Current) присвоить значение первого узла (пусть его имя First): Set Current = First, а затем переходить на левую (правую)

ветвь: Set Current = Current.Le (или Set Current = Current.Ri) до тех пор, пока не придем в вершину, т. е. когда Current.Le Is Nothing или Current.Ri Is Nothing. Присваивание осуществляется со всеми фактическими связями. Таким образом, если необходимо в нужном месте сделать изменения в построенном дереве, можно использовать рабочую ячейку для необходимой ссылки. Например, если рабочая ячейка оказалась левой ветвью (это можно узнать по ее индексу – свойство Ind), то изменить свойство Bul соответствующего узла дерева можно с помощью двойной ссылки: Current.Pre.Le.Bul = False, так как ссылки здесь уже фактические.

83

1.12.2. Коллекции

Коллекции – это набор объектов, объединенных общим именем, не обязательно одного класса, со следующими общими свойствами и методами:

свойство Count – возвращает общее число объектов в коллекции, свойство Item – возвращает объект из коллекции,

метод Add – добавляет объект в коллекцию, метод Remove – удаляет объект из коллекции.

Для объявления пользовательской коллекции применяется тип данных Collection (с предваряющим служебным словом New, всякий новый объект создается с этим служебным словом). Присваивание значения объекту выполняется после служебного слова Set. Уничтожить (или обнулить) объект можно присваиванием ему значения Nothing. Для организации цикла (пересчета) с элементами коллекции служит конструкция: For Each ... Next (как с массивами типа Variant).

Пример. Пусть нужно создать небольшой занумерованный список фамилий с телефонами. Определим модуль класса DataList со свойствами:

Option Explicit

 

Public Num As Integer

'***порядковый номер в списке

Public Fam As string

'***имя представителя

Public Tel As long

'***номер телефона.

Определим событие (очистка информации)

Public Sub Clr()

Num = 0: Tel = 0: Fam = ""

End Sub

и метод (возвращает информацию об объекте)

Public function Inf() As String

Inf = Format(Num) & ". " & Fam & ", тел. " & Format(Tel)

End Function .

Поместим на рабочем листе две надписи "Добавить" и "Показать" и назначим им макросы с такими же именами. Определим переменные типа

Dim i As Integer

 

'***счетчик в коллекции

Dim NList As DataList

 

'***объект созданного типа

Dim Check As New Collection

'***коллекция объектов типа

и оформим содержание макросов:

 

 

Private Sub Добавить()

'***вводятся элементы коллекции

Set NList = New Datalist

'***создается объект

i = i+1

 

 

With NList

'***ввод данных

.Num = i : Fam = InputBox(“Введите имя”)

.Tel = Val(InputBox(“Введите номер телефона”))

 

84

End With

 

Check.Add NList

'***добавление элемента коллекции

End Sub

 

Private Sub Показать()

'*** “показывает” объект

i = Val(InputBox(“Введите номер элемента в списке”))

Set NList = Check.Item(i)

'***выбор элемента коллекции

MsgBox NList.Inf

'***метод Inf выдает содержимое объекта

End Sub .

 

Теперь при нажатии кнопки “Добавить” появляются окна ввода фамилии и телефона и автоматически присваивается номер в коллекции. При нажатии кнопки “Показать” и вводе номера в коллекции на экране появится информация об указанном объекте.

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

2. Элементы Excel

Кое-что об этом офисном пакете уже было сказано. Приведем некоторый краткий ретроспективный обзор.

Немного истории.

1978 г. – VisiCalc (Dan Briclin, Bob Frankston) для Apple II, 1980 г. – SuperCalc для IBM PC, Lotus 1-2-3, Windows-3, 1985 г. – Multiplan для Makintosh,

1987 г. – Excel с использованием VBA и XLM, 1990-1994 гг. Каждый год – новая версия,

1995 г. – Excel-7 (макросы на VBA) совместимый с Windows-95, 1997 г. – Excel-97 (v/8) – прочно основан на VBA,

2000 г. и дальше Excel – интегрированная часть Office на основе VBA.

Excel, как инструмент, представляет собой средства проведения презентаций, средство ввода данных (с клавиатуры и из файла),

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

Свойства и назначение Excel можно (кратко) свести к пунктам:

1.Файловая структура (листы собраны в рабочую книгу).

2.Использование VBA для управления и макросов.

85

3.Наличие настраиваемых элементов управления.

4.Использование диалоговых окон.

5.Настраиваемые меню и панели инструментов.

6.Наличие функций анализа данных.

7.Создание Data Access объектов, язык запросов.

8.Создание надстроек.

Иерархия объектов: все объекты Excel помимо собственных свойств сохраняют наследственные по иерархии свойства. Иерархию кратко можно представить следующим образом:

1.Приложение Excel – Application.

2.Рабочая книга – Workbooks("...").

3.Рабочий лист – Worksheets("...").

4.Диапазон ячеек – Range("... : ...") или Range(Cells(.,.), Cells(.,.)).

5.Ячейка – Cells(row, col).

6.Лист диаграммы – Chart.

7.Диаграмма.

8.Элементы форм – Shape.

9.VBProject.

10.Элементы управления – CommandBars.

11.Стили – Styles (Borders, Font, Interior).

12.Windows (панели – Panes).

Ссылки на конкретные объекты:

1.На функции рабочего листа: Application.WorksheetFunction.имя функции.

2.В программе список функций VBA: x = Vba. (точка вызовет раскрывающийся список встроенных функций).

3.Ссылка на Range:

а) свойство Range объекта Worksheet, б) свойство Cells объекта Worksheet, в) свойство Offset объекта Range,

например, Range("A1:D10").Cells(5) = 2000, Range("B2").Offset(a, b).

4.Текущие объекты: ActiveCell.Offset(.,.), ThisWorksheet, и т.д.

5.Консольный ввод данных: функция InputBox(запрос, заголовок,

по умолчанию, Xpos, Ypos,...) As String.

6.Вывод в диалоговое окно: MsgBox "текст", ... Можно выводить много строк с помощью vbCrLf или vbNewLine (имитация возврата каретки).

7.Функция MsgBox(запрос, кнопки, заголовок,...) позволяет реагировать на кнопки в условных операторах.

8.Одинаковые объекты автоматически формируют коллекцию.

9.Воспринимаются файлы с расширениями .xls, .wk4 (Lotus), .wq1,

.wq2, .wb1, .wb2 (Quattro Pro), .dbf (базы данных).

86

Excel допускает вставки:

1.Лист, строка (таблицы), столбец, ячейка, символ, диаграмма.

2.Функции рабочего листа (не VBA).

3.Имя диапазона или ячейки.

4.Рисунок (из файла, автофигуры, WordArt, и др.), схематическая диаграмма.

5.Структура (часть листа может быть скрыта по желанию).

6.Объекты:

а) графические объекты (Bitmap, Photoshop, и др.), б) Mcd-документ со всеми свойствами,

в) Microsoft Equation3 (вставка формул),

г) редактор VBA (со всеми формами и элементами управления), д) документ MS Word (и все его свойства),

е) презентация MS Power Point и отдельные слайды,

ж) Windows Media Player,

з) календарь, и др.

Доступны надстройки, расширяющие возможности Excel:

1.Функции VBA для обработки данных (Analysis Tool Pack – VBA).

2.Мастер подстановок (формулы для поиска в списках).

3.Мастер суммирования (суммирование выбранных данных).

4.Пакет анализа (функции и интерфейс для обработки научных и финансовых данных).

5.Пересчет в евро.

6.Поиск решения (инструмент для решения уравнений, систем, задач оптимизации).

7.Помощник по Интернету.

2.1. РАБОЧИЙ ЛИСТ

Рабочий лист представляет собой основную расчетную платформу рабочей книги. Настраиваемое меню позволяет получить вид листа, удобный пользователю. Щелчок правой кнопкой мыши по ярлычку листа вызывает меню (рис. 20), в соответствии с которым можно дать имя листу, удалить его, изменить цвет ярлычка, перейти в поле

кода этого листа редактора VBA. В этом поле можно можно записать макрос

Sub WorkSheet_Activate()

... Рис. 20

End Sub,

87

в котором заранее определяются какие-то установки рабочего листа. Например, пользователю хотелось бы, чтобы прямоугольная область A1:Q32 была синего цвета с красными линиями сетки. Для этого в макрос WorkSheet_Activate() достаточно вставить код:

With Range("A1:Q32")

.Interior.Color = vbBlue

.Cells.Borders.Color = vbRed

End With

(аналогичный макрос с шапкой Sub Workbook_Open позволяет выполнить необходимые действия и настройки при открытии Excel-про- екта, событие BeforeClose подготавливает проект к закрытию, и т.д.).

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

 

 

шрифт

текст

ячеек

выравнивать

надпись ), причем, если текст не помещается

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

В разделе меню "Данные" (подраздел "группировка и струтура") выбор пункта "Группировать" позволяет по желанию скрывать или открывать выделенную область строк или столбцов, демонстрируя суть или подробности рабочего листа.

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

Excel (рис. 21, 22).

Рис. 21

88

Рис. 22

Здесь использована группировка (скрытие) столбцов A-J (кнопочка "+" на рис. 21, нажатие ее открывает скрытые столбцы с рисунком и текстом объявления – рис. 22).

2.2.ЯЧЕЙКИ

Виерархии объектов ячейка Cells() рабочего листа является подобъектом объекта WorkSheet и свойством объекта Range того же рабочего листа. Стандартно ячейка представляет собой, как правило, двухиндексный объект Cells(m, n), где m - номер строки листа, n – номер столбца, имеет много свойств и методов. Допускается также нумерация по номерам строк и столбцов (стиль R1C1). Часто используемые свойства (наследство объекта Range): Value (значение), Name (имя), Interior (внутренность) и др. Из методов выделим Activate, Select - выбор конкретной ячейки. К выбранной ячейке можно уже обращаться как к объекту ActiveCell или просто Selection, который обладает свойствами иметь размер (высоту, ширину), имя, цвет, шрифт, стиль заполнения и т. д. С некоторыми свойствами объектов можно познакомиться, выбрав в меню редактора список объектов и их свойств (Object Brouser, рис. 23).

Группа ячеек в Excel обычно описывается как объект Range( ), - в скобках указывается диапазон. Например, Range("A3:C17") - прямоугольная группа ячеек от А3 (в левом верхнем углу)

до С17 (в правом нижнем углу), либо по индек-

Рис. 23

89

сам: Range(Cells(3, 1), Cells(17, 3)). Объект Range может содержать всего одну ячейку (в этом случае он отождествляется с Cells). Если свойства ячейки не меняются (используются по умолчанию), ссылка на "родителя" Range не обзательна.

Кроме свойств, присущих Cells, объект Range имеет свойства Count (количество ячеек в объекте), Value (может принимать массив), Borders (фиксирует границу области), Font (шрифт), ColumnWidth (ширина столбца) и др. Из методов следует отметить Merge (объединение в одну ячейку по названию левой верхней), Unmerge (разъединение в первоначальное состояние), ClearContents (очистка), Calculate (пересчет содержимого при изменении данных).

Пример 1. Пусть необходимо выделить ячейки с С3 по F20, объединить их, окаймляя границей, изменить в них цвет, шрифт и т. д. Можно воспользоваться кодом:

Dim x As Variant, ARB As Variant

'***массив vb-констант

Dim RCells As Range

'***выбор объекта

ARB = Array(xlEdgeLeft, xlEdgeRight, xlEdgeTop, xlEdgeBottom) 'константы

Set RCells= Range("C3 : F20")

 

With RCells

 

.Select: .Merge: .Name = "Оплата"

 

With .Font:

'***Выбор свойств шрифта

.Name = "Arial": .Size = 14

 

.Shadow = True: .Underline = xlSingle

.Color = RGB(a, b, c) '***смесь цветов красного, зеленого, синего

End With

 

For Each x In ARB

 

With .Borders(x):

'***Выбор границы окаймления

.LineStyle = xlContinuous

 

.Weight = xlThick

 

.ColorIndex = 17

 

End With

 

Next

 

End With

 

(здесь RGB(a, b, c) - функция выбора цвета, a, b, c - целые числа от 0 до 255, соответственно доля красного, зеленого, синего цветов в смеси).

Пример 2. Пусть массив ячеек от А1 до Н20 заполнен числами (например, случайными). Нужно выбрать те ячейки, значения в которых больше значений своих ближайших соседей (см. пример из п.

1.7.1), выделить эти ячейки цветом и шрифтом.

Sub Hills()

Dim m As byte, n As Byte, x As Integer, y As Integer, Check As Boolean Dim A as variant, i As Byte, j As Byte, k As Byte, ii As Integer, jj As Integer

Randomize Timer

'*** массив изменений координат ячейки:

A = Array(-1,-1, -1, 0, -1, 1, 0, 1, 1, 1, 1, 0, 1, -1, 0, -1)

90

 

 

m = 20 : n = 8

 

 

For i = 1 To m: For j = 1 To n

 

 

Cells(i, j) = Int(100*Rnd - 50)

 

 

Next: Next

'***засеивание случайными числами

For i = 1 To m: For j = 1 To n

 

 

x = Cells(i, j).Value : Check = True

 

For k = 0 To 14 Step 2

 

 

ii = i + A(k) : jj = j + A(k + 1)

'***cравнение с 8 соседями

If ii > 0 And ii <= m And jj > 0 And jj <= n Then y = Cells(ii, jj). Value

If y >= x Then

Check = False: Exit For End If

End If

Next

If Check Then

Cells(i, j). Select With Selection

.Font.Size = 14 : .Font.Bold = True 'Изменение шрифта

.Interior.ColorIndex = 3: '***Красный цвет End With

End If Next : Next

End Sub .

Ячейка является одновременно окном ввода-вывода. В нее стандартно вводится форматированный текст, числа, даты, формулы. Поскольку Excel является зарубежным продуктом, возникает проблема выбора разделителя целой и дробной части числа (в России для этой цели используется запятая, в остальных странах – точка), которая легко решается в меню настройки. Поэтому, если возникают проблемы с вводом дробных чисел, следут проверить настройки и формат ячеек. В некоторых случаях при выводе чисел в ячейку последняя заполняется символами "#". Это означает недостаток места для данного формата, достаточно раздвинуть границы соответствующего столбца.

Ячейка является местом выполнения вычислений. В любую ячейку можно ввести произвольную (допустимую) формулу обработки других ячеек, части данного (активного) или другого листа. Формула вводится либо с помощью предваряющего символа "=", либо с помощью меню "f(x)" (вставка функций). Ссылки на другие ячейки, участвующие в вычислениях, реализуются либо выделением их курсором мыши, либо непосредственным указанием этих ячеек в координатной сетке рабочего листа. Ссылки могут быть абсолютными и относительными. Например, если в ячейке "А2" (ее адрес (2, 1) – вторая строка и первый столбец) имеется ссылка на "F8" (ее адрес (8, 6)), то такая ссылка считается относительной, поскольку при перемещении содержимого А2 (выделив и потащив мышью за границу области), например, в С9, ссылка изменится с F8 на H15 – перемещение ячейки перемещает и ее ссылки. Однако, если необходимо при перемещении со-