Worksheets(«Datа»).Cells(intRow, 2). _
Value = intLastRow
Worksheets(«Data»).Cells(intRow, 3). _
Value = intLastRow + 1
Else
' Бывшее ранее животное – правильный ответ
Worksheets(«Data»).Cells(intRow, 2). _
Value = intLastRow + 1
Worksheets(«Data»).Cells(intRow, 3). _
Value = intLastRow
End If
' Сохраним номер строки для добавления записей
Worksheets(«Data»).Range(«D1»).Value = _
intLastRow + 2
End If
End If
' Игра завершена. Таблица дополнена
MsgBox «Спасибо за игру!», vbOKOnly, «Игра завершена»
Exit Do
End If
End If
Loop
End Sub
После этого на листе MAIN создадим кнопку Старт и назначим ей макрос S tar tGame. После нажатия данной кнопки на экране отобразится окно, изображенное на рис. 5.9.
Рис. 5.9. Начало игры
После нажатия в данном окне кнопки ОК программа начнет задавать вопросы, с помощью которых попытается узнать, какое животное загадано. Если отгадать не удастся, то программа выдаст окно с соответствующим запросом, в котором с клавиатуры можно ввести название загаданного животного, а затем – вопрос, ответом на который является введенное значение. Введенные данные сохранятся в таблице и будут использоваться в дальнейшем.
Работа данной программы и, главное, ее «обучение» основаны на особенном строении данных, используемых этой программой. Они организованы в виде бинарного дерева. Каждый элемент этого дерева, являющийся вопросом, – узел, а элемент, являющийся названием животного, – лист. Каждый узел содержит два элемента (пусть левый и правый). При отрицательном ответе на вопрос рассматривается левый элемент, при утвердительном – правый. Если рассматриваемый элемент является узлом, то опять задается вопрос и анализируется ответ. Если же элемент – лист, то мы дошли до конца цепочки возможных вопросов и ответов, остается только спросить, является ли содержимое листа правильным ответом. В случае правильного ответа работа программы завершается. Если же ответ неправильный, то пользователь вводит вопрос, позволяющий отличить загаданное им животное от того, которое предположила программа. Название животного заменяется вопросом (на место листа дерева вставляется узел). Слева помещается название прежнего животного (лист), а справа – загаданного пользователем (тоже лист дерева). Так пополняются знания приведенной программы.
Так как для хранения данных у нас используется таблица, то элементы дерева хранятся в следующем виде. Значение элемента дерева (текст вопроса или название животного) содержится в столбце А. Для узла (то есть вопроса) в столбце В содержится номер строки, на которую следует перейти при утвердительном ответе, а в столбце С – номер строки, на которую необходимо перейти при отрицательном ответе на вопрос. Для листа (названия животного) столбцы В и С пусты.
Кроме того, в ячейке D1 хранится номер первой строки, которая может быть использована для вставки новых данных. Заодно этот номер применяется для предотвращения ошибок программы (зацикливания и прочих неприятностей) при повреждении данных.
Расчет на основании ячеек определенного цвета
В этом разделе мы отвлечемся от создания развлекательных программ игр и рассмотрим более практичный трюк. С его помощью можно разработать программу, которая будет выполнять необходимые расчеты с теми исходными данными, которые хранятся только в ячейках определенного цвета (или написаны шрифтом определенного цвета). Иначе говоря, в качестве критерия для включения в расчет тех или иных данных будет приниматься либо цвет заливки соответствующей ячейки, либо цвет шрифта. Достоинством данной программы является то, что она проста и удобна в использовании.
Знакомиться с программой будем в два этапа: на первом этапе напишем код программы и создадим пользовательские формы, на втором – рассмотрим порядок ее применения.
Создание программы
Итак, для создания программы нужно в модуле VBA написать код, который выполняет все расчеты, и создать форму, которая позволит сделать использование функции расчета более наглядным.
Программный код в стандартном модуле VBA выглядит следующим образом (листинг 5.5).
Const dhcSum As Integer = 0
Const dhcAvg As Integer = 1
Const dhcMax As Integer = 2
Const dhcMin As Integer = 3
Const dhcCount As Integer = 4
Const dhcSumPlus As Integer = 5
Const dhcSumMinus As Integer = 6
Const dhcCountFull As Integer = 7
Const dhcCountNotNull As Integer = 8
Const dhcCountPlus As Integer = 9
Const dhcCountMinus As Integer = 10
Sub CalcColors()
' Отображение формы
Load frmColorCalc
frmColorCalc.Show
End Sub
Public Function ColorCalc(strRange As String, _
lngColor As Long, fBackBolor As Boolean, _
intMode As Integer, Optional fAbsence As Boolean) As Double
' Операции над ячейками с установленным цветом шрифта _
или заливки
Dim rgData As Range ' Диапазон ячеек для расчетов
Dim i As Integer
Dim Values() As Variant ' Массив со значениями для расчета
Dim intCount As Integer ' Количество значений в массиве
Dim cell As Range
Dim varOut As Variant ' В этой переменной хранятся _
результаты промежуточных подсчетов _ и окончательный результат
Set rgData = Range(strRange)
ReDim Values(1 To rgData.Count)
' Просматриваются все ячейки входного диапазона. Значения
тех из них, _
цвет которых удовлетворяет условию, записываются в массив
Values
For Each cell In rgData.Cells
' Если нужно суммировать по заливке:
If fBackBolor = True Then
' Включение ячейки в сумму в зависимости от цвета _
заливки и фильтра
If fAbsence Then
' Если ячейка имеет заданный цвет, то она не включается _
в вычисления
If cell.Interior.Color <> lngColor Then
intCount = intCount + 1
Values(intCount) = cell.Value
End If
Else
' Если ячейка имеет заданный цвет, то она включается _
в вычисления
If cell.Interior.Color = lngColor Then
intCount = intCount + 1
Values(intCount) = cell.Value
End If
End If
' В противном случае – суммируется по шрифту
Else
' Включение ячейки в сумму в зависимости _
от ее цвета и фильтра
If fAbsence Then
' Если ячейка имеет заданный цвет, то она не включается _
в вычисления
If cell.Font.Color <> lngColor Then
intCount = intCount + 1
Values(intCount) = cell.Value
End If
Else
' Если ячейка имеет заданный цвет, то она включается _
в вычисления
If cell.Font.Color = lngColor Then
intCount = intCount + 1
Values(intCount) = cell.Value
End If
End If
End If
Next cell
' Выполнение над собранными значениями операции, заданной
в intMode
For i = 1 To intCount
Select Case intMode
Case dhcSum, dhcAvg
' Подсчет суммы значений
varOut = varOut + Values(i)
Case dhcSumPlus
' Подсчет суммы положительных значений
If Values(i) > 0 Then varOut = varOut + Values(i)
Case dhcSumMinus
' Посчет суммы отрицательных значений
If Values(i) < 0 Then varOut = varOut + Values(i)
Case dhcMax
' Нахождение максимального значения
If Values(i) > varOut Then varOut = Values(i)
Case dhcMin
' Нахождение минимального значения
If i = LBound(Values) Then varOut = Values(i)
If Values(i) < varOut Then varOut = Values(i)
Case dhcCount
' Подсчет количества значений
varOut = varOut + 1
Case dhcCountFull
' Подсчет количества заполненных ячеек
If Not IsEmpty(Values(i)) Then varOut = varOut + 1
Case dhcCountNotNull
' Подсчет количества пустых ячеек
If Not IsEmpty(Values(i)) And Values(i) <> 0 Then _
varOut = varOut + 1
Case dhcCountPlus
' Подсчет количества положительных значений
If Values(i) > 0 Then varOut = varOut + 1
Case dhcCountMinus
' Подсчет количества отрицательных значений
If Values(i) < 0 Then varOut = varOut + 1
End Select
Next i
' Окончательные операции для некоторых видов расчета
If intMode = dhcAvg Then
' Вычисление среднего значения
ColorCalc = varOut / intCount
Else
ColorCalc = varOut
End If
End Function
В приведенном выше коде реализованы следующие элементы:
• функция ColorCalc – выполняет все расчеты с использованием цвета (параметры этой функции и ее аргументы рассматриваются в следующем разделе);
• макрос CalcColors – отображает форму управления расчетом (см. ниже).
В проект VBA необходимо также добавить форму и поместить в ее модуль код, приведенный в листинге 5.6.
Dim lngCurColor As Long ' Выбранный цвет, по которому _
идентифицировать (отбирать) ячейки
Dim intMode As Integer ' Номер типа вычисления в списке
Sub cmbApplyColor_Click()
If cboOtherColor.Value >= 0 Then
' Вычисление с использованием выбранного в списке цвета
lngCurColor = cboOtherColor.Value
SetColorSum
End If
End Sub
Sub cmbColor1_Click()
' Вычисление с использованием цвета нажатой кнопки
lngCurColor = cmbColor1.BackColor
SetColorSum
End Sub
Sub cmbColor2_Click()
' Вычисление с использованием цвета нажатой кнопки
lngCurColor = cmbColor2.BackColor
SetColorSum
End Sub
Sub cmbColor3_Click()
' Вычисление с использованием цвета нажатой кнопки
lngCurColor = cmbColor3.BackColor
SetColorSum
End Sub
Sub cmbColor4_Click()
' Вычисление с использованием цвета нажатой кнопки
lngCurColor = cmbColor4.BackColor
SetColorSum
End Sub
Sub cmbColor5_Click()
' Вычисление с использованием цвета нажатой кнопки
lngCurColor = cmbColor5.BackColor
SetColorSum
End Sub
Sub cmbColor6_Click()
' Вычисление с использованием цвета нажатой кнопки
lngCurColor = cmbColor6.BackColor
SetColorSum
End Sub
Sub cmbColor7_Click()
' Вычисление с использованием цвета нажатой кнопки
lngCurColor = cmbColor7.BackColor
SetColorSum
End Sub
Sub cmbColor8_Click()
' Вычисление с использованием цвета нажатой кнопки
lngCurColor = cmbColor8.BackColor
SetColorSum
End Sub
Sub cmbColor9_Click()
' Вычисление с использованием цвета нажатой кнопки
lngCurColor = cmbColor9.BackColor
SetColorSum
End Sub
Sub cmbColor10_Click()
' Вычисление с использованием цвета нажатой кнопки
lngCurColor = cmbColor10.BackColor
SetColorSum
End Sub
Sub cmbColor11_Click()
' Вычисление с использованием цвета нажатой кнопки
lngCurColor = cmbColor11.BackColor
SetColorSum
End Sub
Sub cmbColor12_Click()
' Вычисление с использованием цвета нажатой кнопки
lngCurColor = cmbColor12.BackColor
SetColorSum
End Sub
Sub SetColorSum()
' Вычисление с использованием заданного цвета
Dim strFormula As String
' Проверка правильности введенных диапазонов и номеров ячеек
If txtResCell.Value = "" Then
MsgBox «Введите адрес ячейки вставки функции», _
vbCritical, «Внимание!»
txtResCell.SetFocus
Exit Sub
ElseIf txtRange.Value = "" Then
MsgBox «Введите адрес диапазона суммирования», _
vbCritical, «Внимание!»
txtRange.SetFocus
Exit Sub
End If
' Формирование формулы
strFormula = "=ColorCalc(" & """"& txtRange.Value & """" _
& "," & lngCurColor & "," & CInt(tglType.Value) & "," _
& intMode & "," & CInt(chkVarify.Value) & ")"
' Запись формулы в ячейку
Range(txtResCell.Value).Formula = strFormula
End Sub
Sub cmbExit_Click()
' Закрытие формы
Unload Me
End Sub
Sub cboCalcTypes_AfterUpdate()
' Изменение режима вычисления – сохраним в переменной _
номер вычисления
intMode = cboCalcTypes.ListIndex
End Sub
Sub cboOtherColor_Change()
' Изменение выделенного цвета в списке «Другой»
If cboOtherColor.Text <> "" Then
' Сохранение выбранного цвета в переменной
lngCurColor = Val(cboOtherColor.Value)
End If
End Sub
Sub tglType_Click()
' Изменение типа идентификации ячеек
If tglType.Value = -1 Then
' Идентификация по цвету заливки
tglType.Caption = «Заливка»
Else
' Идентификация по цвету шрифта
tglType.Caption = «Шрифт»
End If
GetColors
End Sub
Sub txtRange_AfterUpdate()
' Изменение диапазона с исходными данными – покажем _
кнопки с цветами, представленными в новом диапазоне
GetColors
End Sub
Sub txtRange_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
' Проверка корректности данных, введенных в поле _
диапазона исходных данных
Dim rgData As Range
Dim cell As Range
' Проверка, введен ли диапазон данных
If txtRange.Text = "" Then
MsgBox «Введите адрес диапазона суммирования!», _
vbCritical, «Ошибка выполнения»
Cancel = True
End If
If txtResCell.Text = "" Then Exit Sub
On Error GoTo Err1
' Проверка отсутствия циклических ссылок (чтобы одна _
из входных ячеек не была одновременно и выходной)
Set rgData = Range(txtRange.Text)
For Each cell In rgData.Cells
If cell.Address(False, False) = _
Range(txtResCell.Text).Address(False, False) Then
' Нашли циклическую ссылку
MsgBox "Введите другой адрес во избежание " & _
«появления циклических ссылок», vbCritical, _
«Внимание!»
Cancel = True
Exit Sub
End If
Next cell
Exit Sub
Err1:
'Обработка ошибок при работе с ячейками
If Err.Number = 1004 Then
MsgBox «Введите корректный адрес ячейки», vbCritical, _
«Ошибка ввода»
Cancel = True
Exit Sub
Else
MsgBox Err.Description, vbCritical, «Ошибка ввода»
Cancel = True
Exit Sub
End If
End Sub
Sub txtResCell_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
' Проверка корректности данных, введенных в поле _
адреса выходной ячейки
Dim rgData As Range
Dim cell As Range
' Проверка, введен ли диапазон данных
If txtRange.Text = "" Then
MsgBox «Введите адрес диапазона суммирования!», _
vbCritical, «Ошибка выполнения»
Cancel = True
End If
If txtResCell.Text = "" Then Exit Sub
On Error GoTo Err1
' Проверка отсутствия циклических ссылок (чтобы одна _
из входных ячеек не была одновременно и выходной)
Set rgData = Range(txtRange.Text)
For Each cell In rgData.Cells
If cell.Address(False, False) = _
Range(txtResCell.Text).Address(False, False) Then
' Нашли циклическую ссылку
MsgBox "Введите другой адрес во избежание " & _
«появления циклических ссылок», vbCritical, _
«Внимание!»
Cancel = True
Exit Sub
End If
Next cell
Exit Sub
Err1:
'Обработка ошибок при работе с ячейками
If Err.Number = 1004 Then
MsgBox «Введите корректный адрес ячейки», vbCritical, _
«Ошибка ввода»
Cancel = True
Exit Sub
Else
MsgBox Err.Description, vbCritical, «Ошибка ввода»
Cancel = True
Exit Sub
End If
End Sub
Sub UserForm_Activate()
' Инициализация формы при активации
Dim intFunc As Integer
Dim strFunc As String
' Заполение списка доступных операций
cboCalcTypes.AddItem "0"
cboCalcTypes.List(0, 1) = «Сумма»
cboCalcTypes.AddItem "1"
cboCalcTypes.List(1, 1) = «Среднее»
cboCalcTypes.AddItem "2"
cboCalcTypes.List(2, 1) = «Максимум»
cboCalcTypes.AddItem "3"
cboCalcTypes.List(3, 1) = «Минимум»
cboCalcTypes.AddItem "4"
cboCalcTypes.List(4, 1) = «Количество ячеек»
cboCalcTypes.AddItem "5"
cboCalcTypes.List(5, 1) = «Сумма положительных»
cboCalcTypes.AddItem "6"
cboCalcTypes.List(6, 1) = «Сумма отрицательных»
cboCalcTypes.AddItem "7"
cboCalcTypes.List(7, 1) = «Количество непустых»
cboCalcTypes.AddItem "8"
cboCalcTypes.List(8, 1) = «Количество непустых ненулевых»
cboCalcTypes.AddItem "9"
cboCalcTypes.List(9, 1) = «Количество положительных»
cboCalcTypes.AddItem «10»
cboCalcTypes.List(10, 1) = «Количество отрицательных»
' Заполнение списка дополнительных цветов
cboOtherColor.AddItem «255»
cboOtherColor.List(0, 1) = «Красный»
cboOtherColor.AddItem «52479»
cboOtherColor.List(1, 1) = «Оранжевый»
cboOtherColor.AddItem «65535»
cboOtherColor.List(2, 1) = «Желтый»
cboOtherColor.AddItem «32768»
cboOtherColor.List(3, 1) = «Зеленый»
cboOtherColor.AddItem «16776960»
cboOtherColor.List(4, 1) = «Голубой»
cboOtherColor.AddItem «16711680»
cboOtherColor.List(5, 1) = «Синий»
cboOtherColor.AddItem «16711935»
cboOtherColor.List(6, 1) = «Фиолетовый»
cboOtherColor.AddItem «16777215»
cboOtherColor.List(7, 1) = «Белый»
cboOtherColor.AddItem "0"
cboOtherColor.List(8, 1) = «Черный»
If Selection.Cells.Count = 1 Then
' На листе есть выделенная ячейка. Определим, есть ли
в этой _
ячейке формула с функцией ColorCalc
intFunc = InStr(Selection.Formula, "ColorCalc(")
If intFunc > 0 Then
' Формула есть, заполним поля формы для вычислений
' Адрес ячейки с результатом
txtResCell.Text = Selection.Address(False, False)
' Выделяем аргументы функции...
' Номера ячеек с исходными данными
strFunc = Mid(Selection.Formula, intFunc + 11)
intFunc = InStr(strFunc, "" "")
txtRange.Text = Left(strFunc, intFunc – 1)
' Тип идентификации ячеек (по шрифту или цвету)
strFunc = Mid(strFunc, intFunc + 2)
intFunc = InStr(strFunc, ",")
strFunc = Mid(strFunc, intFunc + 1)
intFunc = InStr(strFunc, ",")
tglType.Value = Left(strFunc, intFunc – 1)
' Режим вычислений
strFunc = Mid(strFunc, intFunc + 1)
strFunc = Left(strFunc, Len(strFunc) – 1)
intFunc = InStr(strFunc, ",")
cboCalcTypes.Text = cboCalcTypes.List(Val(Left$( _
strFunc, intFunc – 1)), 1)
strFunc = Mid(strFunc, intFunc + 1)
chkVarify.SetFocus
chkVarify.Value = CBool(strFunc)
lblChoose.Visible = True
GetColors
Else
' Будем применять формулу для выделенной ячейки
txtRange.Value = Selection.Address(False, False)
' В выделенной ячейке конкретная функция не задана. _
Выберем первую функцию в списке
cboCalcTypes.Text = «Сумма»
End If
Else
' Будем применять формулу для выделенной ячейки
txtRange.Value = Selection.Address(False, False)
' В выделенной ячейке конкретная функция не задана. _
Выберем первую функцию в списке
cboCalcTypes.Text = «Сумма»
End If
End Sub
Sub GetColors()
' Отображение кнопок выбора цвета окрашенными в цвета, _
встречающиеся среди ячеек заданного диапазона
Dim rgCells As Range
Dim i As Integer
Dim intColorNumber As Integer ' Номер следующей кнопки _
выбора цвета
Dim lngCurColor As Long ' Анализируемый цвет
Dim fColorPresented As Boolean ' Кнопка с цветом _
lngCurColor уже существует
Dim ctrl As Control
Dim strCtrl As String
Dim fBackColor As Boolean ' = True, если ячейки _
идентифицируются по цвету
фона, _
' = False – по цвету шрифта
fBackColor = tglType.Value
On Error Resume Next
' Скрытие всех кнопок выбора цвета
For Each ctrl In Me.Controls
If Left(ctrl.Name, 8) = «cmbColor» Then
ctrl.Visible = False
End If
Next ctrl
On Error GoTo ErrRange
Set rgCells = Range(txtRange.Text)
On Error GoTo 0
' Получение цвета первой ячейки
If fBackColor = False Then
lngCurColor = rgCells.Cells(i).Font.Color
Else
lngCurColor = rgCells.Cells(i).Interior.Color
End If
' Назначения цвета первой ячейки первой кнопке
cmbColor1.BackColor = lngCurColor
cmbColor1.Visible = True
' Просмотр остальных ячеек и при нахождении новых цветов _
отображение кнопок, окрашенных в эти цвета
intColorNumber = 2
For i = 2 To rgCells.Cells.Count
fColorPresented = False
' Получение цвета i-й ячейки
If fBackColor = False Then
lngCurColor = rgCells.Cells(i).Font.Color
Else
lngCurColor = rgCells.Cells(i).Interior.Color
End If
' Проверка, отображается ли уже кнопка с таким цветом
For Each ctrl In Me.Controls
If Left(ctrl.Name, 8) = «cmbColor» And _
ctrl.Visible = True Then
If lngCurColor = ctrl.BackColor Then
' Кнопка с цветом i-й ячейки уже отображается
fColorPresented = True
Exit For
End If
End If
Next ctrl
If Not fColorPresented Then
' Кнопки с цветом lngCurColor еще нет – покажем ее
intColorNumber = intColorNumber + 1
strCtrl = «cmbColor» & intColorNumber
Me.Controls(strCtrl).BackColor = lngCurColor
Me.Controls(strCtrl).Visible = True
End If
Next i
Exit Sub
ErrRange:
' Обработка ошибок при работе с диапазоном
If txtRange.Text = "" Then
MsgBox «Введите адрес диапазона суммирования», _
vbCritical, «Внимание!»
Else
MsgBox «Введен некорректный адрес диапазона суммирования», _
vbCritical, «Ошибка!»
End If
' Установка курсора в поле ввода диапазона
txtRange.SetFocus
End Sub
После помещения кода, представленного в листинге 5.6, в модуль формы необходимо сформировать ее внешний вид, как показано на рис. 5.10.
Рис. 5.10. Пользовательская форма
При работе с формой необходимо выполнить следующие действия (для присвоения значений свойствам используется панель VBA Properties (Свойства)):
• форме присвоить имя f rmColorCalc;
• двенадцати кнопкам (в правой верхней части формы) присвоить названия от cmbColorl до cmbColorl2;
• текстовому полю для указания диапазона суммирования присвоить следующее имя: txtRange;
• текстовому полю для указания адреса ячейки с результатом присвоить имя txtResCell;
• раскрывающемуся списку Другой присвоить имя cboOtherColor, а его свойству ColumnCount – значение 2;
• кнопке, расположенной справа от этого списка, присвоить имя cmbApplyColor;
• раскрывающемуся списку Тип вычислений присвоить имя cboCalcTypes, а его свойству ColumnCount – значение 2;
• флажку Проверять присвоить имя chkVarif у;
• элементу управления ToggleButton с надписью Шрифт присвоить имя tglType.
После произведенных действий можно легко заметить, что макросы в модуле формы – это обработчики событий соответствующих элементов управления.
Теперь создадим кнопку запуска программы на панели быстрого доступа, для чего выполним щелчок правой кнопкой мыши на этой панели и выберем команду контекстного меню Настройка панели быстрого доступа. В появившемся диалоговом окне (окно настройки Excel в режиме Настройка) в раскрывающемся списке Выбрать команды из выберем Макросы. При этом среди доступных команд дожна быть показана CalcColors, которую и нужно добавить на панель. На этом процесс создания программы можно считать завершенным.
Работа с программой
Для запуска созданной программы нажмем кнопку, которой назначен макрос CalcColors – в результате откроется окно, соответствующее пользовательской форме, которая приведена на рис. 5.10. Предварительно следует выделить обрабатываемый диапазон – в этом случае поле Диапазон суммирования будет заполнено автоматически. В противном случае в данном поле следует с клавиатуры ввести требуемый диапазон (например, А5: С15). С помощью параметра Признак суммирования определяется, какой цвет шрифта или заливки будет применяться в качестве критерия отбора. При этом справа в поле Выберите цвет отображается перечень цветов, входящих в обрабатываемый диапазон; для выбора достаточно щелкнуть кнопкой мыши на кнопке соответствующего цвета. В расположенном ниже поле Другой из раскрывающегося списка можно выбрать какой-либо другой цвет. Список включает в себя следующие варианты: Красный, Оранжевый, Желтый, Зеленый, Голубой, Синий, Фиолетовый, Белый, Черный. Справа от поля Другой расположена кнопка, при нажатии которой выбранный цвет будет применен.
В поле Адрес ячейки ввода формулы следует указать адрес ячейки, в которой будет показан результат расчетов.
Если установлен флажок Проверять, то будет включен «обратный фильтр». Иначе говоря, при установленном данном флажке в расчет принимаются те ячейки диапазона, которые не соответствуют указанному цвету. Например, если выбран красный цвет, то ячейки с красным шрифтом (заливкой) не будут приниматься в расчет.
В поле Тип вычислений из раскрывающегося списка выбирается требуемый вид операции. Возможен выбор одного из следующих вариантов:
• Сумма;
• Среднее;
• Максимум;
• Минимум;
• Количество ячеек;
• Сумма положительных (значений);
• Сумма отрицательных (значений);
• Количество непустых (ячеек);
• Количество непустых ненулевых (ячеек);
• Количество положительных (значений);
• Количество отрицательных (значений).
По умолчанию в поле Тип вычислений установлено значение Сумма.
Функция, которая создается в результате работы программы и результат применения которой отображается в ячейке, указанной в поле Адрес ячейки ввода формулы, выглядит примерно следующим образом:
=ColorCalc(«D14:F17»;255;0;0;0)
Эта формула включает в себя следующие элементы:
• ColorCalc – имя функции;
• D14:F17– обрабатываемый диапазон (можно ввести несколько диапазонов – в этом случае их следует указать через запятую);
• 255 – цвет, используемый в качестве критерия отбора (в рассматриваемом примере – красный);
• 0 (первый) – указывает на то, что параметру Признак суммирования установлено значение Шрифт (при выборе значения Заливка в формуле будет отображаться 1);
• 0 (второй) – указывает на операцию, выбранную в поле Тип вычислений (в данном случае – Сумма); соответствующие константы перечислены в начале модуля, содержащего код функции CalcColor;
• 0 (третий) – указывает, что в расчет принимаются данные, соответствующие выбранному цвету (если указано 1, значит, включен «обратный фильтр»; иначе говоря, в окне настройки параметров установлен флажок Проверять).
Формулы для подобных расчетов можно вводить и без использования пользовательской формы. Но при этом необходимо строго соблюдать правила передачи параметров в функцию ColorCalc.