Выбрать главу

For Each aCell In Worksheets("2").Range("A5;B10")

If IsNumeric(aCell) Then

Select Case aCell

Case 5 to 10

aCell.Font.Underline = xlUnderlineStyleSingle

Case 10 to 20

aCell.Font.Italic = True

Case Is > 20

aCell.Font.Bold = True

End Select

End If

Next

Работа с выделениями

Прежде чем изменить значение или формат ячейки или нескольких ячеек, пользователь должен их выделить. Однако в VBA выделение ячеек не требуется, так как для идентификации ячеек, над которыми должны проводиться определенные действия, можно использовать объекты Range. Но в VBA есть инструменты, связанные с выделением; они используются для реализации двух возможностей - код способен определить, какие ячейки выделены пользователем, и код может показать пользователю место на рабочем листе, где происходит что-то важное.

Во многих случаях пользовательский код должен воздействовать на выбранные ячейки, как это делают встроенные команды Excel. Для доступа к выделенному пользователем диапазону используется свойство Selection (Выделение) объекта Application или Window. Свойство Selection объекта Application возвращает диапазон, выделенный на рабочем листе, активном в данный момент. Следующие два оператора идентичны:

Application.Selection.Value = 20

Selection.Value =2 0

Для того чтобы удостовериться в том, что ссылка всегда относится к определенному окну, независимо оттого, какое окно активно в текущий момент, необходимо использовать свойство окна Selection. В следующем примере продемонстрирована данная техника; также здесь показано, как установить объектную ссылку на диапазон, представляющий текущее выделение для повторного использования того же диапазона в дальнейшем:

Dim Sel Range As Range

Set SelRange = Windows("Инвентаризация игрушек.xls">.Selection

With SelRange

.CheckSpelling

.AutoFit

.Copy

End With

Когда VBA-программа вносит изменения в рабочий лист и необходимо, чтобы пользователь их заметил, следует воспользоваться методом Select (Выделить) для перемещения выделения на нужный диапазон, диаграмму или что-либо другое. Метод Select можно применять фактически к любому существующему в Excel объекту, в том числе к объектам Chart (Диаграмма) и всем их компонентам (каждая часть диаграммы является отдельным VBA-объектом). к объектам Shape (Форма) и, конечно же, к объектам Range.

Для выделения диапазона необходимо сначала активизировать рабочий лист, на котором диапазон находится, а затем использовать метод Select для объекта Range, как показано в данном примере:

With Worksheets(" ")

.Activate .Range("Разбитые сердца").Select

End With

Кстати, метод Select для объектов Worksheet, очевидно, не выполняет ничего, кроме активизации указанного рабочего листа, и не изменяет в нем существующее выделение. Другими словами, он эквивалентен методу рабочего листа Activate. Подобным образом методы Activate и Select можно использовать для активизации листа диаграммы, но ни один из методов в действительности не выделяет диаграмму. Вот пример;

Chart s("Места жительства клиентов").Select

Для того чтобы выделить компонент диаграммы или внедренную диаграмму, используйте метод Select для интересующего вас объекта.

Чтобы сделать ячейку активной для ввода, к данной ячейке используется метод Activate (Активизировать) объекта Range. Если активизированная ячейка находится в пределах текущего выделения, весь диапазон остается выделенным. Именно таким образом работает следующий пример:

Worksheets("НичегоНеДелайДоМоегоУказания").Activate

Range("A1:E7").Select Range("C4").Activate

Если активизированная ячейка находится за пределами выделения, оно перемещается на активизированную ячейку.

Код для работы с выделенными ячейками, вероятно, приведет к возникновению ошибки, если его применить к диаграмме. Вот почему, прежде чем выполнять какие-либо операции с выделением, обычно следует убедиться, что выделение содержит тот тип объектов, который ожидается в коде. VBA-функция TypeName возвращает строку, содержащую тип объекта

выделения. С помощью структур If. . .Then или Case. . .Select можно определить, какое из возможных действий проводить над выделенным объектом.

В приведенном ниже примере выражение TypeName ( Selection) в операторе Select (вторая строка кода) возвращает строку, содержащую тип объекта текущего выделения. Данная строка затем проверяется рядом операторов Case, является ли выделение диапазоном (в таком случае его значение устанавливается равным 2 001), областью диаграммы (в таком случае устанавливается красный цвет выделения), когда же выделение не сделано, пользователь видит сообщение об отсутствии выделения. Также предусмотрен вывод соответствующего сообщения для случая, когда выделение не принадлежит ни одному из перечисленных типов:

With Selection

Select Case TypeName(Selection)

Case "Range"

.Value = 2001

Case "ChartArea"

.Interior.Colorlndex = 3 ‘ 3 = bright red

Case "Nothing"

MsgBox "Ничего не выделенно"

Case Else

MsgBox "Невозможно определить тип выделения!"

End Select

End With

Программирование пользовательских функций

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

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

Написание пользовательских функций рабочего листа

Пользовательские функции Excel- это просто обычные процедуры VBA-функций. Детально с процедурах функций и их синтаксисе можно узнать из главы 6. Если сказать коротко, процедура функции начинается с декларации ее имени и заканчивается оператором End Function. Иногда внутри может потребоваться оператор, присваивающий значение имени функции, данное значение как раз и возвращает функция. В простейшем примере, приведенном здесь, именно это и демонстрируется:

Function MemoryAvailable ()

MemoryAvailable = Application.MemoryFree

End Function

Данная функция просто возвращает количество памяти в байтах, доступных в текущее время для Excel. Заметьте, что, поскольку функция получает данные о количестве доступной памяти из системы, она не имеет аргументов. Ниже приведен пример немного более сложной функции, принимающей аргументы:

Function CheckForvalue(aRange,Value)

For Each objCell In aRange

CheckForValue = False 'по умолчанию возвращается значение

False

If objCell.Value = Value Then

CheckForValue = True

Exit For