Excel. Трюки и эффекты — страница 33 из 36

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).

Листинг 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.

Листинг 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.

Глава 6