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

366

Часть III. Visual Basic for Applications

Объект

A p p lic a tio n

Объект Workbook Объект W orksheet

Объект Range

На языке объектно-ориентированного программирования родителем объекта Range (Диапазон) является объект Worksheet (Рабочий лист), в котором он содержится. Ро­ дителем объекта Worksheet является объект Workbook (Рабочая книга), содержащий этот рабочий лист, а родителем объекта Workbook выступает объект Application (приложение, т.е. Excel).

Как можно применить эту информацию на практике? Проанализируем функцию VBA SheetName, показанную ниже. Данная функция получает один аргумент (диапазон) и возвращает имя рабочего листа, который содержит указанный диапазон. При этом ис­ пользуется свойство Parent объекта Range. Свойство Parent возвращает объект, а именно — объект, содержащий объект Range.

F u n c tio n S heetN am e(ref) As S trin g

SheetName = r e f . Parent.Name

End F u n c tio n

Функция WorkbookName возвращает название рабочей книги для конкретной ячей­ ки. Обратите внимание, что эта функция использует свойство Parent дважды. Первое свойство Parent возвращает объект Worksheet, а второе свойство Parent возвраща­ ет объект Workbook.

F u n c tio n W orkbookNam e(ref) As S trin g

WorkbookName = r e f . P a re n t. P a re n t.Name

End F u n c tio n

Функция AppName, показанная далее, переносит это упражнение на следующий ло­ гический уровень, обращаясь к свойству Parent трижды. Такая функция возвращает имя объекта Application для заданной ячейки. Указанная функция всегда будет воз­ вращать значение Microsoft Excel.

F u n c tio n AppNam e(ref) As S trin g

AppName = r e f . P a re n t. P a re n t. P a re n t.Name

End F u n c tio n

Подсчет количества ячеек между двумя значениями

Функция CountBetween возвращает количество значений в диапазоне (первый ар­ гумент), которые попадают в область, заданную вторым и третьим аргументами.

F u n c tio n CountBetween(InRange,

num l,

num2)

As

Long

 

 

'

Подсчитывает количество значений

между

numl

и num2

 

 

 

W ith

A p p lic a tio n .W o rk s h e e tF u n c tio n

 

 

 

 

 

I f

numl <= num2

Then

 

 

 

 

 

 

 

 

 

CountBetween

= . C o u n tIf(InR ange,

">="

& numl)

-

_

 

 

. C o u n tIf(InR ange,

">"

& num2)

 

 

 

 

 

E lse

= . C o u n tIf(InR ange,

">="

& num2)

-

_

 

 

CountBetween

 

 

. C o u n tIf(InR ange,

">"

& num l)

 

 

 

 

 

End I f

 

 

 

 

 

 

 

 

End

End W ith

 

 

 

 

 

 

 

 

F u n c tio n

 

 

 

 

 

 

 

 

Обратите внимание, что эта функция вызывает функцию Excel СЧЁТЕСЛИ (COUNTIF). По сути, функция CountBetween является “оболочкой”, которая может упростить формулы.

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

367

Примечание

Обратите внимание, что функция счётесли появилась в Excel 2007. Поэтому приведенный выше код не будет работать с предыдущими версиями Excel.

Ниже приведен пример формулы, использующей функцию C ou n tB e tw e e n . Форму­ ла возвращает количество ячеек в диапазоне А1:А100, которое больше или равно 10 и меньше или равно 20.

=CountBetween (A l :A l 00 ,10 , 20)

Применяйте эту функцию VBА, чтобы не вводить следующую длинную формулу:

«СЧЁТЕСЛИ (А1:А100, "> =10") -СЧЁТЕСЛИ ( A l:А100 , ">20")

Определение последней непустой ячейки

встолбце или в строке

Вэтом разделе будут рассмотрены две полезные функции: L a s tln C o lu m n , которая возвращает содержимое последней непустой ячейки в столбце, и L a s tln R o w , которая возвращает содержимое последней непустой ячейки в строке. В качестве единственного аргумента эти функции используют диапазон. Причем в качестве диапазона может при­ меняться как весь столбец (функция L a s tln C o lu m n ), так и вся строка (функция LastlnRow). Если же в качестве аргумента не используется вся строка либо весь стол­

бец, задействуется строка или столбец, в котором находится верхняя левая ячейка диапа­ зона. Например, следующая формула возвращает последнее значение в столбце В:

=LastInColumn (В5)

Следующая формула возвращает последнее значение в строке 7:

=LastInRow (С7 :D9)

Ниже представлен код функции L a s tln C o lu m n .

Function L a s tln C o lu m n (rn g As Range)

1 Возвращает содержимое последней непустой ячейки столбца

Dim L a s tC e ll

As Range

 

 

A p p lic a tio n . V o la tile

 

 

With rn g .P a re n t

 

rng.C olum n)

W ith

. C e lls ( . Rows. C ou nt,

I f

Not

Is E m p ty ( . V alue)

Then

 

Lastln C o lum n

= .V alue

E ls e lf

Is E m p ty ( . E n d (x lU p )) Then

 

L astln C o lum n

= ""

 

E lse

 

= . E n d (x lU p ).V a lu e

 

L astlnC olum n

End I f

 

 

 

End W ith

End W ith

End F unction

Эта функция довольно сложная, поэтому ниже приведено несколько замечаний, кото­ рые помогут вам в ней разобраться.

Оператор A p p lic a t io n . V o l a t i l e вызывает выполнение функции всякий раз, когда пересчитываются формулы на рабочем листе.

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

368

Часть III. Visual Basic for Applications

Ссылка r n g . Column возвращает номер столбца левой верхней ячейки в аргумен­ те rng.

Благодаря ссылке r n g . P a re n t функция работает корректно, даже если аргумент

rn g ссылается на другой лист или рабочую книгу.

Метод End (с аргументом xlUp) эквивалентен переходу к последней ячейке столбца и нажатию <End> и <Т>.

Функция IsEm pty проверяет, пуста ли ячейка. Если ячейка пуста, функция воз­ вращает пустую строку. Без этого оператора пустой ячейке соответствовал бы ре­ зультат 0.

Ниже представлен код функции LastlnRow . Она подобна функции LastlnColum n.

F u n c tio n L a stln R o w (rn g

As

Range)

1

Возвращает содержимое

последней непустой ячейки в строке

A p p lic a tio n . V o la tile

 

 

 

W ith r n g . P a ren t

 

 

 

 

W ith

. C e lls (rn g .R o w ,

. Columns. C ount)

 

I f

Not Is E m p ty ( .V alue ) Then

 

 

 

LastlnR ow

=

.V alue

 

E ls e lf Is E m p ty ( .E n d (x lT o L e ft)) Then

 

 

 

LastlnR ow

=

""

 

 

E lse

 

 

 

 

End

LastlnR ow

=

. E n d (x lT o L e ft) .V alue

 

I f

 

 

 

 

End

W ith

 

 

 

End

End W ith

 

 

 

 

F u n c tio n

 

 

 

 

Соответствует ли строка шаблону

Функция IsL ik e довольно проста (и очень полезна). Она возвращает значение ИС­ ТИНА, если строка соответствует заданному шаблону.

Код функции IsL ik e показан далее. Она представляет собой “оболочку”, позво­ ляющую использовать в формулах мощный оператор VBA Like.

F u n c tio n

Is L ik e ( te x t

As S trin g , p a tte r n As

S trin g )

As Boolean

1

Возвращает ИСТИНА,

если первый оператор

подобен

второму

End

Is L ik e

= te x t L ik e

p a tte r n

 

 

F u n c tio n

 

 

 

Функция IsL ik e принимает два аргумента:

t e x t — текстовая строка или ссылка на ячейку, содержащую текстовую строку;

p a tte r n — строка, содержащая групповые символы согласно следующему списку.

Символ вшаблоне

Соответствие втексте

•?

Любой отдельный символ

 

Нуль и более символов

#

Любая отдельная цифра (о - 9)

[ список_сим волов]

Любой отдельный символ из перечня список_символов

[ ! список_сим волов] Любой отдельный символ, не принадлежащий перечню список_ символов

tElem ent
E x t r a c -

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

369

Представленная ниже формула возвращает ИСТИНА, так как * соответствует любому количеству символов. Она возвращает ИСТИНА, если первый аргумент — любой текст, начинающийся с д.

=IsLike ( " g u ita r " , "д * " )

Следующая формула возвращает ИСТИНА, так как ? соответствует любому отдельно­ мусимволу. Если бы первым аргументом функции был 1Unit 12", то функция возвра­ щалабы ЛОЖЬ.

=IsLike ( "U n it 1" , " U n it? " )

Показанная далее формула возвращает ИСТИНА, так как первый аргумент является одним из символов списка во втором аргументе.

= IsL ike ( " а " , " [a e io u ]")

Следующая формула возвращает ИСТИНА, если ячейка А1 содержит один из симво­ лов: а, е, i, о, и, А, Е, I, О, U. При использовании функции ПРОПИСН (UPPER) в аргу­ менте функция становится нечувствительной к регистру.

=IsLike (ПРОПИСН (А 1 ), ПРОПИСН( " [a e io u ]" ) )

Представленная далее формула возвращает ИСТИНА, если в ячейке А1 находится зна­ чение, начинающееся с 1 и состоящее ровно из трех цифр (т.е. любое целое число от 100 до 199).

= Is L ik e (A l/ "1##")

Возвращение из строки n-го элемента

E x tr a c t E le m e n t — специальная функция рабочего листа (ее можно также вызвать из процедуры VBА), которая помогает извлечь элемент из текстовой строки. Например, если ячейка содержит следующий текст, вы можете использовать функцию

для извлечения любых подстрок между дефисами.

123-456-789-0133-8844

Представленная далее формула, например, возвращает 0133, т.е. четвертый элемент в строке. Дефис (-) используется в строке как разделитель.

=E xtractE lem ent("1 23 -4 56 -7 8 9 -01 3 3-8844" ,4 , " - " )

Функция E x t r a c t E le m e n t принимает три аргумента:

t x t — текстовая строка, из которой извлекается подстрока (это может быть сим­

вольная строка или ссылка на ячейку);

п — целое число, представляющее номер извлекаемого элемента;

S e p a ra to r — отдельный символ, используемый как разделитель.

Примечание

Если в качестве символа-разделителя задать пробел, то несколько пробе­ лов будут рассматриваться как один, что не всегда соответствует требова­ ниям. Если п превышает количество элементов в строке, функция возвра­ щает пустую строку.

Ниже приводится код VBA для функции E x t r a c t

E le m e n t.

Function E x tra c tE le m e n t(T x t, n, S e p a ra to r)

As S trin g

1 Возвращает n -й элемент текстовой строки,

где

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

371

(rng) и операция (ор). В зависимости от значения аргумента ор функция возвращает зна­ чение, вычисленное с помощью одной из следующих функций Excel: СРЗНАЧ (AVERAGE), СЧЁТ (COUNT), МАКС (МАХ), МЕДИАНА (MEDIAN), МИН (MIN), МОД (MODE), СТАНДОТКЛОН (STDEV), СУММ (SUM) или ДИСП (VAR).

Например, можно использовать эту функцию на рабочем листе следующим образом:

=S tatFunction ( B l: В24 , А24)

Результат выполнения формулы зависит от содержимого ячейки А24, которое пред­ ставлено строкой: СРЗНАЧ (AVERAGE), СЧЁТ (COUNT), МАКС (МАХ) и т.д. Можете при­ менить этот прием в других типах функций.

Function S ta tF u n c tio n (rn g , op)

S e le ct

Case UCase(op)

 

Case

"СУММ"

=

W o rksh e e tF u n ctio n . Sum(rng)

S ta tF u n c tio n

Case

"СРЗНАЧ"

 

 

S ta tF u n c tio n

=

W o rksh e e tF u n ctio n .A ve ra g e (rn g )

Case

"МЕДИАНА"

 

 

S ta tF u n c tio n

=

W o rk s h e e tF u n c tio n . M edian(rng)

Case

"МОД"

=

W o rksh e e tF u n ctio n . M ode(rng)

S ta tF u n c tio n

Case

"СЧЁТ"

 

 

S ta tF u n c tio n

=

W o rk sh e e tF u n ctio n .C o u n t(rn g )

Case

"MAKC"

=

W o rksh e e tF u n ctio n .M a x(rn g )

S ta tF u n c tio n

Case

"МИН"

=

W o rk s h e e tF u n c tio n .M in (rn g )

S ta tF u n c tio n

Case

"ДИСП"

 

 

S ta tF u n c tio n

=

W o rk s h e e tF u n c tio n .V a r(rn g )

Case

"СТАНДОТКЛОН"

 

S ta tF u n c tio n

=

W o rk s h e e tF u n c tio n . S tD ev(rng)

Case

E lse

=

C V E rr(xlE rrN A )

S ta tF u n c tio n

End S e le c t

 

 

End F un ction

Функция SheetOf fset

В Excel ограничена поддержка “трехмерных рабочих книг”. Например, чтобы со­ слаться на другой рабочий лист в книге, включите в формулу имя рабочего листа. Данная проблема будет оставаться незначительной до тех пор, пока вы не попытаетесь скопиро­ вать формулу из одного листа в другой. Скопированные формулы продолжают ссылаться на первоначальное имя рабочего листа, и ссылки на листы не изменяются, как это проис­ ходит в реальной трехмерной рабочей книге.

Пример, рассмотренный в этом разделе, представляет функцию VBA SheetO f f s e t , которая обеспечивает установку относительных ссылок на рабочие листы. Например, можно сослаться на ячейку А1 предыдущего рабочего листа с помощью такой формулы:

=SheetOf f s e t (-1 , A l)

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

Ниже приведен код VBA функции S h e e tO ffse t.