Excel. Трюки и эффекты Гладкий Алексей
Dim i As Integer
' Заполнение массива автофигур
Set ashShapes(1) = ActiveSheet.shapes(1)
Set ashShapes(2) = ActiveSheet.shapes(2)
' Заполнение массива скоростей:
' для первой фигуры
alngVertSpeed(1) = 3
alngHorzSpeed(1) = 3
' для второй фигуры
alngVertSpeed(2) = 4
alngHorzSpeed(2) = 4
' Получение границ рабочей ячейки
Set cell = Range(«B2»)
intLeftBorder = cell.Left
intRightBorder = cell.Left + cell.Width
intTopBorder = cell.Top
intBottomBorder = cell.To + cell.Height
' Выполнение вращения и перемещения фигур
Do
' Изменение положения каждой автофигуры
For i = 1 To 2
With ashShapes(i)
' Контроль достижения правой границы ячейки
If .Left + .Width + alngHorzSpeed(i) >
intRightBorder Then
' Корректировка положения
.Left = intRightBorder – .Width
' Изменение направления горизонтальной скорости _
на противоположное
alngHorzSpeed(i) = -alngHorzSpeed(i)
End If
' Контроль достижения левой границы ячейки
If .Left + alngHorzSpeed(i) < intLeftBorder Then
' Корректировка положения
.Left = intLeftBorder
' Изменение направления горизонтальной скорости _
на противоположное
alngHorzSpeed(i) = -alngHorzSpeed(i)
End If
' Контроль достижения нижней границы ячейки
If .Top + .Height + alngVertSpeed(i) >
intBottomBorder Then
' Корректировка положения
.Top = intBottomBorder – .Height
' Изменение направления вертикальной скорости _
на противоположное
alngVertSpeed(i) = -alngVertSpeed(i)
End If
' Контроль достижения верхней границы ячейки
If .Top + alngVertSpeed(i) < intTopBorder Then
' Корректировка положения
.Top = intTopBorder
' Изменение направления вертикальной скорости _
на противоположное
alngVertSpeed(i) = -alngVertSpeed(i)
End If
' Перемещение автофигуры
.Left = .Left + alngHorzSpeed(i)
.Top = .Top + alngVertSpeed(i)
' Вращение автофигуры (изменение направления вращения _
происходит каждый раз при изменении направления _
вертикального перемещения)
.IncrementRotation alngVertSpeed(i)
' Даем Excel команду обработать пользовательский ввод
DoEvents
End With
Next
Loop
End Sub
Теперь в ячейке B2 нужно создать две любые автофигуры (перед этим ячейку В2 следует существенно увеличить, сделав ее размером примерно с четверть экрана, чтобы было место для вращения автофигур).
Примечание
Адрес ячейки можно устанавливать любой, но для этого необходимо внести соответствующие изменения в код макроса.
Теперь, запустив созданный макрос, полюбуйтесь результатом своей работы – автофигуры будут вращаться и одновременно перемещаться в пределах указанной ячейки. При желании можно раскрасить автофигуры в разные цвета и установить какой-нибудь фон для ячейки.
Вызов таблицы цветов
При необходимости можно вывести на экран таблицу цветов и соответствующих значений свойства Colorlndex (данное свойство задает индексированный цвет заливки в соответствии с палитрой цветов). Для этого создадим и запустим следующий макрос (листинг 3.77).
Листинг 3.77. Отображение таблицы цветов
Sub ShowColorTable()
Dim intColor As Integer
' Формирование заголовка таблицы
Range(«A1»).Value = «Цвет»
Range(«B1»).Value = «Значение свойства ColorIndex»
' Вывод таблицы
Range(«A2»).Select
For intColor = 1 To 56
' Окрашиваем ячейку столбца "A" в текущий цвет
With ActiveCell.Interior
.ColorIndex = intColor
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
End With
' В ячейку столбца "B" вносим индекс текущего цвета
ActiveCell.Offset(0, 1).Value = intColor
' Переходим на следующую строку
ActiveCell.Offset(1, 0).Activate
Next
' Покажем ячейку «A1» (начало таблицы)
Range(«A1»).Select
ActiveWindow.ScrollRow = 1
End Sub
В результате выполнения макроса откроется таблица, изображенная на рис. 3.24.
Рис. 3.24. Таблица цветов
В столбце А данной таблицы отображается перечень цветов, а в столбце В – соответствующие им значения свойства Colorlndex. На рисунке показан лишь фрагмент таблицы, поскольку полностью она состоит из 56 строк.
Создание калькулятора
Используя средства языка VBA, можно быстро создать простейший калькулятор, предназначенный для вычисления значений арифметических выражений. Пример макроса, который позволяет это сделать, приведен в листинге 3.78.
Листинг 3.78. Создание калькулятора
Sub SimpleCalculator()
Dim strExpr As String
' Ввод выражения
strExpr = InputBox(«Что будем считать?»)
' Подсчет и вывод результата
MsgBox strExpr & " = " & Application.Evaluate(strExpr)
End Sub
После выполнения данного макроса появится окно, изображенное на рис. 3.25.
Рис. 3.25. Калькулятор
В данном окне с клавиатуры следует ввести выражение, значение которого необходимо вычислить, и нажать кнопку ОК либо клавишу Enter. Результат расчета будет показан в информационном окне (рис. 3.26).
Рис. 3.26. Результат расчета
Если строку макроса strExpr = InputBox («Что будем считать?») написать в виде, например, strExpr = InputBox («Быстрое вычисление»), то окно ввода выражения будет выглядеть, как на рис. 3.27.
Рис. 3.27. Замена текста
Окно результата расчета при этом не изменится (рис. 3.28).
Рис. 3.28. Окно результата расчета
Еще о создании пользовательских меню
Мы уже рассматривали некоторые способы создания пользовательского меню (см. выше раздел «Формирование пользовательского меню»). Предлагаемый же в данном разделе пример является более масштабным, потому что в нем можно увидеть команды созданного меню «в работе» (то есть при выполнении команды на экране отобразится определенный результат).
Сначала рассмотрим создание пользовательского меню, которое полностью состоит из пользовательских команд. После этого реализуем меню, в котором наряду с пользовательскими будут и штатные средства Excel.
Меню с пользовательскими командами
Для реализации данного трюка нам потребуется создать два кода. Один из них будет помещен в модуль ЭтаКнига, а другой – в стандартный модуль. Первый код выглядит следующим образом (листинг 3.79).
Листинг 3.79. Код в модуле ЭтаКнига
Sub Workbook_Open()
' Задание имени меню
strMenuName = «MyCommandBarName»
' Создание меню
CreateCustomMenu
End Sub
Sub Workbook_BeforeClose(Cancel As Boolean)
' Удаление меню перед закрытием книги
DeleteCustomMenu
End Sub
Второй код необходимо набрать в любом стандартном модуле. В нем определяется структура пользовательского меню и порядок его работы. Содержимое данного кода представлено в листинге 3.80.
Листинг 3.80. Код в стандартном модуле
Public strMenuName As String ' Имя строки меню
Private cbrcBar As CommandBarControl
Sub CreateCustomMenu()
Dim cbrMenu As CommandBar
Dim cbrcMenu As CommandBarControl ' Выпадающее меню «Меню»
Dim cbrcSubMenu As CommandBarControl ' Выпадающее меню
«Дополнительно»
' Если уже есть пользовательское меню, то оно удаляется
DeleteCustomMenu
' Создание меню вместо стандартного
Set cbrMenu = Application.CommandBars.Add(strMenuName,
msoBarTop, _
True, True)
' Создание выпадающего меню с названием «Меню»
Set cbrcMenu = cbrMenu.Controls.Add(msoControlPopup, , , ,
True)
With cbrcMenu
.Caption = «&Меню»
End With
' Создание пункта меню
With cbrcMenu.Controls.Add(Type:=msoControlButton, _
Temporary:=True)
.Caption = «&Меню1»
.OnAction = «CallMenu1»
End With
' Создание пункта меню
With cbrcMenu.Controls.Add(Type:=msoControlButton, _
Temporary:=True)
.Caption = «Меню2»
.OnAction = «CallMenu2»
End With
' Создание подменю первого уровня
Set cbrcSubMenu = cbrcMenu.Controls.Add(Type:=msoControlPopup, _
Temporary:=True)
With cbrcSubMenu
.Caption = «Подменю1»
.BeginGroup = True
End With
' Создание пункта меню
With cbrcMenu.Controls.Add(Type:=msoControlButton, _
Temporary:=True)
.Caption = «Вкл/Выкл»
.OnAction = «MenuOnOff»
.Style = msoButtonIconAndCaption
.FaceId = 463
End With
' Создание пункта меню в подменю первого уровня
With cbrcSubMenu.Controls.Add(Type:=msoControlButton, _
Temporary:=True)
.Caption = «Подменю1»
.OnAction = «CallSubMenu1»
.Style = msoButtonIconAndCaption
.FaceId = 2950
.State = msoButtonDown
End With
' Cоздание пункта меню в подменю первого уровня (его состояние _
изменяется посредством пункта «Вкл/Выкл»), для чего сохраним ссылку _
на созданный пункт меню
Set cbrcBar = cbrcSubMenu.Controls.Add(Type:=msoControlButton, _
Temporary:=True)
With cbrcBar
.Caption = «Подменю2»
.OnAction = «CallSubMenu2»
“ Сначала меню деактивировано
.Enabled = False
End With
