Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
курсовая / Источники / excel_2010_professionalnoe_programmirovanie_na_vba_RuLit_Me_412629.pdf
Скачиваний:
4
Добавлен:
27.09.2025
Размер:
22.97 Mб
Скачать

334 Часть III. Visual Basic for Applications

же пользователь щелкнет на кнопке OK, то макрос продолжит выполняться. Строка On E r r o r Go То указывает на переход к стандартной обработке ошибки.

Проверка корректного выделения диапазона необязательна. Excel позаботится об этом вместо вас.

Предупреждение

Обязательно проверьте, включено ли обновление экрана при использовании метода InputBox для выделения диапазона. Если обновление экрана отключе­ но, вы не сможете выделить рабочий лист. Чтобы проконтролировать обновле­ ние экрана, в процессе выполнения макроса используйте свойство Screen- U p d a tin g объекта A p p lic a tio n .

Подсчет выделенных ячеек

Работая с макросом, который обрабатывает выделенный диапазон ячеек, можно ис­ пользовать свойство C o u n t, чтобы определить, сколько ячеек содержится в выделенном (или любом другом) диапазоне. Например, следующий оператор демонстрирует окно со­ общения, которое отображает количество ячеек в текущем выделенном диапазоне:

MsgBox S e le c tio n . Count

Предупреждение

Поскольку размер рабочего листа в Excel 2010 был сильно увеличен, свойст­ во Count может генерировать ошибку. Свойство Count использует тип дан­ ных Long, поэтому наибольшее значение, которое может храниться здесь, равно 2147483647. Например, если пользователь выделил 2048 столбцов (2147483648 ячеек), свойство Count сгенерирует ошибку. К счастью, Microsoft добавила новое свойство, называемое C ountLarge. Оно использует тип данных Double, причем максимальная величина обрабатываемого значения составляет 1,79+Ел308.

В большинстве случаев можно воспользоваться свойством Count. Если же нужно подсчитать очень много ячеек (например, все ячейки в рабочем лис­ те), используйте свойство CountLarge вместо Count.

Если активный лист содержит диапазон d a ta , то следующий оператор присваивает количество ячеек в диапазоне d a ta переменной с названием Се11 Count.

C e llC o u n t = Range( " d a ta " ) . Count

Вы можете также определить, сколько строк или столбцов содержится в диапазоне. Следующее выражение вычисляет количество столбцов в выделенном в данный момент диапазоне:

S e le c tio n . Colum ns. Count

Для определения количества строк в диапазоне вы также можете использовать свой­ ство Rows. Следующий оператор пересчитывает количество строк в диапазоне с назва­ нием d a ta и присваивает это количество переменной RowCount.

RowCount = Range( " d a ta " ) . Rows. Count

Глава 11. Приемы и методы программирования на VBA

335

Определение типа выделенного диапазона

В Excel можно выделить следующие типы диапазонов:

отдельная ячейка;

смежный диапазон ячеек;

один или более полных столбцов;

одна или более полных строк;

весь рабочий лист;

комбинация перечисленных выше типов (называемая множественным выделением).

Врезультате, когда процедура VBA обрабатывает выделенный диапазон, нельзя ис­ ходить из каких-либо предположений о типе этого диапазона.

Вслучае множественного выделения объект Range включает несмежные области. Чтобы определить, является ли выделение множественным, используется метод A reas, возвращающий коллекцию A reas. Эта коллекция представляет все диапазоны в множе­ ственном выделении.

Чтобы определить, содержатся ли в выделенном диапазоне множественные области, примените выражение, подобное следующему:

NumAreas = S e le c tio n .A re a s . Count

Если переменная NumAreas содержит значение, которое больше единицы, то выде­ лениеявляется множественным.

Ниже приводится код функции АгеаТуре, которая возвращает текстовую строку, описывающую тип выделенного диапазона.

Function АгеаТуре (RangeArea As Range) As S trin g

'Возвращает тип диапазона Select Case True

Case RangeArea. C e lls . C ountLarge = 1

АгеаТуре

=

"Ячейка"

 

 

Case RangeArea. C ountLarge

=

C e lls . CountLarge

АгеаТуре

=

"Рабочий лист"

 

Case RangeArea. Rows. Count

=

C e lls . Rows. Count

АгеаТуре

=

"Столбец"

 

 

Case RangeArea. Colum ns. Count

= C e lls . Colum ns. Count

АгеаТуре

=

"С трока"

 

 

Case E lse

 

 

 

 

АгеаТуре

=

"Блок"

 

 

End S e le ct

End Function

Эта функция получает в качестве аргумента объект Range и возвращает одну из пяти строк, описывающих данную область: ячейку (C ell), рабочий лист (W orksheet), столбец (Column), строку (Row) или блок (Block). Функция использует конструкцию S e le c t Case для определения одного из четырех выражений сравнения, которое имеет значение True. Например, если диапазон состоит из одной ячейки, функция возвращает значение ячейка. Если количество ячеек в диапазоне равно количеству ячеек в рабочем листе, то функция возвращает рабочий лист. Если количество строк в диапазоне равно количест­ ву строк в рабочем листе, функция возвращает столбец. Если количество столбцов в диа­ пазоне равно количеству столбцов на рабочем листе, функция возвращает строка. Если ни одно из выражений Case не равно True, то функция возвращает строку блок.

338

 

 

Часть III. Visual Basic for Applications

I f

c e ll.V a lu e < 0 Then

=

RGB(255, 0, 0)

 

c e l l . I n t e r i o r . C o lo r

E lse

=

xlN one

 

c e l l . I n t e r i o r . C o lo r

End I f

 

 

N ext

c e ll

 

 

End Sub

 

 

 

Процедура C o lo rN e g a tiv e 2 представляет собой результат переработки предыдущей процедуры, но все же она недостаточно эффективна, поскольку обрабатывает пустые ячей­ ки. Поэтому появилась третья версия, C o lo rN e g a tiv e 3 , которая немного больше по размеру, но намного эффективнее. В ней используется метод S p e c ia lC e lls , с помощью которого генерируются два поднабора выделенной области: один поднабор (C o n s ta n t- C e lls ) включает ячейки, которые содержат исключительно числовые константы; второй поднабор (F o rm u la C e lls ) включает ячейки, содержащие числовые формулы. Обработка ячеек в этих поднаборах осуществляется с помощью двух конструкций F o r E ach -N ext. Благодаря тому, что исключается обработка пустых и нетекстовых ячеек, скорость выпол­ нения макроса существенно увеличивается.

Sub

C o lo rN e g a tiv e 3 ()

 

 

 

 

 

1

О пределяет красный

цвет

для я ч еек

с отрицательными значениями

 

Dim

F o rm u la C e lls As

Range,

C o n s ta n tC e lIs As

Range

 

Dim

c e ll As Range

 

<>

"Range"

Then E x it

Sub

 

I f

TypeN am e(S election)

 

A p p lic a tio n . S creenU pdating

= F alse

 

 

'Создание поднаборов на основе исходного выделения

 

On

E rro r

Resume

N ext

 

 

 

 

 

 

Set

F o rm u la C e lls

=

S e le c tio n . S p e c ia lC e lls (x lF o rm u la s , xlNum bers)

 

Set

C o n s ta n tC e lls

=

S e le c tio n . S p e c ia lC e lls (x lC o n s ta n ts , INumbers)

 

On

E rro r

GoTo 0

 

 

 

 

 

 

 

'

О бработка

я ч еек

формулы

 

Then

 

 

 

I f

Not

F o rm u la C e lls

Is N o th in g

 

 

 

 

For

Each c e ll

In

F o rm u la C e lls

 

 

 

 

I f

c e ll.V a lu e

< 0 Then

=

RGB(255,

0,

0)

 

 

 

 

c e l l . I n t e r i o r . C o lo r

 

 

E lse

 

 

 

=

xlN one

 

 

 

 

End

c e l l . I n t e r i o r . C o lo r

 

 

 

 

I f

 

 

 

 

 

 

 

 

End

N ext

c e ll

 

 

 

 

 

 

 

 

I f

 

 

 

 

 

 

 

 

 

'

О бработка

я ч е е к , содержащих

константы

 

 

 

I f

Not

C o n s ta n tC e lls

Is N o th in g

Then

 

 

 

 

For

Each c e ll

In

C o n s ta n tC e lls

 

 

 

 

I f

c e ll.V a lu e

< 0 Then

=

RGB(255,

0,

0)

 

 

 

 

c e l l . I n t e r i o r . C o lo r

 

 

E lse

 

 

 

=

xlNone

 

 

 

 

 

 

c e l l . I n t e r i o r . C o lo r

 

 

 

 

End I f

 

 

 

 

 

 

 

 

 

N ext

c e ll

 

 

 

 

 

 

 

 

End I f

 

 

 

 

 

 

 

 

 

End Sub

 

 

 

 

 

 

 

 

 

Примечание

Оператор On E r ro r необходим, поскольку метод S p e c ia lC e lls генерирует ошибку, если не находит в диапазоне ячеек указанного типа.