Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
объектная модель Excel.doc
Скачиваний:
3
Добавлен:
01.03.2025
Размер:
1 Мб
Скачать
☆

Ввод в диапазон неповторяющихся значений

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

Р ис. 5.10. Ввод в диапазон неповторяющихся значений

Итак:

  1. Введите в ячейку А1 значение Фамилия.

  2. Введите в ячейку В1 значение Новый сотрудник.

  3. В диапазон ячеек, начиная с ячейки А2, вниз вдоль столбца А будут вводиться фамилии отобранных сотрудников.

  4. В ячейку С1 будет вводиться имя очередного сотрудника.

  5. На рабочем листе расположите кнопку. При помощи окна Properties установите у нее значения свойств Name и Text равными cmdEnter и Ввод.

  6. В модуле рабочего листа наберите код из листинга 5.59. Поиск подходящего значения производится методом Match объекта Application.

Private Sub cmdEnter_Click()

Application.DisplayAlerts = False

If IsError(Application.Match(Range("C1"), _

Range(Range("A2"), Range("A2").End(xlDown)), 0)) Then

If Range("A1").CurrentRegion.Rows.Count > 1 Then

With Range("A1").End(xlDown).Offset(1, 0)

.Value = Range("C1").Value

.Sort Keyl:=Range("A2"), Orderl:=xlAscending, Header:=xlYes

End With

Else

Range("A2").Value = Range("C1").Value

End If

Else

MsgBox ("Уже существует")

End If

End Sub

Озвучивание текста

Объект Speech инкапсулирует в себе средства по озвучиванию текста, содержащегося в ячейках рабочего листа. Метод Speak реализует непосредственно произношение, свойство Direction задает порядок прочитывания текста (допустимые значения: xlSpeakByColumns и xlSpeakByRows), а свойство SpeakCellOnEnter устанавливает или отменяет режим чтения текста после его ввода в ячейку. В следующем коде (листинг 5.60) процедура Speaker читает текст из ячеек указанного диапазона, а процедура SpeakerString читает указанную строку текста.

Sub TestSpeaker()

Range("C2").Value = "Hello, everybody!"

Range("D2").Value = "How are you?"

Speaker Range("C2:D2"), xlSpeakByRows

SpeakerString "Not too bad"

End Sub

Sub Speaker(r As Range, direction As Integer)

Application.Speech.direction = direction

r.Speak

End Sub

Sub SpeakerString(s As String)

Application.Speech.Speak s

End Sub

Построение графа

По табличным данным на рабочем листе не трудно построить весовой граф. Продемонстрируем это на примере. В нашем примере у графа будут четыре вершины v1, v2, v3 и v4, но их количество для приводимой ниже программы не существенно. В диапазон ячеек В2:Е5 введите веса для ребер, соединяющих специфицированные вершины (рис. 5.1!), а в диапазон F2:G5— координаты вершин. В стандартном модуле наберите код из листинга 5.61. Вот и все. Вершины, ребра и подписи с весами ребер графа — все это объекты Shape, только разногого типа: вершины — это овалы, ребра — это соединители, а подписи — это надписи.

Листинг 5.61. Построение графа

Option Explicit

Option Base 1

Sub TreeBuilder()

Const N As Integer = 4

Dim i As Integer, j As Integer

Dim V(N) As Shape, Sh As Shape

Dim Dist(N, N) As Integer, X(N) As Integer, Y(N) As Integer

For i = 1 To N

X(i) = ActiveSheet.Cells(i + 1, N + 2)

Y(i) = ActiveSheet.Cells(i + 1, N + 3)

Next

For i = 1 To N

For j = 1 To N

Dist(i, j) = ActiveSheet.Cells(i + 1, j + 1)

Next j

Next

For i = 1 To N

Set V(i) = ActiveSheet.Shapes.AddShape(msoShapeOval, _

X(i), t-(ij + 60, 16, 16)

V(i).TextFrame.Characters.Text = CStr(i)

V(i).TextFrame.Characters.Font.Size – 10

V(i).TextFrame.Characters.Font.Bold = True

Next

For i = 1 To N – 1

For j = i + 1 To N

If Dist(i, j) <> 0 Then

Set Sh = ActiveSheet.Shapes.AddConnector( _

msoConnectorStraight, 0, 0, 0, 0)

With Sh.ConnectorFormat

.BeginConnect ConnectedShape:=V(i), ConnectionSite:=l .EndConnect ConnectedShape:=V(j), ConnectionSite:=1

End With

Sh.RerouteConnections

If X(i) = X(j) Then

Set Sh = ActiveSheet.Shapes.AddLabel( _

msoTextOrientationHorizontal, _

(X(i) + X(j)) /2-5, (Y(i) + Y(j)) / 2 + 60, 60, 150)

Else

Set Sh = ActiveSheet.Shapes.AddLabel( _

msoTextOrientationHorizontal, _

(X(i) + X(j)) / 2, (Y(i) + Y(j)) / 2 + 50, 60, 150)

End If

Sh.TextFrame.Characters.Text = CStr(Dist(i, j))

Sh.TextFrame.Characters.Font.Size = 10

End If

Next

Next

End Sub

Р ис. 5.11. Построение графа